smartrack-sdk 1.0.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.

Potentially problematic release.


This version of smartrack-sdk might be problematic. Click here for more details.

@@ -0,0 +1,295 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ 回调处理器测试
6
+ """
7
+
8
+ import unittest
9
+ from datetime import datetime
10
+
11
+ from ..callback.handler import CellEventCallbackService
12
+ from ..models.callback import CellEventHandleRequest, CellEventHandleResponse, CellEventData
13
+ from ..models.enums import LedColors, TriggerState, OperationResultCode
14
+
15
+
16
+ class TestCellEventCallbackService(unittest.TestCase):
17
+ """储位事件回调服务测试"""
18
+
19
+ def setUp(self):
20
+ """测试前准备"""
21
+ self.service = CellEventCallbackService()
22
+
23
+ def test_handle_put_in_event_success(self):
24
+ """测试处理入库事件成功"""
25
+ # 创建请求
26
+ request = self._create_test_request()
27
+
28
+ # 创建入库事件数据
29
+ event_data = CellEventData()
30
+ event_data.code = OperationResultCode.SUCCESS.value
31
+ event_data.message = "入库成功"
32
+ event_data.cell_id = "A0010001"
33
+ event_data.cell_state = TriggerState.PUT_IN
34
+ event_data.grn = "PRODUCT001"
35
+ event_data.sheet_id = "SHEET001"
36
+ event_data.led_color = LedColors.GREEN
37
+ event_data.is_blink = False
38
+ event_data.rack_id = "A001"
39
+
40
+ request.add_event_data(event_data)
41
+
42
+ # 执行处理
43
+ response = self.service.handle(request)
44
+
45
+ # 验证结果
46
+ self.assertIsInstance(response, CellEventHandleResponse)
47
+ self.assertEqual(response.code, 0)
48
+ self.assertEqual(response.message, "OK")
49
+ self.assertEqual(response.session_id, request.session_id)
50
+ self.assertTrue(response.is_success)
51
+
52
+ def test_handle_take_out_event_success(self):
53
+ """测试处理出库事件成功"""
54
+ # 创建请求
55
+ request = self._create_test_request()
56
+
57
+ # 创建出库事件数据
58
+ event_data = CellEventData()
59
+ event_data.code = OperationResultCode.SUCCESS.value
60
+ event_data.message = "出库成功"
61
+ event_data.cell_id = "A0010001"
62
+ event_data.cell_state = TriggerState.TAKE_OUT
63
+ event_data.grn = "PRODUCT001"
64
+ event_data.sheet_id = "SHEET001"
65
+ event_data.led_color = LedColors.RED
66
+ event_data.is_blink = False
67
+ event_data.rack_id = "A001"
68
+
69
+ request.add_event_data(event_data)
70
+
71
+ # 执行处理
72
+ response = self.service.handle(request)
73
+
74
+ # 验证结果
75
+ self.assertEqual(response.code, 0)
76
+ self.assertTrue(response.is_success)
77
+
78
+ def test_handle_multiple_events(self):
79
+ """测试处理多个事件"""
80
+ # 创建请求
81
+ request = self._create_test_request()
82
+
83
+ # 第一个事件 - 入库
84
+ event1 = CellEventData()
85
+ event1.code = OperationResultCode.SUCCESS.value
86
+ event1.message = "入库成功"
87
+ event1.cell_id = "A0010001"
88
+ event1.cell_state = TriggerState.PUT_IN
89
+ event1.grn = "PRODUCT001"
90
+ event1.led_color = LedColors.GREEN
91
+ event1.is_blink = False
92
+
93
+ # 第二个事件 - 出库
94
+ event2 = CellEventData()
95
+ event2.code = OperationResultCode.SUCCESS.value
96
+ event2.message = "出库成功"
97
+ event2.cell_id = "A0010002"
98
+ event2.cell_state = TriggerState.TAKE_OUT
99
+ event2.grn = "PRODUCT002"
100
+ event2.led_color = LedColors.RED
101
+ event2.is_blink = False
102
+
103
+ request.add_event_data(event1)
104
+ request.add_event_data(event2)
105
+
106
+ # 执行处理
107
+ response = self.service.handle(request)
108
+
109
+ # 验证结果
110
+ self.assertEqual(response.code, 0)
111
+ self.assertTrue(response.is_success)
112
+
113
+ def test_handle_operation_error(self):
114
+ """测试处理操作错误"""
115
+ # 创建请求
116
+ request = self._create_test_request()
117
+
118
+ # 创建错误事件数据
119
+ event_data = CellEventData()
120
+ event_data.code = OperationResultCode.ILLEGAL_STOCK_IN.value
121
+ event_data.message = "非法上架"
122
+ event_data.cell_id = "A0010001"
123
+ event_data.cell_state = TriggerState.PUT_IN
124
+ event_data.grn = "PRODUCT001"
125
+ event_data.led_color = LedColors.RED
126
+ event_data.is_blink = True
127
+ event_data.rack_id = "A001"
128
+
129
+ request.add_event_data(event_data)
130
+
131
+ # 执行处理
132
+ response = self.service.handle(request)
133
+
134
+ # 验证结果 - 即使是操作错误,回调处理也应该成功
135
+ self.assertEqual(response.code, 0)
136
+ self.assertTrue(response.is_success)
137
+
138
+ def test_handle_empty_event_data(self):
139
+ """测试处理空事件数据"""
140
+ # 创建请求但不添加事件数据
141
+ request = self._create_test_request()
142
+ request.data = []
143
+
144
+ # 执行处理
145
+ response = self.service.handle(request)
146
+
147
+ # 验证结果
148
+ self.assertEqual(response.code, 100102)
149
+ self.assertEqual(response.message, "没有事件数据")
150
+ self.assertFalse(response.is_success)
151
+
152
+ def test_handle_null_event_data(self):
153
+ """测试处理None事件数据"""
154
+ # 创建请求
155
+ request = self._create_test_request()
156
+ request.data = None
157
+
158
+ # 执行处理
159
+ response = self.service.handle(request)
160
+
161
+ # 验证结果
162
+ self.assertEqual(response.code, 100102)
163
+ self.assertEqual(response.message, "没有事件数据")
164
+ self.assertFalse(response.is_success)
165
+
166
+ def test_handle_put_in_event_with_empty_grn(self):
167
+ """测试处理空GRN的入库事件"""
168
+ # 创建请求
169
+ request = self._create_test_request()
170
+
171
+ # 创建空GRN的事件数据
172
+ event_data = CellEventData()
173
+ event_data.code = OperationResultCode.SUCCESS.value
174
+ event_data.message = "入库成功"
175
+ event_data.cell_id = "A0010001"
176
+ event_data.cell_state = TriggerState.PUT_IN
177
+ event_data.grn = "" # 空的GRN
178
+ event_data.led_color = LedColors.GREEN
179
+ event_data.is_blink = False
180
+
181
+ request.add_event_data(event_data)
182
+
183
+ # 执行处理
184
+ response = self.service.handle(request)
185
+
186
+ # 验证结果 - 应该返回错误
187
+ self.assertEqual(response.code, 100103)
188
+ self.assertIn("处理事件失败", response.message)
189
+ self.assertFalse(response.is_success)
190
+
191
+ def test_handle_take_out_event_with_empty_grn(self):
192
+ """测试处理空GRN的出库事件"""
193
+ # 创建请求
194
+ request = self._create_test_request()
195
+
196
+ # 创建空GRN的事件数据
197
+ event_data = CellEventData()
198
+ event_data.code = OperationResultCode.SUCCESS.value
199
+ event_data.message = "出库成功"
200
+ event_data.cell_id = "A0010001"
201
+ event_data.cell_state = TriggerState.TAKE_OUT
202
+ event_data.grn = None # None的GRN
203
+ event_data.led_color = LedColors.RED
204
+ event_data.is_blink = False
205
+
206
+ request.add_event_data(event_data)
207
+
208
+ # 执行处理
209
+ response = self.service.handle(request)
210
+
211
+ # 验证结果 - 应该返回错误
212
+ self.assertEqual(response.code, 100103)
213
+ self.assertIn("处理事件失败", response.message)
214
+ self.assertFalse(response.is_success)
215
+
216
+ def test_handle_illegal_stock_in_error(self):
217
+ """测试处理非法上架错误"""
218
+ # 创建请求
219
+ request = self._create_test_request()
220
+
221
+ # 创建非法上架事件数据
222
+ event_data = CellEventData()
223
+ event_data.code = OperationResultCode.ILLEGAL_STOCK_IN.value
224
+ event_data.message = "非法上架"
225
+ event_data.cell_id = "A0010001"
226
+ event_data.cell_state = TriggerState.PUT_IN
227
+ event_data.grn = "PRODUCT001"
228
+ event_data.led_color = LedColors.RED
229
+ event_data.is_blink = True
230
+ event_data.rack_id = "A001"
231
+
232
+ request.add_event_data(event_data)
233
+
234
+ # 执行处理
235
+ response = self.service.handle(request)
236
+
237
+ # 验证结果 - 回调处理成功,但会记录错误日志
238
+ self.assertEqual(response.code, 0)
239
+ self.assertTrue(response.is_success)
240
+
241
+ def test_handle_illegal_stock_out_error(self):
242
+ """测试处理非法下架错误"""
243
+ # 创建请求
244
+ request = self._create_test_request()
245
+
246
+ # 创建非法下架事件数据
247
+ event_data = CellEventData()
248
+ event_data.code = OperationResultCode.ILLEGAL_STOCK_OUT.value
249
+ event_data.message = "非法下架"
250
+ event_data.cell_id = "A0010001"
251
+ event_data.cell_state = TriggerState.TAKE_OUT
252
+ event_data.grn = "PRODUCT001"
253
+ event_data.led_color = LedColors.RED
254
+ event_data.is_blink = True
255
+ event_data.rack_id = "A001"
256
+
257
+ request.add_event_data(event_data)
258
+
259
+ # 执行处理
260
+ response = self.service.handle(request)
261
+
262
+ # 验证结果 - 回调处理成功,但会记录错误日志
263
+ self.assertEqual(response.code, 0)
264
+ self.assertTrue(response.is_success)
265
+
266
+ def test_event_data_properties(self):
267
+ """测试事件数据属性"""
268
+ event_data = CellEventData()
269
+ event_data.code = OperationResultCode.SUCCESS.value
270
+ event_data.cell_state = TriggerState.PUT_IN
271
+ event_data.grn = "TEST-GRN"
272
+
273
+ # 测试属性
274
+ self.assertTrue(event_data.is_success)
275
+ self.assertTrue(event_data.is_put_in)
276
+ self.assertFalse(event_data.is_take_out)
277
+ self.assertEqual(event_data.operation_result, OperationResultCode.SUCCESS)
278
+
279
+ # 测试字符串表示
280
+ event_str = str(event_data)
281
+ self.assertIn("TEST-GRN", event_str)
282
+ self.assertIn("PutIn", event_str)
283
+
284
+ def _create_test_request(self) -> CellEventHandleRequest:
285
+ """创建测试请求"""
286
+ request = CellEventHandleRequest()
287
+ request.user_id = "test-user"
288
+ request.client_id = "test-client"
289
+ request.session_id = f"test-session-{int(datetime.now().timestamp())}"
290
+ request.timestamp = datetime.now().isoformat()
291
+ return request
292
+
293
+
294
+ if __name__ == '__main__':
295
+ unittest.main()
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ SmartRack客户端测试
6
+ """
7
+
8
+ import unittest
9
+ from unittest.mock import Mock, patch, MagicMock
10
+ import json
11
+ import requests
12
+
13
+ from ..client.smart_rack_client import SmartRackClient
14
+ from ..exceptions import SmartRackConfigurationException, SmartRackApiException, SmartRackNetworkException
15
+ from ..models.requests import StockInRequest, ClearErrorRequest
16
+ from ..models.responses import BaseResponse, ClearErrorResponse
17
+ from ..models.enums import LedColors, RackTestMode
18
+
19
+
20
+ class TestSmartRackClient(unittest.TestCase):
21
+ """SmartRack客户端测试"""
22
+
23
+ def setUp(self):
24
+ """测试前准备"""
25
+ self.base_url = "http://test.com"
26
+ self.client = SmartRackClient(self.base_url)
27
+
28
+ def tearDown(self):
29
+ """测试后清理"""
30
+ self.client.close()
31
+
32
+ def test_init_with_valid_url(self):
33
+ """测试使用有效URL初始化"""
34
+ client = SmartRackClient("http://example.com")
35
+ self.assertEqual(client.base_url, "http://example.com")
36
+ client.close()
37
+
38
+ def test_init_with_empty_url(self):
39
+ """测试使用空URL初始化"""
40
+ with self.assertRaises(SmartRackConfigurationException):
41
+ SmartRackClient("")
42
+
43
+ def test_init_with_none_url(self):
44
+ """测试使用None URL初始化"""
45
+ with self.assertRaises(SmartRackConfigurationException):
46
+ SmartRackClient(None)
47
+
48
+ def test_set_auth_token(self):
49
+ """测试设置认证Token"""
50
+ token = "test-token"
51
+ self.client.set_auth_token(token)
52
+ self.assertEqual(self.client.auth_token, token)
53
+ self.assertEqual(self.client.session.headers['Authorization'], f'Bearer {token}')
54
+
55
+ def test_clear_auth_token(self):
56
+ """测试清除认证Token"""
57
+ self.client.set_auth_token("test-token")
58
+ self.client.clear_auth_token()
59
+ self.assertIsNone(self.client.auth_token)
60
+ self.assertNotIn('Authorization', self.client.session.headers)
61
+
62
+ @patch('requests.Session.request')
63
+ def test_stock_in_request_success(self, mock_request):
64
+ """测试入库请求成功"""
65
+ # 模拟响应
66
+ mock_response = Mock()
67
+ mock_response.json.return_value = {
68
+ "code": 0,
69
+ "message": "Success",
70
+ "sessionId": "test-session",
71
+ "timestamp": "2024-01-01T00:00:00"
72
+ }
73
+ mock_response.raise_for_status.return_value = None
74
+ mock_request.return_value = mock_response
75
+
76
+ # 创建请求
77
+ request = StockInRequest("test", "MES")
78
+ request.set_sheet_id("IN001")
79
+ request.set_rack_id("A001")
80
+ request.set_grn("PRODUCT001")
81
+ request.set_led_color(LedColors.GREEN)
82
+ request.set_blink(True)
83
+
84
+ # 执行请求
85
+ response = self.client.stock_in_request(request)
86
+
87
+ # 验证结果
88
+ self.assertIsInstance(response, BaseResponse)
89
+ self.assertEqual(response.code, 0)
90
+ self.assertEqual(response.message, "Success")
91
+
92
+ # 验证请求调用
93
+ mock_request.assert_called_once()
94
+ call_args = mock_request.call_args
95
+ self.assertEqual(call_args[0][0], 'POST') # method is first positional argument
96
+ self.assertIn('/api/HJWMS/External/SmartRackExternal/StockInRequest', call_args[0][1]) # url is second positional argument
97
+ self.assertEqual(call_args[1]['json']['userId'], 'test')
98
+ self.assertEqual(call_args[1]['json']['clientId'], 'MES')
99
+ self.assertEqual(call_args[1]['json']['sheetId'], 'IN001')
100
+ self.assertEqual(call_args[1]['json']['rackId'], 'A001')
101
+ self.assertEqual(call_args[1]['json']['grn'], 'PRODUCT001')
102
+ self.assertEqual(call_args[1]['json']['ledColor'], LedColors.GREEN.value)
103
+ self.assertTrue(call_args[1]['json']['isBlink'])
104
+
105
+ @patch('requests.Session.request')
106
+ def test_stock_in_request_api_error(self, mock_request):
107
+ """测试入库请求API错误"""
108
+ # 模拟API错误响应
109
+ mock_response = Mock()
110
+ mock_response.json.return_value = {
111
+ "code": 100101,
112
+ "message": "入库超时",
113
+ "sessionId": "test-session",
114
+ "timestamp": "2024-01-01T00:00:00"
115
+ }
116
+ mock_response.raise_for_status.return_value = None
117
+ mock_request.return_value = mock_response
118
+
119
+ # 创建请求
120
+ request = StockInRequest("test", "MES")
121
+ request.set_sheet_id("IN001")
122
+ request.set_rack_id("A001")
123
+ request.set_grn("PRODUCT001")
124
+
125
+ # 执行请求并验证异常
126
+ with self.assertRaises(SmartRackApiException) as context:
127
+ self.client.stock_in_request(request)
128
+
129
+ self.assertEqual(context.exception.api_code, 100101)
130
+ self.assertEqual(context.exception.message, "入库超时")
131
+ self.assertEqual(context.exception.session_id, "test-session")
132
+
133
+ @patch('requests.Session.request')
134
+ def test_stock_in_request_network_error(self, mock_request):
135
+ """测试入库请求网络错误"""
136
+ # 模拟网络错误
137
+ mock_request.side_effect = requests.exceptions.ConnectionError("Connection failed")
138
+
139
+ # 创建请求
140
+ request = StockInRequest("test", "MES")
141
+ request.set_sheet_id("IN001")
142
+ request.set_rack_id("A001")
143
+ request.set_grn("PRODUCT001")
144
+
145
+ # 执行请求并验证异常
146
+ with self.assertRaises(SmartRackNetworkException) as context:
147
+ self.client.stock_in_request(request)
148
+
149
+ self.assertIn("连接错误", context.exception.message)
150
+
151
+ @patch('requests.Session.request')
152
+ def test_clear_error_success(self, mock_request):
153
+ """测试清错请求成功"""
154
+ # 模拟响应
155
+ mock_response = Mock()
156
+ mock_response.json.return_value = {
157
+ "code": 0,
158
+ "message": "Success",
159
+ "sessionId": "test-session",
160
+ "timestamp": "2024-01-01T00:00:00",
161
+ "resultData": [
162
+ {
163
+ "grn": "PRODUCT001",
164
+ "cell": "A0010001",
165
+ "state": 0
166
+ }
167
+ ]
168
+ }
169
+ mock_response.raise_for_status.return_value = None
170
+ mock_request.return_value = mock_response
171
+
172
+ # 创建请求
173
+ request = ClearErrorRequest("test", "MES")
174
+ request.set_cell_id("A0010001")
175
+
176
+ # 执行请求
177
+ response = self.client.clear_error(request)
178
+
179
+ # 验证结果
180
+ self.assertIsInstance(response, ClearErrorResponse)
181
+ self.assertEqual(response.code, 0)
182
+ self.assertEqual(response.message, "Success")
183
+ self.assertEqual(len(response.result_data), 1)
184
+ self.assertEqual(response.result_data[0].grn, "PRODUCT001")
185
+ self.assertEqual(response.result_data[0].cell, "A0010001")
186
+ self.assertEqual(response.result_data[0].state, 0)
187
+
188
+ @patch('requests.Session.request')
189
+ def test_get_stock_data_success(self, mock_request):
190
+ """测试查询库存成功"""
191
+ # 模拟响应
192
+ mock_response = Mock()
193
+ mock_response.json.return_value = {
194
+ "code": 0,
195
+ "message": "Success",
196
+ "sessionId": "test-session",
197
+ "timestamp": "2024-01-01T00:00:00",
198
+ "resultData": [
199
+ {
200
+ "rackId": "A001",
201
+ "grn": "PRODUCT001",
202
+ "cellId": "A0010001",
203
+ "ledColor": LedColors.GREEN.value,
204
+ "isBlink": False,
205
+ "status": 1
206
+ }
207
+ ],
208
+ "total": 1
209
+ }
210
+ mock_response.raise_for_status.return_value = None
211
+ mock_request.return_value = mock_response
212
+
213
+ # 执行请求
214
+ response = self.client.get_stock_data(
215
+ grn="PRODUCT001",
216
+ rack_id="A001",
217
+ cell_id="A0010001"
218
+ )
219
+
220
+ # 验证结果
221
+ self.assertEqual(response.code, 0)
222
+ self.assertEqual(response.total, 1)
223
+ self.assertEqual(len(response.result_data), 1)
224
+ self.assertEqual(response.result_data[0].rack_id, "A001")
225
+ self.assertEqual(response.result_data[0].grn, "PRODUCT001")
226
+ self.assertEqual(response.result_data[0].cell_id, "A0010001")
227
+
228
+ # 验证请求参数
229
+ call_args = mock_request.call_args
230
+ self.assertEqual(call_args[0][0], 'GET') # method is first positional argument
231
+ params = call_args[1]['params']
232
+ self.assertEqual(params['GRN'], 'PRODUCT001')
233
+ self.assertEqual(params['RackId'], 'A001')
234
+ self.assertEqual(params['CellId'], 'A0010001')
235
+
236
+ def test_context_manager(self):
237
+ """测试上下文管理器"""
238
+ with SmartRackClient("http://test.com") as client:
239
+ self.assertEqual(client.base_url, "http://test.com")
240
+ # 客户端应该自动关闭
241
+
242
+ def test_validation_error_empty_sheet_id(self):
243
+ """测试验证错误 - 空的入库单号"""
244
+ request = StockInRequest("test", "MES")
245
+ # 不设置sheet_id
246
+
247
+ with self.assertRaises(Exception) as context:
248
+ self.client.stock_in_request(request)
249
+ self.assertIn("sheetId", str(context.exception))
250
+
251
+ def test_validation_error_empty_grn_list(self):
252
+ """测试验证错误 - 空的GRN列表"""
253
+ from ..models.requests import StockOutRequest
254
+
255
+ request = StockOutRequest("test", "MES")
256
+ # 不添加GRN到列表
257
+
258
+ with self.assertRaises(Exception) as context:
259
+ self.client.stock_out_request(request)
260
+ self.assertIn("grnList", str(context.exception))
261
+
262
+
263
+ if __name__ == '__main__':
264
+ unittest.main()