tplinkrouterc6u 5.0.3__py3-none-any.whl → 5.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
test/test_client_ex.py ADDED
@@ -0,0 +1,339 @@
1
+ from unittest import main, TestCase
2
+ from macaddress import EUI48
3
+ from ipaddress import IPv4Address
4
+ from tplinkrouterc6u import (
5
+ TPLinkEXClient,
6
+ Connection,
7
+ Firmware,
8
+ Status,
9
+ Device,
10
+ IPv4Reservation,
11
+ IPv4DHCPLease,
12
+ IPv4Status,
13
+ ClientException,
14
+ )
15
+
16
+
17
+ class TestTPLinkEXClient(TestCase):
18
+ def test_firmware(self) -> None:
19
+ response = ('{"data":{"hardwareVersion":"EX511 v2.0 00000000","modelName":"EX511",'
20
+ '"softwareVersion":"0.7.0 3.0.0 v607e.0 Build 240930 Rel.11206n","stack":"0,0,0,0,0,0"},'
21
+ '"operation":"go","oid":"DEV2_DEV_INFO","success":true}')
22
+
23
+ class TPLinkEXClientTest(TPLinkEXClient):
24
+ self._token = True
25
+
26
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
27
+ return 200, response
28
+
29
+ client = TPLinkEXClientTest('', '')
30
+ result = client.get_firmware()
31
+
32
+ self.assertIsInstance(result, Firmware)
33
+ self.assertEqual(result.hardware_version, 'EX511 v2.0 00000000')
34
+ self.assertEqual(result.model, 'EX511')
35
+ self.assertEqual(result.firmware_version, '0.7.0 3.0.0 v607e.0 Build 240930 Rel.11206n')
36
+
37
+ def test_get_status_with_5G(self) -> None:
38
+
39
+ DEV2_ADT_LAN = ('{"data":[{"MACAddress":"a0:28:84:de:dd:5c","IPAddress":"192.168.4.1","stack":"1,0,0,0,0,0"}],'
40
+ '"operation":"gl","oid":"DEV2_ADT_LAN","success":true}')
41
+ DEV2_ADT_WAN = ('{"data":[{"enable":"1","MACAddr":"BF-75-44-4C-DC-9E","connIPv4Address":"192.168.30.55",'
42
+ '"connIPv4Gateway":"192.168.30.1","stack":"1,0,0,0,0,0"}],"operation":"gl",'
43
+ '"oid":"DEV2_ADT_WAN","success":true}')
44
+ DEV2_ADT_WIFI_COMMON = ('{"data":[{"primaryEnable":"1","guestEnable":"0","stack":"1,0,0,0,0,0"},'
45
+ '{"primaryEnable":"0","guestEnable":"1","stack":"2,0,0,0,0,0"}],"operation":"gl",'
46
+ '"oid":"DEV2_ADT_WIFI_COMMON","success":true}')
47
+ DEV2_HOST_ENTRY = ('{"data":[{"active":"1","X_TP_LanConnType":"0","physAddress":"66-E2-02-BD-B5-1B",'
48
+ '"IPAddress":"192.168.30.10","hostName":"host1","stack":"1,0,0,0,0,0"},'
49
+ '{"active":"1","X_TP_LanConnType":"1","physAddress":"F4-A3-86-2D-41-B5",'
50
+ '"IPAddress":"192.168.30.11","hostName":"host2","stack":"2,0,0,0,0,0"}],"operation":"gl",'
51
+ '"oid":"DEV2_HOST_ENTRY","success":true}')
52
+ DEV2_MEM_STATUS = ('{"data":{"total":"192780","free":"78400","stack":"0,0,0,0,0,0"},"operation":"go",'
53
+ '"oid":"DEV2_MEM_STATUS","success":true}')
54
+ DEV2_PROC_STATUS = ('{"data":{"CPUUsage":"47","stack":"0,0,0,0,0,0"},"operation":"go",'
55
+ '"oid":"DEV2_PROC_STATUS","success":true}')
56
+
57
+ class TPLinkEXClientTest(TPLinkEXClient):
58
+ self._token = True
59
+
60
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
61
+ if 'DEV2_ADT_LAN' in data_str:
62
+ return 200, DEV2_ADT_LAN
63
+ elif 'DEV2_ADT_WAN' in data_str:
64
+ return 200, DEV2_ADT_WAN
65
+ elif 'DEV2_ADT_WIFI_COMMON' in data_str:
66
+ return 200, DEV2_ADT_WIFI_COMMON
67
+ elif 'DEV2_HOST_ENTRY' in data_str:
68
+ return 200, DEV2_HOST_ENTRY
69
+ elif 'DEV2_MEM_STATUS' in data_str:
70
+ return 200, DEV2_MEM_STATUS
71
+ elif 'DEV2_PROC_STATUS' in data_str:
72
+ return 200, DEV2_PROC_STATUS
73
+ raise ClientException()
74
+
75
+ client = TPLinkEXClientTest('', '')
76
+ status = client.get_status()
77
+
78
+ self.assertIsInstance(status, Status)
79
+ self.assertEqual(status.wan_macaddr, 'BF-75-44-4C-DC-9E')
80
+ self.assertIsInstance(status.wan_macaddress, EUI48)
81
+ self.assertEqual(status.lan_macaddr, 'A0-28-84-DE-DD-5C')
82
+ self.assertIsInstance(status.lan_macaddress, EUI48)
83
+ self.assertEqual(status.wan_ipv4_addr, '192.168.30.55')
84
+ self.assertIsInstance(status.lan_ipv4_address, IPv4Address)
85
+ self.assertEqual(status.lan_ipv4_addr, '192.168.4.1')
86
+ self.assertEqual(status.wan_ipv4_gateway, '192.168.30.1')
87
+ self.assertIsInstance(status.wan_ipv4_address, IPv4Address)
88
+ self.assertEqual(status.wired_total, 1)
89
+ self.assertEqual(status.wifi_clients_total, 1)
90
+ self.assertEqual(status.guest_clients_total, 0)
91
+ self.assertEqual(status.clients_total, 2)
92
+ self.assertEqual(status.guest_2g_enable, False)
93
+ self.assertEqual(status.guest_5g_enable, True)
94
+ self.assertEqual(status.iot_2g_enable, None)
95
+ self.assertEqual(status.iot_5g_enable, None)
96
+ self.assertEqual(status.wifi_2g_enable, True)
97
+ self.assertEqual(status.wifi_5g_enable, False)
98
+ self.assertEqual(status.wan_ipv4_uptime, None)
99
+ self.assertGreaterEqual(status.mem_usage, 0)
100
+ self.assertLessEqual(status.mem_usage, 1)
101
+ self.assertGreaterEqual(status.cpu_usage, 0)
102
+ self.assertLessEqual(status.cpu_usage, 1)
103
+ self.assertEqual(len(status.devices), 2)
104
+ self.assertIsInstance(status.devices[0], Device)
105
+ self.assertEqual(status.devices[0].type, Connection.WIRED)
106
+ self.assertEqual(status.devices[0].macaddr, '66-E2-02-BD-B5-1B')
107
+ self.assertIsInstance(status.devices[0].macaddress, EUI48)
108
+ self.assertEqual(status.devices[0].ipaddr, '192.168.30.10')
109
+ self.assertIsInstance(status.devices[0].ipaddress, IPv4Address)
110
+ self.assertEqual(status.devices[0].hostname, 'host1')
111
+ self.assertEqual(status.devices[0].packets_sent, None)
112
+ self.assertEqual(status.devices[0].packets_received, None)
113
+ self.assertIsInstance(status.devices[1], Device)
114
+ self.assertEqual(status.devices[1].type, Connection.HOST_2G)
115
+ self.assertEqual(status.devices[1].macaddr, 'F4-A3-86-2D-41-B5')
116
+ self.assertIsInstance(status.devices[1].macaddress, EUI48)
117
+ self.assertEqual(status.devices[1].ipaddr, '192.168.30.11')
118
+ self.assertIsInstance(status.devices[1].ipaddress, IPv4Address)
119
+ self.assertEqual(status.devices[1].hostname, 'host2')
120
+ self.assertEqual(status.devices[1].packets_sent, None) # TODO
121
+ self.assertEqual(status.devices[1].packets_received, None) # TODO
122
+
123
+ def test_get_ipv4_reservations(self) -> None:
124
+
125
+ response = ('{"data":[{"enable":"1","chaddr":"bf:75:44:4c:dc:9e","yiaddr":"192.168.8.21",'
126
+ '"stack":"1,1,0,0,0,0"}],"operation":"gl","oid":"DEV2_DHCPV4_POOL_STATICADDR","success":true}')
127
+
128
+ class TPLinkEXClientTest(TPLinkEXClient):
129
+ self._token = True
130
+
131
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
132
+ return 200, response
133
+
134
+ client = TPLinkEXClientTest('', '')
135
+ result = client.get_ipv4_reservations()
136
+
137
+ self.assertEqual(len(result), 1)
138
+ self.assertIsInstance(result[0], IPv4Reservation)
139
+ self.assertEqual(result[0].macaddr, 'BF-75-44-4C-DC-9E')
140
+ self.assertEqual(result[0].ipaddr, '192.168.8.21')
141
+ self.assertEqual(result[0].hostname, '')
142
+ self.assertEqual(result[0].enabled, True)
143
+
144
+ def test_get_ipv4_reservations_no_reservations(self) -> None:
145
+ response = '''
146
+ [error]0
147
+
148
+ '''
149
+ response = '{"data":[],"operation":"gl","oid":"DEV2_DHCPV4_POOL_STATICADDR","success":true}'
150
+
151
+ class TPLinkEXClientTest(TPLinkEXClient):
152
+ self._token = True
153
+
154
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
155
+ return 200, response
156
+
157
+ client = TPLinkEXClientTest('', '')
158
+ result = client.get_ipv4_reservations()
159
+
160
+ self.assertEqual(len(result), 0)
161
+
162
+ def test_get_ipv4_dhcp_leases_no_leases(self) -> None:
163
+
164
+ response = '{"data":[],"operation":"gl","oid":"DEV2_HOST_ENTRY","success":true}'
165
+
166
+ class TPLinkEXClientTest(TPLinkEXClient):
167
+ self._token = True
168
+
169
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
170
+ return 200, response
171
+
172
+ client = TPLinkEXClientTest('', '')
173
+ result = client.get_ipv4_dhcp_leases()
174
+
175
+ self.assertEqual(len(result), 0)
176
+
177
+ def test_get_ipv4_dhcp_leases(self) -> None:
178
+
179
+ response = ('{"data":[{"alias":"","physAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.32.175",'
180
+ '"addressSource":"Static","leaseTimeRemaining":"85841","X_TP_IPv6Address":"",'
181
+ '"X_TP_IPv6LinkLocal":"","layer1Interface":"",'
182
+ '"X_TP_Layer2Interface":"Device.WiFi.AccessPoint.1.","vendorClassID":"","clientID":"",'
183
+ '"hostName":"name1","interfaceType":"Wi-Fi","X_TP_LanConnType":"1","X_TP_LanConnDev":"br0",'
184
+ '"active":"1","IPv4AddressNumberOfEntries":"0","X_TP_Vendor":"","X_TP_ClientType":"Other",'
185
+ '"X_TP_DevphyAddress":"","IPv6AddressNumberOfEntries":"0","X_TP_NetworkReadyTime":"0",'
186
+ '"stack":"1,0,0,0,0,0"}],"operation":"gl","oid":"DEV2_HOST_ENTRY","success":true}')
187
+
188
+ class TPLinkEXClientTest(TPLinkEXClient):
189
+ self._token = True
190
+
191
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
192
+ return 200, response
193
+
194
+ client = TPLinkEXClientTest('', '')
195
+ result = client.get_ipv4_dhcp_leases()
196
+
197
+ self.assertEqual(len(result), 1)
198
+ self.assertIsInstance(result[0], IPv4DHCPLease)
199
+ self.assertEqual(result[0].macaddr, 'BF-75-44-4C-DC-9E')
200
+ self.assertEqual(result[0].ipaddr, '192.168.32.175')
201
+ self.assertEqual(result[0].hostname, 'name1')
202
+ self.assertEqual(result[0].lease_time, '23:50:41')
203
+
204
+ def test_get_ipv4_dhcp_leases_permanent(self) -> None:
205
+
206
+ response = ('{"data":[{"alias":"","physAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.32.175",'
207
+ '"addressSource":"Static","leaseTimeRemaining":"0","X_TP_IPv6Address":"",'
208
+ '"X_TP_IPv6LinkLocal":"","layer1Interface":"","X_TP_Layer2Interface":"Device.WiFi.AccessPoint.1.",'
209
+ '"vendorClassID":"","clientID":"","hostName":"name1","interfaceType":"Wi-Fi",'
210
+ '"X_TP_LanConnType":"1","X_TP_LanConnDev":"br0","active":"1","IPv4AddressNumberOfEntries":"0",'
211
+ '"X_TP_Vendor":"","X_TP_ClientType":"Other","X_TP_DevphyAddress":"",'
212
+ '"IPv6AddressNumberOfEntries":"0","X_TP_NetworkReadyTime":"0","stack":"1,0,0,0,0,0"},'
213
+ '{"alias":"","physAddress":"a0:28:84:de:dd:5c","IPAddress":"192.168.32.176",'
214
+ '"addressSource":"Static","leaseTimeRemaining":"86372","X_TP_IPv6Address":"",'
215
+ '"X_TP_IPv6LinkLocal":"","layer1Interface":"","X_TP_Layer2Interface":"Device.WiFi.AccessPoint.1.",'
216
+ '"vendorClassID":"","clientID":"","hostName":"name2","interfaceType":"Wi-Fi",'
217
+ '"X_TP_LanConnType":"1","X_TP_LanConnDev":"br0","active":"1","IPv4AddressNumberOfEntries":"0",'
218
+ '"X_TP_Vendor":"","X_TP_ClientType":"Other","X_TP_DevphyAddress":"",'
219
+ '"IPv6AddressNumberOfEntries":"0","X_TP_NetworkReadyTime":"0","stack":"1,0,0,0,0,0"}],'
220
+ '"operation":"gl","oid":"DEV2_HOST_ENTRY","success":true}')
221
+
222
+ class TPLinkEXClientTest(TPLinkEXClient):
223
+ self._token = True
224
+
225
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
226
+ return 200, response
227
+
228
+ client = TPLinkEXClientTest('', '')
229
+ result = client.get_ipv4_dhcp_leases()
230
+
231
+ self.assertEqual(len(result), 2)
232
+ self.assertEqual(result[0].macaddr, 'BF-75-44-4C-DC-9E')
233
+ self.assertEqual(result[0].ipaddr, '192.168.32.175')
234
+ self.assertEqual(result[0].hostname, 'name1')
235
+ self.assertEqual(result[0].lease_time, 'Permanent')
236
+ self.assertEqual(result[1].macaddr, 'A0-28-84-DE-DD-5C')
237
+ self.assertEqual(result[1].ipaddr, '192.168.32.176')
238
+ self.assertEqual(result[1].hostname, 'name2')
239
+ self.assertEqual(result[1].lease_time, '23:59:32')
240
+
241
+ def test_get_ipv4_status(self) -> None:
242
+
243
+ DEV2_ADT_LAN = ('{"data":[{"MACAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.5.1",'
244
+ '"IPSubnetMask":"255.255.255.0","DHCPv4Enable":"1","stack":"1,0,0,0,0,0"}],'
245
+ '"operation":"gl","oid":"DEV2_ADT_LAN","success":true}')
246
+ DEV2_ADT_WAN = ('{"data":[{"enable":"1","MACAddr":"a0:28:84:de:dd:5c","connIPv4Address":"10.10.11.5",'
247
+ '"connIPv4Gateway":"11.11.11.11","name":"ipoe_0_0_d","connIPv4SubnetMask":"1.1.1.1",'
248
+ '"connIPv4DnsServer":"8.8.8.8,8.8.4.4","stack":"1,0,0,0,0,0"}],"operation":"gl",'
249
+ '"oid":"DEV2_ADT_WAN","success":true}')
250
+
251
+ class TPLinkEXClientTest(TPLinkEXClient):
252
+ self._token = True
253
+
254
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
255
+ if 'DEV2_ADT_LAN' in data_str:
256
+ return 200, DEV2_ADT_LAN
257
+ elif 'DEV2_ADT_WAN' in data_str:
258
+ return 200, DEV2_ADT_WAN
259
+ raise ClientException()
260
+
261
+ client = TPLinkEXClientTest('', '')
262
+ result = client.get_ipv4_status()
263
+
264
+ self.assertIsInstance(result, IPv4Status)
265
+ self.assertEqual(result.wan_macaddr, 'A0-28-84-DE-DD-5C')
266
+ self.assertEqual(result.wan_ipv4_ipaddr, '10.10.11.5')
267
+ self.assertEqual(result.wan_ipv4_gateway, '11.11.11.11')
268
+ self.assertEqual(result.wan_ipv4_conntype, 'ipoe_0_0_d')
269
+ self.assertEqual(result.wan_ipv4_netmask, '1.1.1.1')
270
+ self.assertEqual(result.wan_ipv4_pridns, '8.8.8.8')
271
+ self.assertEqual(result.wan_ipv4_snddns, '8.8.4.4')
272
+ self.assertEqual(result.lan_macaddr, 'BF-75-44-4C-DC-9E')
273
+ self.assertEqual(result.lan_ipv4_ipaddr, '192.168.5.1')
274
+ self.assertEqual(result.lan_ipv4_netmask, '255.255.255.0')
275
+ self.assertEqual(result.lan_ipv4_dhcp_enable, True)
276
+ self.assertEqual(result.remote, None)
277
+
278
+ def test_get_ipv4_status_one_wlan(self) -> None:
279
+
280
+ DEV2_ADT_LAN = ('{"data":[{"MACAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.5.1",'
281
+ '"IPSubnetMask":"255.255.255.0","DHCPv4Enable":"1","stack":"1,0,0,0,0,0"}],'
282
+ '"operation":"gl","oid":"DEV2_ADT_LAN","success":true}')
283
+ DEV2_ADT_WAN = ('{"data":[{"enable":"1","MACAddr":"ba:7a:a4:4a:dc:7e","connIPv4Address":"0.0.0.0",'
284
+ '"connIPv4Gateway":"0.0.0.0","name":"ipoe_0_0_d","connIPv4SubnetMask":"0.0.0.0",'
285
+ '"connIPv4DnsServer":"0.0.0.0,0.0.0.0","stack":"1,0,0,0,0,0"}],"operation":"gl",'
286
+ '"oid":"DEV2_ADT_WAN","success":true}')
287
+
288
+ class TPLinkEXClientTest(TPLinkEXClient):
289
+ self._token = True
290
+
291
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
292
+ if 'DEV2_ADT_LAN' in data_str:
293
+ return 200, DEV2_ADT_LAN
294
+ elif 'DEV2_ADT_WAN' in data_str:
295
+ return 200, DEV2_ADT_WAN
296
+ raise ClientException()
297
+
298
+ client = TPLinkEXClientTest('', '')
299
+ result = client.get_ipv4_status()
300
+
301
+ self.assertIsInstance(result, IPv4Status)
302
+ self.assertEqual(result.wan_macaddr, 'BA-7A-A4-4A-DC-7E')
303
+ self.assertEqual(result.wan_ipv4_ipaddr, '0.0.0.0')
304
+ self.assertEqual(result.wan_ipv4_gateway, '0.0.0.0')
305
+ self.assertEqual(result.wan_ipv4_conntype, 'ipoe_0_0_d')
306
+ self.assertEqual(result.wan_ipv4_netmask, '0.0.0.0')
307
+ self.assertEqual(result.wan_ipv4_pridns, '0.0.0.0')
308
+ self.assertEqual(result.wan_ipv4_snddns, '0.0.0.0')
309
+ self.assertEqual(result.lan_macaddr, 'BF-75-44-4C-DC-9E')
310
+ self.assertEqual(result.lan_ipv4_ipaddr, '192.168.5.1')
311
+ self.assertEqual(result.lan_ipv4_netmask, '255.255.255.0')
312
+ self.assertEqual(result.lan_ipv4_dhcp_enable, True)
313
+ self.assertEqual(result.remote, None)
314
+
315
+ def test_set_wifi(self) -> None:
316
+ response = '{"success":true, "errorcode":0}'
317
+
318
+ check_url = ''
319
+ check_data = ''
320
+
321
+ class TPLinkEXClientTest(TPLinkEXClient):
322
+ self._token = True
323
+
324
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
325
+ nonlocal check_url, check_data
326
+ check_url = url
327
+ check_data = data_str
328
+ return 200, response
329
+
330
+ client = TPLinkEXClientTest('', '')
331
+ client.set_wifi(Connection.HOST_2G, True)
332
+
333
+ self.assertIn('http:///cgi_gdpr?9?_=', check_url)
334
+ self.assertEqual(check_data, '{"data":{"stack":"1,0,0,0,0,0","pstack":"0,0,0,0,0,0",'
335
+ '"primaryEnable":"1"},"operation":"so","oid":"DEV2_ADT_WIFI_COMMON"}')
336
+
337
+
338
+ if __name__ == '__main__':
339
+ main()
test/test_client_mr.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from unittest import main, TestCase
2
2
  from macaddress import EUI48
