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.
- examples/__init__.py +7 -0
- examples/basic_usage.py +360 -0
- examples/callback_server.py +435 -0
- examples/test_client.py +303 -0
- smartrack_sdk/__init__.py +129 -0
- smartrack_sdk/callback/__init__.py +19 -0
- smartrack_sdk/callback/fastapi_handler.py +151 -0
- smartrack_sdk/callback/flask_handler.py +137 -0
- smartrack_sdk/callback/handler.py +220 -0
- smartrack_sdk/callback/service.py +14 -0
- smartrack_sdk/client/__init__.py +13 -0
- smartrack_sdk/client/smart_rack_client.py +523 -0
- smartrack_sdk/exceptions/__init__.py +21 -0
- smartrack_sdk/exceptions/api.py +29 -0
- smartrack_sdk/exceptions/base.py +25 -0
- smartrack_sdk/exceptions/configuration.py +28 -0
- smartrack_sdk/exceptions/network.py +50 -0
- smartrack_sdk/exceptions/validation.py +28 -0
- smartrack_sdk/models/__init__.py +85 -0
- smartrack_sdk/models/callback.py +184 -0
- smartrack_sdk/models/enums.py +203 -0
- smartrack_sdk/models/requests.py +291 -0
- smartrack_sdk/models/responses.py +209 -0
- smartrack_sdk/tests/__init__.py +7 -0
- smartrack_sdk/tests/test_callback.py +295 -0
- smartrack_sdk/tests/test_client.py +264 -0
- smartrack_sdk-1.0.0.dist-info/METADATA +557 -0
- smartrack_sdk-1.0.0.dist-info/RECORD +31 -0
- smartrack_sdk-1.0.0.dist-info/WHEEL +5 -0
- smartrack_sdk-1.0.0.dist-info/entry_points.txt +2 -0
- smartrack_sdk-1.0.0.dist-info/top_level.txt +2 -0
|
@@ -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()
|