Merged PR 199: [12-1着手]タイピスト割り当て変更APIのテスト実装

## 概要
[Task2010: [12-1着手]タイピスト割り当て変更APIのテスト実装](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2010)

- タイピスト割り当て変更APIのテスト実装

## レビューポイント
- テストケースは足りているか
- テスト名に不足・違和感はないか
- 各テストでチェックしている内容は妥当か

## UIの変更

## 動作確認状況
- ローカルで確認
## 補足
- 相談、参考資料などがあれば
This commit is contained in:
saito.k 2023-07-04 00:52:28 +00:00
parent 279633ec4b
commit 8c5f5b61c1
2 changed files with 385 additions and 45 deletions

View File

@ -683,49 +683,386 @@ describe('TasksService', () => {
}); });
describe('changeCheckoutPermission', () => { describe('changeCheckoutPermission', () => {
// TODO sqliteを用いたテストを別途実装予定 let source: DataSource = null;
/* beforeEach(async () => {
source = new DataSource({
type: 'sqlite',
database: ':memory:',
Uploadedでない場合 logging: false,
*/ entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
it('タスクのチェックアウト権限を変更できる', async () => { synchronize: true, // trueにすると自動的にmigrationが行われるため注意
const tasksRepositoryMockValue = makeDefaultTasksRepositoryMockValue(); });
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue(); return source.initialize();
const adb2cServiceMockValue = makeDefaultAdb2cServiceMockValue(); });
const service = await makeTasksServiceMock(
tasksRepositoryMockValue,
usersRepositoryMockValue,
adb2cServiceMockValue,
);
expect( afterEach(async () => {
await service.tasksService.changeCheckoutPermission( await source.destroy();
1, source = null;
[], });
'xxx-xxx-xxxx',
['admin'], it('タスクのチェックアウト権限を変更できる。(個人指定)', async () => {
), const module = await makeTestingModule(source);
).toEqual(undefined); const { accountId } = await createAccount(source);
const { userId: typistUserId_1 } = await createUser(
source,
accountId,
'typist-user-external-id',
'typist',
);
const { userId: typistUserId_2 } = await createUser(
source,
accountId,
'typist-user-2-external-id',
'typist',
);
const { userId: authorUserId } = await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
const { taskId } = await createTask(
source,
accountId,
authorUserId,
'MY_AUTHOR_ID',
'',
'01',
'00000001',
'Uploaded',
);
const { userGroupId } = await createUserGroup(
source,
accountId,
'USER_GROUP_A',
[typistUserId_1],
);
await createCheckoutPermissions(source, taskId, typistUserId_1);
await createCheckoutPermissions(source, taskId, undefined, userGroupId);
const service = module.get<TasksService>(TasksService);
await service.changeCheckoutPermission(
1,
[{ typistName: 'typist-user-2', typistUserId: typistUserId_2 }],
'author-user-external-id',
['admin'],
);
const permisions = await getCheckoutPermissions(source, taskId);
expect(permisions.length).toEqual(1);
expect(permisions[0]).toEqual({
id: 3,
task_id: taskId,
user_id: typistUserId_2,
user_group_id: null,
});
});
it('タスクのチェックアウト権限を変更できる。(グループ指定)', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { userId: typistUserId_1 } = await createUser(
source,
accountId,
'typist-user-external-id',
'typist',
);
const { userId: typistUserId_2 } = await createUser(
source,
accountId,
'typist-user-2-external-id',
'typist',
);
const { userId: authorUserId } = await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
const { taskId } = await createTask(
source,
accountId,
authorUserId,
'MY_AUTHOR_ID',
'',
'01',
'00000001',
'Uploaded',
);
const { userGroupId: userGroupId_1 } = await createUserGroup(
source,
accountId,
'USER_GROUP_A',
[typistUserId_1],
);
const { userGroupId: userGroupId_2 } = await createUserGroup(
source,
accountId,
'USER_GROUP_B',
[typistUserId_2],
);
await createCheckoutPermissions(source, taskId, typistUserId_1);
await createCheckoutPermissions(source, taskId, undefined, userGroupId_1);
const service = module.get<TasksService>(TasksService);
await service.changeCheckoutPermission(
1,
[{ typistName: 'USER_GROUP_B', typistGroupId: userGroupId_2 }],
'author-user-external-id',
['admin'],
);
const permisions = await getCheckoutPermissions(source, taskId);
expect(permisions.length).toEqual(1);
expect(permisions[0]).toEqual({
id: 3,
task_id: taskId,
user_id: null,
user_group_id: userGroupId_2,
});
});
it('タスクのチェックアウト権限を変更できる。(チェックアウト権限を外す)', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { userId: typistUserId_1 } = await createUser(
source,
accountId,
'typist-user-external-id',
'typist',
);
const { userId: authorUserId } = await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
const { taskId } = await createTask(
source,
accountId,
authorUserId,
'MY_AUTHOR_ID',
'',
'01',
'00000001',
'Uploaded',
);
const { userGroupId } = await createUserGroup(
source,
accountId,
'USER_GROUP_A',
[typistUserId_1],
);
await createCheckoutPermissions(source, taskId, typistUserId_1);
await createCheckoutPermissions(source, taskId, undefined, userGroupId);
const service = module.get<TasksService>(TasksService);
await service.changeCheckoutPermission(1, [], 'author-user-external-id', [
'admin',
]);
const permisions = await getCheckoutPermissions(source, taskId);
expect(permisions.length).toEqual(0);
}); });
it('ユーザーが存在しない場合、タスクのチェックアウト権限を変更できない', async () => { it('ユーザーが存在しない場合、タスクのチェックアウト権限を変更できない', async () => {
const tasksRepositoryMockValue = makeDefaultTasksRepositoryMockValue(); const module = await makeTestingModule(source);
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue(); const { accountId } = await createAccount(source);
const adb2cServiceMockValue = makeDefaultAdb2cServiceMockValue(); const { userId: typistUserId_1 } = await createUser(
tasksRepositoryMockValue.changeCheckoutPermission = source,
new TasksNotFoundError(); accountId,
const service = await makeTasksServiceMock( 'typist-user-external-id',
tasksRepositoryMockValue, 'typist',
usersRepositoryMockValue,
adb2cServiceMockValue,
); );
const { userId: authorUserId } = await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
const { taskId } = await createTask(
source,
accountId,
authorUserId,
'MY_AUTHOR_ID',
'',
'01',
'00000001',
'Uploaded',
);
const { userGroupId } = await createUserGroup(
source,
accountId,
'USER_GROUP_A',
[typistUserId_1],
);
await createCheckoutPermissions(source, taskId, typistUserId_1);
await createCheckoutPermissions(source, taskId, undefined, userGroupId);
const service = module.get<TasksService>(TasksService);
await expect( await expect(
service.tasksService.changeCheckoutPermission(1, [], 'xxx-xxxx-xxxx', [ service.changeCheckoutPermission(
'admin', 1,
]), [{ typistName: 'not-exist-user', typistUserId: 999 }],
'author-user-external-id',
['admin'],
),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010204'), HttpStatus.BAD_REQUEST),
);
});
it('ユーザーグループが存在しない場合、タスクのチェックアウト権限を変更できない', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { userId: typistUserId_1 } = await createUser(
source,
accountId,
'typist-user-external-id',
'typist',
);
const { userId: authorUserId } = await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
const { taskId } = await createTask(
source,
accountId,
authorUserId,
'MY_AUTHOR_ID',
'',
'01',
'00000001',
'Uploaded',
);
const { userGroupId } = await createUserGroup(
source,
accountId,
'USER_GROUP_A',
[typistUserId_1],
);
await createCheckoutPermissions(source, taskId, typistUserId_1);
await createCheckoutPermissions(source, taskId, undefined, userGroupId);
const service = module.get<TasksService>(TasksService);
await expect(
service.changeCheckoutPermission(
1,
[{ typistName: 'not-exist-user-group', typistGroupId: 999 }],
'author-user-external-id',
['admin'],
),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010204'), HttpStatus.BAD_REQUEST),
);
});
it('タスクが存在しない場合、タスクのチェックアウト権限を変更できない', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { userId: typistUserId } = await createUser(
source,
accountId,
'typist-user-external-id',
'typist',
);
await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
const service = module.get<TasksService>(TasksService);
await expect(
service.changeCheckoutPermission(
1,
[{ typistName: 'typist-user', typistUserId: typistUserId }],
'author-user-external-id',
['admin'],
),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST),
);
});
it('タスクのステータスがUploadedでない場合、タスクのチェックアウト権限を変更できない', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { userId: typistUserId } = await createUser(
source,
accountId,
'typist-user-external-id',
'typist',
);
const { userId: authorUserId } = await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
await createTask(
source,
accountId,
authorUserId,
'MY_AUTHOR_ID',
'',
'01',
'00000001',
'Inprogress',
);
const service = module.get<TasksService>(TasksService);
await expect(
service.changeCheckoutPermission(
1,
[{ typistName: 'typist-user', typistUserId: typistUserId }],
'author-user-external-id',
['admin'],
),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST),
);
});
it('ユーザーのRoleがAuthorでタスクのAuthorIDと自身のAuthorIDが一致しない場合、タスクのチェックアウト権限を変更できない', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { userId: typistUserId } = await createUser(
source,
accountId,
'typist-user-external-id',
'typist',
);
const { userId: authorUserId } = await createUser(
source,
accountId,
'author-user-external-id',
'author',
'MY_AUTHOR_ID',
);
await createTask(
source,
accountId,
authorUserId,
'OTHER_AUTHOR_ID',
'',
'01',
'00000001',
'Uploaded',
);
const service = module.get<TasksService>(TasksService);
await expect(
service.changeCheckoutPermission(
1,
[{ typistName: 'typist-user', typistUserId: typistUserId }],
'author-user-external-id',
['author'],
),
).rejects.toEqual( ).rejects.toEqual(
new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST), new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST),
); );
@ -779,7 +1116,7 @@ describe('checkout', () => {
source, source,
accountId, accountId,
'USER_GROUP_A', 'USER_GROUP_A',
typistUserId, [typistUserId],
); );
await createCheckoutPermissions(source, taskId, typistUserId); await createCheckoutPermissions(source, taskId, typistUserId);
await createCheckoutPermissions(source, taskId, undefined, userGroupId); await createCheckoutPermissions(source, taskId, undefined, userGroupId);
@ -805,7 +1142,7 @@ describe('checkout', () => {
user_id: 1, user_id: 1,
user_group_id: null, user_group_id: null,
}); });
}, 600000); });
it('ユーザーのRoleがTypistで、タスクのチェックアウト権限がグループ指定である時、タスクをチェックアウトできる', async () => { it('ユーザーのRoleがTypistで、タスクのチェックアウト権限がグループ指定である時、タスクをチェックアウトできる', async () => {
const module = await makeTestingModule(source); const module = await makeTestingModule(source);
@ -837,7 +1174,7 @@ describe('checkout', () => {
source, source,
accountId, accountId,
'USER_GROUP_A', 'USER_GROUP_A',
typistUserId, [typistUserId],
); );
await createCheckoutPermissions(source, taskId, typistUserId); await createCheckoutPermissions(source, taskId, typistUserId);
await createCheckoutPermissions(source, taskId, undefined, userGroupId); await createCheckoutPermissions(source, taskId, undefined, userGroupId);

View File

@ -129,7 +129,7 @@ export const createUserGroup = async (
datasource: DataSource, datasource: DataSource,
account_id: number, account_id: number,
user_group_name: string, user_group_name: string,
user_id: number, user_id: number[],
): Promise<{ userGroupId: number }> => { ): Promise<{ userGroupId: number }> => {
const { identifiers: userGroupIdentifiers } = await datasource const { identifiers: userGroupIdentifiers } = await datasource
.getRepository(UserGroup) .getRepository(UserGroup)
@ -140,12 +140,15 @@ export const createUserGroup = async (
updated_by: 'test', updated_by: 'test',
}); });
const userGroup = userGroupIdentifiers.pop() as UserGroup; const userGroup = userGroupIdentifiers.pop() as UserGroup;
await datasource.getRepository(UserGroupMember).insert({ const userGroupMenber = user_id.map((id) => {
user_group_id: userGroup.id, return {
user_id: user_id, user_group_id: userGroup.id,
created_by: 'test', user_id: id,
updated_by: 'test', created_by: 'test',
updated_by: 'test',
};
}); });
await datasource.getRepository(UserGroupMember).save(userGroupMenber);
return { userGroupId: userGroup.id }; return { userGroupId: userGroup.id };
}; };