3
3
  from ipaddress import IPv4Address
4
+ from datetime import datetime
4
5
  from tplinkrouterc6u import (
5
6
  TPLinkMRClient,
6
7
  Connection,
@@ -10,6 +11,8 @@ from tplinkrouterc6u import (
10
11
  IPv4Reservation,
11
12
  IPv4DHCPLease,
12
13
  IPv4Status,
14
+ ClientError,
15
+ SMS,
13
16
  )
14
17
 
15
18
 
@@ -679,6 +682,188 @@ DNSServers=0.0.0.0,0.0.0.0
679
682
  self.assertEqual(check_data, ('2\r\n[LTE_SMS_SENDNEWMSG#0,0,0,0,0,0#0,0,0,0,0,0]0,3\r\nindex=1\r\n'
680
683
  'to=534324724234\r\ntextContent=test sms\r\n'))
681
684
 
685
+ def test_send_ussd(self) -> None:
686
+ responses = ['''[error]0
687
+
688
+ ''', '''[0,0,0,0,0,0]0
689
+ sessionStatus=1
690
+ sendResult=1
691
+ response=
692
+ ussdStatus=0
693
+ [error]0
694
+
695
+ ''', '''[0,0,0,0,0,0]0
696
+ sessionStatus=0
697
+ sendResult=1
698
+ response=some text
699
+ ussdStatus=1
700
+ [error]0
701
+
702
+ ''']
703
+
704
+ check_url = []
705
+ check_data = []
706
+
707
+ class TPLinkMRClientTest(TPLinkMRClient):
708
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
709
+ nonlocal check_url, check_data
710
+ check_url.append(url)
711
+ check_data.append(data_str)
712
+ return 200, responses.pop(0)
713
+
714
+ client = TPLinkMRClientTest('', '')
715
+
716
+ self.assertEqual('some text', client.send_ussd('534324724234'))
717
+
718
+ self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
719
+ self.assertEqual(check_data.pop(0),
720
+ '2\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,2\r\naction=1\r\nreqContent=534324724234\r\n')
721
+
722
+ self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
723
+ self.assertEqual(check_data.pop(0),
724
+ ('1\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,4\r\nsessionStatus\r\n'
725
+ 'sendResult\r\nresponse\r\nussdStatus\r\n'))
726
+
727
+ def test_send_ussd_error(self) -> None:
728
+ responses = ['''[error]0
729
+
730
+ ''', '''[0,0,0,0,0,0]0
731
+ sessionStatus=1
732
+ sendResult=1
733
+ response=
734
+ ussdStatus=0
735
+ [error]0
736
+
737
+ ''', '''[0,0,0,0,0,0]0
738
+ sessionStatus=0
739
+ sendResult=1
740
+ response=
741
+ ussdStatus=2
742
+ [error]0
743
+
744
+ ''']
745
+
746
+ check_url = []
747
+ check_data = []
748
+
749
+ class TPLinkMRClientTest(TPLinkMRClient):
750
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
751
+ nonlocal check_url, check_data
752
+ check_url.append(url)
753
+ check_data.append(data_str)
754
+ return 200, responses.pop(0)
755
+
756
+ client = TPLinkMRClientTest('', '')
757
+
758
+ with self.assertRaises(ClientError) as context:
759
+ client.send_ussd('534324724234')
760
+
761
+ self.assertTrue('Cannot send USSD!' in str(context.exception))
762
+
763
+ self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
764
+ self.assertEqual(check_data.pop(0),
765
+ '2\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,2\r\naction=1\r\nreqContent=534324724234\r\n')
766
+
767
+ self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
768
+ self.assertEqual(check_data.pop(0),
769
+ ('1\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,4\r\nsessionStatus\r\nsendResult\r\n'
770
+ 'response\r\nussdStatus\r\n'))
771
+
772
+ def test_get_sms(self) -> None:
773
+ response = '''[1,0,0,0,0,0]1
774
+ index=3
775
+ from=sender1
776
+ content=text second
777
+ receivedTime=2024-11-15 22:28:09
778
+ unread=1
779
+ [2,0,0,0,0,0]1
780
+ index=2
781
+ from=sender2
782
+ content=text first
783
+ receivedTime=2024-11-15 22:23:59
784
+ unread=0
785
+ [error]0
786
+ '''
787
+
788
+ class TPLinkMRClientTest(TPLinkMRClient):
789
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
790
+ return 200, response
791
+
792
+ client = TPLinkMRClientTest('', '')
793
+ messages = client.get_sms()
794
+
795
+ self.assertEqual(len(messages), 2)
796
+ self.assertIsInstance(messages[0], SMS)
797
+ self.assertEqual(messages[0].id, 1)
798
+ self.assertEqual(messages[0].sender, 'sender1')
799
+ self.assertEqual(messages[0].content, 'text second')
800
+ self.assertEqual(messages[0].received_at, datetime.fromisoformat('2024-11-15 22:28:09'))
801
+ self.assertEqual(messages[0].unread, True)
802
+ self.assertIsInstance(messages[1], SMS)
803
+ self.assertEqual(messages[1].id, 2)
804
+ self.assertEqual(messages[1].sender, 'sender2')
805
+ self.assertEqual(messages[1].content, 'text first')
806
+ self.assertEqual(messages[1].received_at, datetime.fromisoformat('2024-11-15 22:23:59'))
807
+ self.assertEqual(messages[1].unread, False)
808
+
809
+ def test_get_sms_empty(self) -> None:
810
+ response = '''[error]0
811
+
812
+ '''
813
+
814
+ class TPLinkMRClientTest(TPLinkMRClient):
815
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
816
+ return 200, response
817
+
818
+ client = TPLinkMRClientTest('', '')
819
+ messages = client.get_sms()
820
+
821
+ self.assertEqual([], messages)
822
+
823
+ def test_set_sms_read(self) -> None:
824
+ response = '''
825
+ [error]0
826
+
827
+ '''
828
+
829
+ check_url = ''
830
+ check_data = ''
831
+
832
+ class TPLinkMRClientTest(TPLinkMRClient):
833
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
834
+ nonlocal check_url, check_data
835
+ check_url = url
836
+ check_data = data_str
837
+ return 200, response
838
+
839
+ client = TPLinkMRClientTest('', '')
840
+ client.set_sms_read(SMS(2, '', '', datetime.now(), True))
841
+
842
+ self.assertIn('http:///cgi_gdpr?_=', check_url)
843
+ self.assertEqual(check_data, '2\r\n[LTE_SMS_RECVMSGENTRY#2,0,0,0,0,0#0,0,0,0,0,0]0,1\r\nunread=0\r\n')
844
+
845
+ def test_delete_sms(self) -> None:
846
+ response = '''
847
+ [error]0
848
+
849
+ '''
850
+
851
+ check_url = ''
852
+ check_data = ''
853
+
854
+ class TPLinkMRClientTest(TPLinkMRClient):
855
+ def _request(self, url, method='POST', data_str=None, encrypt=False):
856
+ nonlocal check_url, check_data
857
+ check_url = url
858
+ check_data = data_str
859
+ return 200, response
860
+
861
+ client = TPLinkMRClientTest('', '')
862
+ client.delete_sms(SMS(2, '', '', datetime.now(), True))
863
+
864
+ self.assertIn('http:///cgi_gdpr?_=', check_url)
865
+ self.assertEqual(check_data, '4\r\n[LTE_SMS_RECVMSGENTRY#2,0,0,0,0,0#0,0,0,0,0,0]0,0\r\n\r\n')
866
+
682
867
 
683
868
  if __name__ == '__main__':
684
869
  main()
@@ -1,19 +1,20 @@
1
- from tplinkrouterc6u.client import (
2
- TplinkRouter,
3
- TplinkRouterProvider,
4
- TplinkC1200Router,
5
- TplinkC5400XRouter,
6
- TPLinkMRClient,
7
- AbstractRouter,
8
- TPLinkDecoClient,
9
- )
10
- from tplinkrouterc6u.package_enum import Connection
11
- from tplinkrouterc6u.dataclass import (
1
+ from tplinkrouterc6u.client.api_cgi_bin import TplinkRouter
2
+ from tplinkrouterc6u.client.deco import TPLinkDecoClient
3
+ from tplinkrouterc6u.client_abstract import AbstractRouter
4
+ from tplinkrouterc6u.client.mr import TPLinkMRClient
5
+ from tplinkrouterc6u.client.ex import TPLinkEXClient
6
+ from tplinkrouterc6u.client.c6v4 import TplinkC6V4Router
7
+ from tplinkrouterc6u.client.c5400x import TplinkC5400XRouter
8
+ from tplinkrouterc6u.client.c1200 import TplinkC1200Router
9
+ from tplinkrouterc6u.provider import TplinkRouterProvider
10
+ from tplinkrouterc6u.common.package_enum import Connection
11
+ from tplinkrouterc6u.common.dataclass import (
12
12
  Firmware,
13
13
  Status,
14
14
  Device,
15
15
  IPv4Reservation,
16
16
  IPv4DHCPLease,
17
17
  IPv4Status,
18
+ SMS,
18
19
  )
19
- from tplinkrouterc6u.exception import ClientException
20
+ from tplinkrouterc6u.common.exception import ClientException, ClientError, AuthorizeError
@@ -0,0 +1 @@
1
+ """All clients are here"""