修复:限定幂等键精确业务域
This commit is contained in:
@@ -729,6 +729,25 @@ class TestFillPalletService(unittest.IsolatedAsyncioTestCase):
|
||||
self.assertTrue(result.is_success)
|
||||
self.assertEqual(31, result.result)
|
||||
|
||||
async def test_idempotency_lookup_uses_requested_warehouse_for_multi_scope_and_admin(self) -> None:
|
||||
for user, scope in ((self.user, [9, 7, 9]), (make_user(1), None)):
|
||||
with self.subTest(admin=bool(user.user and user.user.admin)):
|
||||
self.db.reset_mock()
|
||||
existing = make_filling()
|
||||
get_key = AsyncMock(return_value=existing)
|
||||
scope_read = AsyncMock(return_value=scope)
|
||||
with (
|
||||
patch.object(AccessDao, 'list_user_warehouse_ids', new=scope_read),
|
||||
patch.object(AccessService, 'assert_warehouse_access', new=AsyncMock()),
|
||||
patch.object(OperationDao, 'get_filling_by_idempotency_key', new=get_key),
|
||||
):
|
||||
result = await FillingService.fill_pallet_services(self.db, self.page, user)
|
||||
|
||||
get_key.assert_awaited_once_with(self.db, 'fill-key', warehouse_ids=[7])
|
||||
self.assertEqual(31, result.result)
|
||||
if user.user and user.user.admin:
|
||||
scope_read.assert_not_awaited()
|
||||
|
||||
async def test_same_idempotency_key_with_different_hash_is_rejected(self) -> None:
|
||||
existing = make_filling(request_hash='different-hash')
|
||||
with (
|
||||
@@ -913,7 +932,7 @@ class TestFillPalletService(unittest.IsolatedAsyncioTestCase):
|
||||
key_reads = AsyncMock(side_effect=[None, recovered])
|
||||
access = AsyncMock()
|
||||
with (
|
||||
patch.object(AccessDao, 'list_user_warehouse_ids', new=AsyncMock(return_value=[7])),
|
||||
patch.object(AccessDao, 'list_user_warehouse_ids', new=AsyncMock(return_value=[9, 7, 9])),
|
||||
patch.object(AccessService, 'assert_warehouse_access', new=access),
|
||||
patch.object(OperationDao, 'get_filling_by_idempotency_key', new=key_reads),
|
||||
patch.object(InventoryDao, 'get_pallet_by_qr_token', new=AsyncMock(return_value=self.pallet)),
|
||||
@@ -926,6 +945,10 @@ class TestFillPalletService(unittest.IsolatedAsyncioTestCase):
|
||||
result = await FillingService.fill_pallet_services(self.db, self.page, self.user)
|
||||
|
||||
self.assertEqual(2, key_reads.await_count)
|
||||
self.assertEqual(
|
||||
[{'warehouse_ids': [7]}, {'warehouse_ids': [7]}],
|
||||
[call.kwargs for call in key_reads.await_args_list],
|
||||
)
|
||||
self.assertEqual(2, self.db.rollback.await_count)
|
||||
access.assert_any_await(self.db, self.user, 7)
|
||||
self.assertTrue(result.is_success)
|
||||
|
||||
Reference in New Issue
Block a user