def test_build_choice(): data = in_snip(['t1', 1, 0, [0x0201, ['sig']], 1111, EndOfSmlMsg]) builder = SmlMessageBuilder() obj = builder.build(data, {SmlCloseResponse: SmlCloseResponseBuilder()}) assert obj.transaction_id == 't1' assert obj.group_no == 1 assert obj.abort_on_error == 0 assert isinstance(obj.message_body, SmlCloseResponse) assert obj.message_body.global_signature == 'sig' assert obj.crc16 == 1111 class PatchedBuilder(SmlObjBuilder): BUILDS = SmlCloseResponse def build(self, obj: list, classes): ret = super().build(obj, classes) ret.global_signature += '_patched' return ret data = in_snip(['t1', 1, 0, [0x0201, ['sig']], 1111, EndOfSmlMsg]) obj = builder.build(data, {SmlCloseResponse: PatchedBuilder()}) assert obj.transaction_id == 't1' assert obj.group_no == 1 assert obj.abort_on_error == 0 assert isinstance(obj.message_body, SmlCloseResponse) assert obj.message_body.global_signature == 'sig_patched' assert obj.crc16 == 1111
def test_sml_time(): assert build_time(None) is None assert build_time(in_snip([1, 253], pack_top=False)) == 253 assert build_time(in_snip([2, 1609466461], pack_top=False)) == datetime(2021, 1, 1, 2, 1, 1) assert build_time(in_snip([3, [1609466461, 120, 0]], pack_top=False)) == datetime(2021, 1, 1, 4, 1, 1) assert build_time(in_snip([3, [1622509261, 120, 60]], pack_top=False)) == datetime(2021, 6, 1, 4, 1, 1) assert build_time(in_snip([3, [1622509261, 120, 30]], pack_top=False)) == datetime(2021, 6, 1, 3, 31, 1)
def test_build_entry(): builder = SmlListEntryBuilder() obj = builder.build( in_snip(['0100010800ff', None, None, None, None, '76616c', None]), {SmlListEntry: builder}) assert obj.obis == '0100010800ff' assert obj.value == 'val'
def test_build_entry_list(): data = in_snip([ None, 'server', None, None, [['0100010800ff', None, None, None, None, '76616c31', None], ['0100010801ff', None, None, None, None, '76616c32', None]], None, None ]) builder = SmlGetListResponseBuilder() obj = builder.build( data, {SmlListEntry: SmlListEntryBuilder()}) # type: SmlGetListResponse assert obj.sever_id == 'server' assert obj.val_list[0].obis == '0100010800ff' assert obj.val_list[0].value == 'val1' assert obj.val_list[1].obis == '0100010801ff' assert obj.val_list[1].value == 'val2' class PatchedBuilder(SmlListEntryBuilder): BUILDS = SmlListEntry def build(self, obj: list, classes): ret = super().build(obj, classes) ret.obis += '_patched' return ret obj = builder.build( data, {SmlListEntry: PatchedBuilder()}) # type: SmlGetListResponse assert obj.sever_id == 'server' assert obj.val_list[0].obis == '0100010800ff_patched' assert obj.val_list[0].value == 'val1' assert obj.val_list[1].obis == '0100010801ff_patched' assert obj.val_list[1].value == 'val2'
def test_open_response(): r = SmlOpenResponseBuilder().build( in_snip([None, None, 'ab', 'cd', None, 1]), {}) assert r.format_msg() == '<SmlOpenResponse>\n' \ ' codepage : None\n' \ ' client_id : None\n' \ ' req_file_id: ab\n' \ ' server_id : cd\n' \ ' ref_time : None\n' \ ' sml_version: 1\n'
def test_list_entry(): data = in_snip([ None, 'server', None, None, [['0100010800ff', None, None, None, None, '76616c31', None], ['0100010801ff', None, None, None, None, '76616c32', None]], None, None ]) builder = SmlGetListResponseBuilder() obj = builder.build(data, {SmlListEntry: SmlListEntryBuilder()}) assert obj.format_msg() == '<SmlGetListResponse>\n' \ ' client_id : None\n' \ ' sever_id : server\n' \ ' list_name : None\n' \ ' act_sensor_time : None\n' \ ' val_list:\n' \ ' <SmlListEntry>\n' \ ' obis : 0100010800ff (1-0:1.8.0*255)\n' \ ' status : None\n' \ ' val_time : None\n' \ ' unit : None\n' \ ' scaler : None\n' \ ' value : val1\n' \ ' value_signature: None\n' \ ' -> (Zählerstand Total)\n' \ ' <SmlListEntry>\n' \ ' obis : 0100010801ff (1-0:1.8.1*255)\n' \ ' status : None\n' \ ' val_time : None\n' \ ' unit : None\n' \ ' scaler : None\n' \ ' value : val2\n' \ ' value_signature: None\n' \ ' -> (Zählerstand Tarif 1)\n' \ ' list_signature : None\n' \ ' act_gateway_time: None\n'
def test_close_response(): r = SmlCloseResponseBuilder().build(in_snip(['my_sig']), {}) assert r.format_msg() == '<SmlCloseResponse>\n' \ ' global_signature: my_sig\n'
def test_exception(): with pytest.raises(UnsupportedType) as e: build_time([in_snip(5), in_snip(55)]) assert e.value.type == 5 assert str(e.value) == 'Unsupported type 0x05'