feat: 결재·마스터 실연동 업데이트
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
|
||||
import 'package:superport_v2/core/common/models/paginated_result.dart';
|
||||
import 'package:superport_v2/core/permissions/permission_manager.dart';
|
||||
import 'package:superport_v2/core/permissions/permission_resources.dart';
|
||||
import 'package:superport_v2/features/masters/group_permission/application/permission_synchronizer.dart';
|
||||
import 'package:superport_v2/features/masters/group_permission/domain/entities/group_permission.dart';
|
||||
import 'package:superport_v2/features/masters/group_permission/domain/repositories/group_permission_repository.dart';
|
||||
|
||||
class _MockGroupPermissionRepository extends Mock
|
||||
implements GroupPermissionRepository {}
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
test('그룹 권한을 모두 불러와 PermissionManager에 적용한다', () async {
|
||||
final repository = _MockGroupPermissionRepository();
|
||||
final manager = PermissionManager();
|
||||
final synchronizer = PermissionSynchronizer(
|
||||
repository: repository,
|
||||
manager: manager,
|
||||
pageSize: 1,
|
||||
);
|
||||
|
||||
final permissionPage1 = GroupPermission(
|
||||
id: 1,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 10,
|
||||
menuCode: 'INBOUND',
|
||||
menuName: '입고',
|
||||
path: '/inventory/inbound',
|
||||
),
|
||||
canCreate: true,
|
||||
canRead: true,
|
||||
canUpdate: false,
|
||||
canDelete: false,
|
||||
);
|
||||
|
||||
final permissionPage2 = GroupPermission(
|
||||
id: 2,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 11,
|
||||
menuCode: 'OUTBOUND',
|
||||
menuName: '출고',
|
||||
path: '/inventory/outbound',
|
||||
),
|
||||
canCreate: false,
|
||||
canRead: true,
|
||||
canUpdate: true,
|
||||
canDelete: false,
|
||||
);
|
||||
|
||||
when(
|
||||
() => repository.list(
|
||||
page: any(named: 'page'),
|
||||
pageSize: any(named: 'pageSize'),
|
||||
groupId: any(named: 'groupId'),
|
||||
menuId: any(named: 'menuId'),
|
||||
isActive: any(named: 'isActive'),
|
||||
includeDeleted: any(named: 'includeDeleted'),
|
||||
),
|
||||
).thenAnswer((invocation) async {
|
||||
final page = invocation.namedArguments[#page] as int;
|
||||
if (page == 1) {
|
||||
return PaginatedResult<GroupPermission>(
|
||||
items: [permissionPage1],
|
||||
page: 1,
|
||||
pageSize: 1,
|
||||
total: 2,
|
||||
);
|
||||
}
|
||||
return PaginatedResult<GroupPermission>(
|
||||
items: [permissionPage2],
|
||||
page: 2,
|
||||
pageSize: 1,
|
||||
total: 2,
|
||||
);
|
||||
});
|
||||
|
||||
await synchronizer.syncForGroup(1);
|
||||
|
||||
verify(
|
||||
() => repository.list(
|
||||
page: any(named: 'page'),
|
||||
pageSize: 1,
|
||||
groupId: 1,
|
||||
menuId: null,
|
||||
isActive: true,
|
||||
includeDeleted: false,
|
||||
),
|
||||
).called(greaterThanOrEqualTo(1));
|
||||
|
||||
expect(
|
||||
manager.can(
|
||||
PermissionResources.stockTransactions,
|
||||
PermissionAction.create,
|
||||
),
|
||||
isTrue,
|
||||
);
|
||||
expect(
|
||||
manager.can(PermissionResources.stockTransactions, PermissionAction.edit),
|
||||
isTrue,
|
||||
);
|
||||
expect(
|
||||
manager.can(
|
||||
PermissionResources.stockTransactions,
|
||||
PermissionAction.delete,
|
||||
),
|
||||
isFalse,
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:superport_v2/core/permissions/permission_manager.dart';
|
||||
import 'package:superport_v2/core/permissions/permission_resources.dart';
|
||||
import 'package:superport_v2/features/masters/group_permission/domain/entities/group_permission.dart';
|
||||
import 'package:superport_v2/features/masters/group_permission/domain/mappers/group_permission_mapper.dart';
|
||||
|
||||
void main() {
|
||||
test('메뉴 경로 기준으로 권한 맵을 생성한다', () {
|
||||
final permissions = [
|
||||
GroupPermission(
|
||||
id: 1,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 10,
|
||||
menuCode: 'INBOUND',
|
||||
menuName: '입고',
|
||||
path: '/inventory/inbound',
|
||||
),
|
||||
canCreate: true,
|
||||
canRead: true,
|
||||
canUpdate: false,
|
||||
canDelete: false,
|
||||
),
|
||||
GroupPermission(
|
||||
id: 2,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 11,
|
||||
menuCode: 'OUTBOUND',
|
||||
menuName: '출고',
|
||||
path: '/inventory/outbound',
|
||||
),
|
||||
canCreate: false,
|
||||
canRead: true,
|
||||
canUpdate: true,
|
||||
canDelete: true,
|
||||
),
|
||||
GroupPermission(
|
||||
id: 3,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 12,
|
||||
menuCode: 'NO_PATH',
|
||||
menuName: '경로없음',
|
||||
path: null,
|
||||
),
|
||||
canCreate: true,
|
||||
canRead: true,
|
||||
canUpdate: true,
|
||||
canDelete: true,
|
||||
),
|
||||
];
|
||||
|
||||
final map = buildPermissionMap(permissions);
|
||||
|
||||
expect(map.length, 1);
|
||||
final stockPermissions =
|
||||
map[PermissionResources.stockTransactions] ?? <PermissionAction>{};
|
||||
expect(
|
||||
stockPermissions,
|
||||
containsAll(<PermissionAction>{
|
||||
PermissionAction.view,
|
||||
PermissionAction.create,
|
||||
PermissionAction.edit,
|
||||
PermissionAction.delete,
|
||||
}),
|
||||
);
|
||||
expect(map.containsKey('NO_PATH'), isFalse);
|
||||
});
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
|
||||
import 'package:superport_v2/core/common/models/paginated_result.dart';
|
||||
import 'package:superport_v2/core/permissions/permission_manager.dart';
|
||||
import 'package:superport_v2/features/masters/group/domain/entities/group.dart';
|
||||
import 'package:superport_v2/features/masters/group/domain/repositories/group_repository.dart';
|
||||
import 'package:superport_v2/features/masters/group_permission/domain/entities/group_permission.dart';
|
||||
@@ -24,11 +25,17 @@ void main() {
|
||||
late _MockPermissionRepository permissionRepository;
|
||||
late _MockGroupRepository groupRepository;
|
||||
late _MockMenuRepository menuRepository;
|
||||
late PermissionManager permissionManager;
|
||||
|
||||
final samplePermission = GroupPermission(
|
||||
id: 1,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(id: 10, menuName: '대시보드'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 10,
|
||||
menuCode: 'DASHBOARD',
|
||||
menuName: '대시보드',
|
||||
path: '/dashboard',
|
||||
),
|
||||
canCreate: true,
|
||||
canRead: true,
|
||||
canUpdate: false,
|
||||
@@ -52,10 +59,22 @@ void main() {
|
||||
permissionRepository = _MockPermissionRepository();
|
||||
groupRepository = _MockGroupRepository();
|
||||
menuRepository = _MockMenuRepository();
|
||||
permissionManager = PermissionManager();
|
||||
when(
|
||||
() => permissionRepository.list(
|
||||
page: any(named: 'page'),
|
||||
pageSize: any(named: 'pageSize'),
|
||||
groupId: any(named: 'groupId'),
|
||||
menuId: any(named: 'menuId'),
|
||||
isActive: any(named: 'isActive'),
|
||||
includeDeleted: any(named: 'includeDeleted'),
|
||||
),
|
||||
).thenAnswer((_) async => createResult([samplePermission]));
|
||||
controller = GroupPermissionController(
|
||||
permissionRepository: permissionRepository,
|
||||
groupRepository: groupRepository,
|
||||
menuRepository: menuRepository,
|
||||
permissionManager: permissionManager,
|
||||
);
|
||||
});
|
||||
|
||||
@@ -68,6 +87,8 @@ void main() {
|
||||
query: any(named: 'query'),
|
||||
isDefault: any(named: 'isDefault'),
|
||||
isActive: any(named: 'isActive'),
|
||||
includePermissions: any(named: 'includePermissions'),
|
||||
includeEmployees: any(named: 'includeEmployees'),
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => PaginatedResult<Group>(
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:mocktail/mocktail.dart';
|
||||
import 'package:shadcn_ui/shadcn_ui.dart';
|
||||
|
||||
import 'package:superport_v2/core/common/models/paginated_result.dart';
|
||||
import 'package:superport_v2/core/permissions/permission_manager.dart';
|
||||
import 'package:superport_v2/features/masters/group/domain/entities/group.dart';
|
||||
import 'package:superport_v2/features/masters/group/domain/repositories/group_repository.dart';
|
||||
import 'package:superport_v2/features/masters/group_permission/domain/entities/group_permission.dart';
|
||||
@@ -24,13 +25,16 @@ class _MockMenuRepository extends Mock implements MenuRepository {}
|
||||
class _FakeGroupPermissionInput extends Fake implements GroupPermissionInput {}
|
||||
|
||||
Widget _buildApp(Widget child) {
|
||||
return MaterialApp(
|
||||
home: ShadTheme(
|
||||
data: ShadThemeData(
|
||||
colorScheme: const ShadSlateColorScheme.light(),
|
||||
brightness: Brightness.light,
|
||||
return PermissionScope(
|
||||
manager: PermissionManager(),
|
||||
child: MaterialApp(
|
||||
home: ShadTheme(
|
||||
data: ShadThemeData(
|
||||
colorScheme: const ShadSlateColorScheme.light(),
|
||||
brightness: Brightness.light,
|
||||
),
|
||||
child: Scaffold(body: child),
|
||||
),
|
||||
child: Scaffold(body: child),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -80,6 +84,8 @@ void main() {
|
||||
query: any(named: 'query'),
|
||||
isDefault: any(named: 'isDefault'),
|
||||
isActive: any(named: 'isActive'),
|
||||
includePermissions: any(named: 'includePermissions'),
|
||||
includeEmployees: any(named: 'includeEmployees'),
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => PaginatedResult<Group>(
|
||||
@@ -125,7 +131,12 @@ void main() {
|
||||
GroupPermission(
|
||||
id: 1,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(id: 10, menuName: '대시보드'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 10,
|
||||
menuCode: 'DASHBOARD',
|
||||
menuName: '대시보드',
|
||||
path: '/dashboard',
|
||||
),
|
||||
canCreate: true,
|
||||
canRead: true,
|
||||
),
|
||||
@@ -201,7 +212,12 @@ void main() {
|
||||
GroupPermission(
|
||||
id: 5,
|
||||
group: GroupPermissionGroup(id: 1, groupName: '관리자'),
|
||||
menu: GroupPermissionMenu(id: 10, menuName: '대시보드'),
|
||||
menu: GroupPermissionMenu(
|
||||
id: 10,
|
||||
menuCode: 'DASHBOARD',
|
||||
menuName: '대시보드',
|
||||
path: '/dashboard',
|
||||
),
|
||||
canCreate: true,
|
||||
canRead: true,
|
||||
),
|
||||
@@ -226,7 +242,9 @@ void main() {
|
||||
),
|
||||
menu: GroupPermissionMenu(
|
||||
id: capturedInput!.menuId,
|
||||
menuCode: 'DASHBOARD',
|
||||
menuName: '대시보드',
|
||||
path: '/dashboard',
|
||||
),
|
||||
canCreate: capturedInput!.canCreate,
|
||||
canRead: capturedInput!.canRead,
|
||||
|
||||
Reference in New Issue
Block a user