修复:装填前复核仓库权限

This commit is contained in:
焦龙言
2026-07-26 18:16:34 +08:00
parent f6e994d95f
commit 66890ca63c
5 changed files with 184 additions and 14 deletions
@@ -1,3 +1,4 @@
import inspect
import unittest
from types import SimpleNamespace
from unittest.mock import AsyncMock, MagicMock, patch
@@ -36,6 +37,36 @@ class AccessServiceTest(unittest.IsolatedAsyncioTestCase):
user_has_warehouse.assert_awaited_once_with(db, 8, 99)
@patch('module_business.service.access_service.AccessDao.user_has_warehouse', new_callable=AsyncMock)
async def test_locking_warehouse_access_is_forwarded(self, user_has_warehouse: AsyncMock) -> None:
lock_parameter = inspect.signature(AccessService.assert_warehouse_access).parameters.get('for_update')
self.assertIsNotNone(lock_parameter)
self.assertIs(inspect.Parameter.KEYWORD_ONLY, lock_parameter.kind)
self.assertIs(False, lock_parameter.default)
user_has_warehouse.return_value = True
user = SimpleNamespace(user=SimpleNamespace(user_id=8, admin=False))
db = AsyncMock(spec=AsyncSession)
await AccessService.assert_warehouse_access(db, user, 99, for_update=True)
user_has_warehouse.assert_awaited_once_with(db, 8, 99, for_update=True)
@patch('module_business.service.access_service.AccessDao.user_has_warehouse', new_callable=AsyncMock)
async def test_admin_bypasses_locking_warehouse_mapping(self, user_has_warehouse: AsyncMock) -> None:
lock_parameter = inspect.signature(AccessService.assert_warehouse_access).parameters.get('for_update')
self.assertIsNotNone(lock_parameter)
user = SimpleNamespace(user=SimpleNamespace(user_id=1, admin=True))
await AccessService.assert_warehouse_access(
AsyncMock(spec=AsyncSession),
user,
99,
for_update=True,
)
user_has_warehouse.assert_not_awaited()
@patch('module_business.service.access_service.AccessDao.user_has_warehouse', new_callable=AsyncMock)
async def test_unmapped_warehouse_is_forbidden(self, user_has_warehouse: AsyncMock) -> None:
user_has_warehouse.return_value = False
@@ -127,6 +158,27 @@ class AccessDaoTest(unittest.IsolatedAsyncioTestCase):
),
)
async def test_user_has_warehouse_current_read_is_optional_keyword_only_lock(self) -> None:
lock_parameter = inspect.signature(AccessDao.user_has_warehouse).parameters.get('for_update')
self.assertIsNotNone(lock_parameter)
self.assertIs(inspect.Parameter.KEYWORD_ONLY, lock_parameter.kind)
self.assertIs(False, lock_parameter.default)
for for_update in (False, True):
with self.subTest(for_update=for_update):
result = MagicMock()
result.scalar_one_or_none.return_value = 8
db = self._db_with_result(result)
if for_update:
await AccessDao.user_has_warehouse(db, 8, 99, for_update=True)
else:
await AccessDao.user_has_warehouse(db, 8, 99)
statement = db.execute.await_args.args[0]
sql = ' '.join(str(statement.compile(compile_kwargs={'literal_binds': True})).split())
self.assertIs(for_update, 'FOR UPDATE' in sql)
async def test_user_has_site_returns_mapping_existence(self) -> None:
for scalar, expected in ((8, True), (None, False)):
with self.subTest(scalar=scalar):