OMDSCloud/dictation_server/src/features/workflows/workflows.service.spec.ts
saito.k 45b2cad30c Merged PR 624: クエリログに追跡用IDと実行日時を追加する(各作業まとめブランチ)
## 概要
[Task3309: 修正をまとめる用のブランチ](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3309)

- 元PBI or タスクへのリンク(内容・目的などはそちらにあるはず)
- 何をどう変更したか、追加したライブラリなど
- このPull Requestでの対象/対象外
- 影響範囲(他の機能にも影響があるか)

## レビューポイント
- 特にレビューしてほしい箇所
- 軽微なものや自明なものは記載不要
- 修正範囲が大きい場合などに記載
- 全体的にや仕様を満たしているか等は本当に必要な時のみ記載

## UIの変更
- Before/Afterのスクショなど
- スクショ置き場

## 動作確認状況
- ローカルで確認、develop環境で確認など

## 補足
- 相談、参考資料などがあれば
2023-12-13 01:07:36 +00:00

2659 lines
78 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { DataSource } from 'typeorm';
import { makeTestingModule } from '../../common/test/modules';
import { makeTestAccount, makeTestUser } from '../../common/test/utility';
import { makeContext } from '../../common/log';
import { WorkflowsService } from './workflows.service';
import { USER_ROLES } from '../../constants';
import { createTemplateFile } from '../templates/test/utility';
import { createWorktype } from '../accounts/test/utility';
import {
createWorkflow,
createWorkflowTypist,
getAllWorkflowTypists,
getAllWorkflows,
getWorkflowTypists,
getWorkflows,
} from './test/utility';
import { createUserGroup } from '../users/test/utility';
import { overrideAdB2cService } from '../../common/test/overrides';
import { WorkflowsRepositoryService } from '../../repositories/workflows/workflows.repository.service';
import { HttpException, HttpStatus } from '@nestjs/common';
import { makeErrorResponse } from '../../common/error/makeErrorResponse';
describe('getWorkflows', () => {
let source: DataSource | null = null;
beforeEach(async () => {
source = new DataSource({
type: 'sqlite',
database: ':memory:',
logging: false,
entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
synchronize: true, // trueにすると自動的にmigrationが行われるため注意
});
return source.initialize();
});
afterEach(async () => {
if (!source) return;
await source.destroy();
source = null;
});
it('アカウント内のWorkflow一覧を取得できる', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId3 } = await makeTestUser(source, {
external_id: 'author3',
author_id: 'AUTHOR3',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId, external_id: typistExternalId } = await makeTestUser(
source,
{
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
},
);
const { userGroupId } = await createUserGroup(
source,
account.id,
'group1',
[typistId],
);
const { id: worktypeId1 } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId1 } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const workflow1 = await createWorkflow(
source,
account.id,
authorId1,
worktypeId1,
templateId1,
);
const workflow2 = await createWorkflow(
source,
account.id,
authorId2,
undefined,
templateId1,
);
const workflow3 = await createWorkflow(
source,
account.id,
authorId3,
worktypeId1,
undefined,
);
await createWorkflowTypist(source, workflow1.id, typistId, undefined);
await createWorkflowTypist(source, workflow2.id, undefined, userGroupId);
await createWorkflowTypist(source, workflow3.id, undefined, userGroupId);
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(3);
expect(workflows[0].id).toBe(workflow1.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(worktypeId1);
expect(workflows[0].template_id).toBe(templateId1);
expect(workflows[1].id).toBe(workflow2.id);
expect(workflows[1].author_id).toBe(authorId2);
expect(workflows[1].worktype_id).toBe(null);
expect(workflows[1].template_id).toBe(templateId1);
expect(workflows[2].id).toBe(workflow3.id);
expect(workflows[2].author_id).toBe(authorId3);
expect(workflows[2].worktype_id).toBe(worktypeId1);
expect(workflows[2].template_id).toBe(null);
}
overrideAdB2cService(service, {
getUsers: async () => [{ id: typistExternalId, displayName: 'typist1' }],
});
const resWorkflows = await service.getWorkflows(context, admin.external_id);
//実行結果を確認
{
expect(resWorkflows.length).toBe(3);
expect(resWorkflows[0].id).toBe(workflow1.id);
expect(resWorkflows[0].author.id).toBe(authorId1);
expect(resWorkflows[0].author.authorId).toBe('AUTHOR1');
expect(resWorkflows[0].worktype?.id).toBe(worktypeId1);
expect(resWorkflows[0].worktype?.worktypeId).toBe('worktype1');
expect(resWorkflows[0].template?.id).toBe(templateId1);
expect(resWorkflows[0].template?.fileName).toBe('fileName1');
expect(resWorkflows[0].typists.length).toBe(1);
expect(resWorkflows[0].typists[0].typistUserId).toBe(typistId);
expect(resWorkflows[0].typists[0].typistName).toBe('typist1');
expect(resWorkflows[1].id).toBe(workflow2.id);
expect(resWorkflows[1].author.id).toBe(authorId2);
expect(resWorkflows[1].author.authorId).toBe('AUTHOR2');
expect(resWorkflows[1].worktype).toBe(undefined);
expect(resWorkflows[1].template?.id).toBe(templateId1);
expect(resWorkflows[1].template?.fileName).toBe('fileName1');
expect(resWorkflows[1].typists.length).toBe(1);
expect(resWorkflows[1].typists[0].typistGroupId).toBe(userGroupId);
expect(resWorkflows[1].typists[0].typistName).toBe('group1');
expect(resWorkflows[2].id).toBe(workflow3.id);
expect(resWorkflows[2].author.id).toBe(authorId3);
expect(resWorkflows[2].author.authorId).toBe('AUTHOR3');
expect(resWorkflows[2].worktype?.id).toBe(worktypeId1);
expect(resWorkflows[2].worktype?.worktypeId).toBe('worktype1');
expect(resWorkflows[2].template).toBe(undefined);
expect(resWorkflows[2].typists.length).toBe(1);
expect(resWorkflows[2].typists[0].typistGroupId).toBe(userGroupId);
expect(resWorkflows[2].typists[0].typistName).toBe('group1');
}
});
it('アカウント内のWorkflow一覧を取得できる0件', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { admin } = await makeTestAccount(source, { tier: 5 });
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
overrideAdB2cService(service, {
getUsers: async () => [],
});
const resWorkflows = await service.getWorkflows(context, admin.external_id);
//実行結果を確認
{
expect(resWorkflows.length).toBe(0);
}
});
it('DBアクセスに失敗した場合、500エラーを返却する', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//DBアクセスに失敗するようにする
const templatesService = module.get<WorkflowsRepositoryService>(
WorkflowsRepositoryService,
);
templatesService.getWorkflows = jest.fn().mockRejectedValue('DB failed');
//実行結果を確認
try {
await service.getWorkflows(context, admin.external_id);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.INTERNAL_SERVER_ERROR);
expect(e.getResponse()).toEqual(makeErrorResponse('E009999'));
} else {
fail();
}
}
});
});
describe('createWorkflows', () => {
let source: DataSource | null = null;
beforeEach(async () => {
source = new DataSource({
type: 'sqlite',
database: ':memory:',
logging: false,
entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
synchronize: true, // trueにすると自動的にmigrationが行われるため注意
});
return source.initialize();
});
afterEach(async () => {
if (!source) return;
await source.destroy();
source = null;
});
it('アカウント内にWorkflowを作成できるWorktypeIDあり、テンプレートファイルあり', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
worktypeId,
templateId,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId);
expect(workflows[0].worktype_id).toBe(worktypeId);
expect(workflows[0].template_id).toBe(templateId);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId);
expect(workflowTypists[0].typist_group_id).toBe(null);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDなし、テンプレートファイルあり', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
undefined,
templateId,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(templateId);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId);
expect(workflowTypists[0].typist_group_id).toBe(null);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDあり、テンプレートファイルなし', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
worktypeId,
undefined,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId);
expect(workflows[0].worktype_id).toBe(worktypeId);
expect(workflows[0].template_id).toBe(null);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId);
expect(workflowTypists[0].typist_group_id).toBe(null);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDなし、テンプレートファイルなし', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
undefined,
undefined,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId);
expect(workflowTypists[0].typist_group_id).toBe(null);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDなし、テンプレートファイルなし、同一AuthorIDのワークフローあり', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
// 同一AuthorIDのワークフローを作成
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
worktypeId,
undefined,
);
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
undefined,
undefined,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(2);
expect(workflows[1].account_id).toBe(account.id);
expect(workflows[1].author_id).toBe(authorId);
expect(workflows[1].worktype_id).toBe(null);
expect(workflows[1].template_id).toBe(null);
const workflowTypists = await getWorkflowTypists(source, workflows[1].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId);
expect(workflowTypists[0].typist_group_id).toBe(null);
}
});
it('Authorがメール未認証の場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
email_verified: false,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[{ typistId: typistId }],
undefined,
undefined,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('DBにAuthorが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
0,
[
{
typistId: typistId,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('DBにWorktypeIDが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
9999,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E011003'));
} else {
fail();
}
}
});
it('DBにテンプレートファイルが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
worktypeId,
9999,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E012001'));
} else {
fail();
}
}
});
it('DBにルーティング候補ユーザーが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: 9999,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('ルーティング候補ユーザーがメール未認証の場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
email_verified: false,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('DBにルーティング候補グループが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistGroupId: 9999,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010908'));
} else {
fail();
}
}
});
it('DBにAuthorIDとWorktypeIDのペアがすでに存在する場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
await createWorkflow(source, account.id, authorId, worktypeId, templateId);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId);
expect(workflows[0].worktype_id).toBe(worktypeId);
expect(workflows[0].template_id).toBe(templateId);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E013001'));
} else {
fail();
}
}
});
it('DBアクセスに失敗した場合、500エラーを返却する', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//DBアクセスに失敗するようにする
const templatesService = module.get<WorkflowsRepositoryService>(
WorkflowsRepositoryService,
);
templatesService.createtWorkflows = jest
.fn()
.mockRejectedValue('DB failed');
//実行結果を確認
try {
await service.createWorkflow(
context,
admin.external_id,
authorId,
[
{
typistId: typistId,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.INTERNAL_SERVER_ERROR);
expect(e.getResponse()).toEqual(makeErrorResponse('E009999'));
} else {
fail();
}
}
});
});
describe('updateWorkflow', () => {
let source: DataSource | null = null;
beforeEach(async () => {
source = new DataSource({
type: 'sqlite',
database: ':memory:',
logging: false,
entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
synchronize: true, // trueにすると自動的にmigrationが行われるため注意
});
return source.initialize();
});
afterEach(async () => {
if (!source) return;
await source.destroy();
source = null;
});
it('アカウント内のWorkflowを更新できるWorktypeIDあり、テンプレートファイルあり', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: typistId2 } = await makeTestUser(source, {
external_id: 'typist12',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflows[0].id).toBe(preWorkflow.id);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId2,
[
{
typistId: typistId2,
},
],
worktypeId,
templateId,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId2);
expect(workflows[0].worktype_id).toBe(worktypeId);
expect(workflows[0].template_id).toBe(templateId);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId2);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDなし、テンプレートファイルあり', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: typistId2 } = await makeTestUser(source, {
external_id: 'typist12',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflows[0].id).toBe(preWorkflow.id);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId2,
[
{
typistId: typistId2,
},
],
undefined,
templateId,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId2);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(templateId);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId2);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDあり、テンプレートファイルなし', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: typistId2 } = await makeTestUser(source, {
external_id: 'typist12',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflows[0].id).toBe(preWorkflow.id);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId2,
[
{
typistId: typistId2,
},
],
worktypeId,
undefined,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId2);
expect(workflows[0].worktype_id).toBe(worktypeId);
expect(workflows[0].template_id).toBe(null);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId2);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDなし、テンプレートファイルなし', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: typistId2 } = await makeTestUser(source, {
external_id: 'typist12',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflows[0].id).toBe(preWorkflow.id);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId2,
[
{
typistId: typistId2,
},
],
undefined,
undefined,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId2);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
const workflowTypists = await getWorkflowTypists(source, workflows[0].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId2);
}
});
it('アカウント内にWorkflowを作成できるWorktypeIDなし、テンプレートファイルなし、同一AuthorIDのワークフローあり', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: typistId2 } = await makeTestUser(source, {
external_id: 'typist12',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
// 更新対象のワークフローを作成
const preWorkflow1 = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
// 同一AuthorIDのワークフローを作成
const preWorkflow2 = await createWorkflow(
source,
account.id,
authorId2, // 更新するAuthorIDと同じ
worktypeId,
undefined,
);
await createWorkflowTypist(source, preWorkflow1.id, typistId1);
await createWorkflowTypist(source, preWorkflow2.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(2);
expect(workflows[0].id).toBe(preWorkflow1.id);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
expect(workflows[1].id).toBe(preWorkflow2.id);
expect(workflows[1].account_id).toBe(account.id);
expect(workflows[1].author_id).toBe(authorId2);
expect(workflows[1].worktype_id).toBe(worktypeId);
expect(workflows[1].template_id).toBe(null);
expect(workflowTypists.length).toBe(2);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow1.id,
authorId2,
[
{
typistId: typistId2,
},
],
undefined,
undefined,
);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(2);
expect(workflows[1].account_id).toBe(account.id);
expect(workflows[1].author_id).toBe(authorId2);
expect(workflows[1].worktype_id).toBe(null);
expect(workflows[1].template_id).toBe(null);
const workflowTypists = await getWorkflowTypists(source, workflows[1].id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].typist_id).toBe(typistId2);
}
});
it('Authorがメール未認証の場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
email_verified: false,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflows[0].id).toBe(preWorkflow.id);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId2,
[{ typistId: typistId1 }],
undefined,
undefined,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('DBにWorkflowが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
9999,
authorId1,
[
{
typistId: typistId1,
},
],
undefined,
undefined,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E013002'));
} else {
fail();
}
}
});
it('DBにAuthorが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
9999,
[
{
typistId: typistId1,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('DBにWorktypeIDが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId1,
[
{
typistId: typistId1,
},
],
9999,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E011003'));
} else {
fail();
}
}
});
it('DBにテンプレートファイルが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId1,
[
{
typistId: typistId1,
},
],
worktypeId,
9999,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E012001'));
} else {
fail();
}
}
});
it('DBにルーティング候補ユーザーが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId1,
[
{
typistId: 9999,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('Dルーティング候補ユーザーがメール未認証の場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: typistId2 } = await makeTestUser(source, {
external_id: 'typist2',
account_id: account.id,
role: USER_ROLES.TYPIST,
email_verified: false,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId1,
[
{
typistId: typistId2,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010204'));
} else {
fail();
}
}
});
it('DBにルーティング候補グループが存在しない場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId } = await createWorktype(
source,
account.id,
'worktype1',
);
const { id: templateId } = await createTemplateFile(
source,
account.id,
'fileName1',
'url1',
);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId1,
[
{
typistGroupId: 9999,
},
],
worktypeId,
templateId,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010908'));
} else {
fail();
}
}
});
it('DBにAuthorIDとWorktypeIDのペアがすでに存在する場合、400エラーとなること', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const { id: worktypeId1 } = await createWorktype(
source,
account.id,
'worktype1',
);
await createWorkflow(source, account.id, authorId1, worktypeId1, undefined);
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
expect(workflows.length).toBe(2);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId1,
[
{
typistId: typistId1,
},
],
worktypeId1,
undefined,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E013001'));
} else {
fail();
}
}
});
it('DBアクセスに失敗した場合、500エラーを返却する', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId1 } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const preWorkflow = await createWorkflow(
source,
account.id,
authorId1,
undefined,
undefined,
);
await createWorkflowTypist(source, preWorkflow.id, typistId1);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflows[0].id).toBe(preWorkflow.id);
expect(workflows[0].account_id).toBe(account.id);
expect(workflows[0].author_id).toBe(authorId1);
expect(workflows[0].worktype_id).toBe(null);
expect(workflows[0].template_id).toBe(null);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//DBアクセスに失敗するようにする
const workflowsRepositoryService = module.get<WorkflowsRepositoryService>(
WorkflowsRepositoryService,
);
workflowsRepositoryService.updatetWorkflow = jest
.fn()
.mockRejectedValue('DB failed');
//実行結果を確認
try {
await service.updateWorkflow(
context,
admin.external_id,
preWorkflow.id,
authorId1,
[
{
typistId: typistId1,
},
],
undefined,
undefined,
);
fail();
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.INTERNAL_SERVER_ERROR);
expect(e.getResponse()).toEqual(makeErrorResponse('E009999'));
} else {
fail();
}
}
});
});
describe('deleteWorkflows', () => {
let source: DataSource | null = null;
beforeEach(async () => {
source = new DataSource({
type: 'sqlite',
database: ':memory:',
logging: false,
entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
synchronize: true, // trueにすると自動的にmigrationが行われるため注意
});
return source.initialize();
});
afterEach(async () => {
if (!source) return;
await source.destroy();
source = null;
});
it('アカウント内のWorkflowを削除できる', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const workflow = await createWorkflow(
source,
account.id,
authorId,
undefined,
undefined,
);
await createWorkflowTypist(source, workflow.id, typistId);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.deleteWorkflow(context, admin.external_id, workflow.id);
//実行結果を確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(0);
expect(workflowTypists.length).toBe(0);
}
});
it('アカウント内のWorkflowを削除できる複数ワークフローがある場合', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId1 } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: authorId2 } = await makeTestUser(source, {
external_id: 'author2',
author_id: 'AUTHOR2',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const workflow1 = await createWorkflow(source, account.id, authorId1);
await createWorkflowTypist(source, workflow1.id, typistId);
const workflow2 = await createWorkflow(source, account.id, authorId2);
await createWorkflowTypist(source, workflow2.id, typistId);
//作成したデータを確認
{
const workflows = await getAllWorkflows(source);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(2);
expect(workflowTypists.length).toBe(2);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
await service.deleteWorkflow(context, admin.external_id, workflow1.id);
//実行結果を確認
{
const workflows = await getAllWorkflows(source);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflows[0].id).toBe(workflow2.id);
expect(workflowTypists.length).toBe(1);
expect(workflowTypists[0].workflow_id).toBe(workflow2.id);
}
});
it('指定されたワークフローが存在しない場合、400エラーを返却する', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const workflow = await createWorkflow(
source,
account.id,
authorId,
undefined,
undefined,
);
await createWorkflowTypist(source, workflow.id, typistId);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.deleteWorkflow(context, admin.external_id, 9999);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E013002'));
} else {
fail();
}
}
});
it('指定されたワークフローが存在しない場合、400エラーを返却するログインユーザーのアカウント外', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const workflow = await createWorkflow(
source,
account.id,
authorId,
undefined,
undefined,
);
await createWorkflowTypist(source, workflow.id, typistId);
const { account: otherAccount } = await makeTestAccount(source, {
tier: 5,
});
const { id: otherAauthorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: otherAccount.id,
role: USER_ROLES.AUTHOR,
});
const { id: otherTypistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: otherAccount.id,
role: USER_ROLES.TYPIST,
});
const otherWorkflow = await createWorkflow(
source,
otherAccount.id,
otherAauthorId,
undefined,
undefined,
);
await createWorkflowTypist(source, otherWorkflow.id, otherTypistId);
//作成したデータを確認
{
const workflows = await getAllWorkflows(source);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(2);
expect(workflowTypists.length).toBe(2);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//実行結果を確認
try {
await service.deleteWorkflow(
context,
admin.external_id,
otherWorkflow.id,
);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E013002'));
} else {
fail();
}
}
});
it('DBアクセスに失敗した場合、500エラーを返却する', async () => {
if (!source) fail();
const module = await makeTestingModule(source);
if (!module) fail();
// 第五階層のアカウント作成
const { account, admin } = await makeTestAccount(source, { tier: 5 });
const { id: authorId } = await makeTestUser(source, {
external_id: 'author1',
author_id: 'AUTHOR1',
account_id: account.id,
role: USER_ROLES.AUTHOR,
});
const { id: typistId } = await makeTestUser(source, {
external_id: 'typist1',
account_id: account.id,
role: USER_ROLES.TYPIST,
});
const workflow = await createWorkflow(
source,
account.id,
authorId,
undefined,
undefined,
);
await createWorkflowTypist(source, workflow.id, typistId);
//作成したデータを確認
{
const workflows = await getWorkflows(source, account.id);
const workflowTypists = await getAllWorkflowTypists(source);
expect(workflows.length).toBe(1);
expect(workflowTypists.length).toBe(1);
}
const service = module.get<WorkflowsService>(WorkflowsService);
const context = makeContext(admin.external_id, 'requestId');
//DBアクセスに失敗するようにする
const workflowsRepositoryService = module.get<WorkflowsRepositoryService>(
WorkflowsRepositoryService,
);
workflowsRepositoryService.deleteWorkflow = jest
.fn()
.mockRejectedValue('DB failed');
//実行結果を確認
try {
await service.deleteWorkflow(context, admin.external_id, workflow.id);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.INTERNAL_SERVER_ERROR);
expect(e.getResponse()).toEqual(makeErrorResponse('E009999'));
} else {
fail();
}
}
});
});