OMDSCloud/dictation_server/src/features/users/users.controller.spec.ts
湯本 開 71127a6db9 Merged PR 787: API I/F修正
## 概要
[Task3793: API I/F修正](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3793)

- OMDS様とのメール文面調整の結果、csvファイル名もAPIで受け渡す必要が出てきたためAPI I/Fを修正する
  - 一括登録依頼API、一括登録完了APIの両方に「ファイル名」を追加
- 増えたプロパティのバリデーションをするテストを追加

## レビューポイント
- プロパティ名は妥当か
- テストの内容は十分か

## 動作確認状況
- npm run testを通過
2024-02-28 05:30:09 +00:00

576 lines
16 KiB
TypeScript

import { Test, TestingModule } from '@nestjs/testing';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { ConfigModule } from '@nestjs/config';
import { AuthService } from '../auth/auth.service';
import {
PostMultipleImportsCompleteRequest,
PostMultipleImportsRequest,
} from './types/types';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';
describe('UsersController', () => {
let controller: UsersController;
const mockUserService = {};
const mockAuthService = {};
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [
ConfigModule.forRoot({
envFilePath: ['.env.test', '.env'],
isGlobal: true,
}),
],
controllers: [UsersController],
providers: [UsersService, AuthService],
})
.overrideProvider(UsersService)
.useValue(mockUserService)
.overrideProvider(AuthService)
.useValue(mockAuthService)
.compile();
controller = module.get<UsersController>(UsersController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
describe('valdation PostMultipleImportsRequest', () => {
it('role:noneの最低限の有効なリクエストが成功する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 0,
autoRenew: 0,
notification: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(0);
});
it('role:authorの最低限の有効なリクエストが成功する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
encryption: 0,
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(0);
});
it('emailがメールアドレスではない場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge',
role: 0,
autoRenew: 0,
notification: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('AuthorなのにAuthorIDがない場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
autoRenew: 0,
notification: 0,
encryption: 0,
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('AuthorIDがルールに違反していた場合、バリデーションエラーが発生する', async () => {
// ルールに合致したAuthorIDではエラーが発生しない
const validAuthorIDs = ['A', '_', 'AB', 'A1', '1A', '_1', 'A_B'];
for await (const authorId of validAuthorIDs) {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: authorId,
autoRenew: 0,
notification: 0,
encryption: 0,
prompt: 0,
},
];
const valdationObject = plainToClass(
PostMultipleImportsRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(0);
}
// ルールに違反したAuthorIDではエラーが発生する
const invalidAuthorIDs = ['a', '+', 'AB.', 'Ab', '1a', '_.', 'A/B', ''];
for await (const authorId of invalidAuthorIDs) {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: authorId,
autoRenew: 0,
notification: 0,
encryption: 0,
prompt: 0,
},
];
const valdationObject = plainToClass(
PostMultipleImportsRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
}
});
it('Authorなのにencryptionがない場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('Authorなのにpromptがない場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
encryption: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('Authorでencryption:trueなのに、encryptionPasswordがない場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
encryption: 1,
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('Authorでencryption:trueでencryptionPasswordが正常であれば成功する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
encryption: 1,
encryptionPassword: 'abcd',
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(0);
});
it('encryptionPasswordが要件外(短い)の場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
encryption: 1,
encryptionPassword: 'abc',
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('encryptionPasswordが要件外(長い)の場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
encryption: 1,
encryptionPassword: 'abcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('encryptionPasswordが要件外(全角が含まれる)の場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'AUTHOR',
autoRenew: 0,
notification: 0,
encryption: 1,
encryptionPassword: 'abcあいうえお',
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('AuthorIDが要件外(小文字)の場合、バリデーションエラーが発生する', async () => {
const request = new PostMultipleImportsRequest();
request.filename = 'test.csv';
request.users = [
{
name: 'namae',
email: 'hogehoge@example.com',
role: 1,
authorId: 'author',
autoRenew: 0,
notification: 0,
encryption: 1,
encryptionPassword: 'abc',
prompt: 0,
},
];
const valdationObject = plainToClass(PostMultipleImportsRequest, request);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
});
describe('valdation PostMultipleImportsCompleteRequest', () => {
it('最低限の有効なリクエストが成功する', async () => {
const request = new PostMultipleImportsCompleteRequest();
request.accountId = 1;
request.requestTime = new Date().getTime();
request.filename = 'test.csv';
request.errors = [];
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(0);
});
it('ファイル名が存在しなかった場合、バリデーションエラーが発生する', async () => {
const request = {
accountId: 1,
requestTime: new Date().getTime(),
errors: [],
};
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('エラーが存在するリクエストが成功する', async () => {
const request = new PostMultipleImportsCompleteRequest();
request.accountId = 1;
request.requestTime = new Date().getTime();
request.filename = 'test.csv';
request.errors = [
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
];
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(0);
});
it('名前が足りないエラーがある場合、バリデーションエラーが発生する', async () => {
const request = {
accountId: 1,
filename: 'test.csv',
requestTime: new Date().getTime(),
errors: [
{
line: 1,
errorCode: 'E1101',
},
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
],
};
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('行指定が足りないエラーがある場合、バリデーションエラーが発生する', async () => {
const request = {
accountId: 1,
filename: 'test.csv',
requestTime: new Date().getTime(),
errors: [
{
name: 'namae',
errorCode: 'E1101',
},
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
],
};
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('errorCodeが足りないエラーがある場合、バリデーションエラーが発生する', async () => {
const request = {
accountId: 1,
filename: 'test.csv',
requestTime: new Date().getTime(),
errors: [
{
name: 'namae',
line: 1,
},
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
],
};
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('名前が空のエラーがある場合、バリデーションエラーが発生する', async () => {
const request = {
accountId: 1,
filename: 'test.csv',
requestTime: new Date().getTime(),
errors: [
{
name: '',
line: 1,
errorCode: 'E1101',
},
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
],
};
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('行数が空のエラーがある場合、バリデーションエラーが発生する', async () => {
const request = {
accountId: 1,
filename: 'test.csv',
requestTime: new Date().getTime(),
errors: [
{
name: 'namae',
errorCode: 'E1101',
},
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
],
};
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
it('エラーコードが空のエラーがある場合、バリデーションエラーが発生する', async () => {
const request = {
accountId: 1,
filename: 'test.csv',
requestTime: new Date().getTime(),
errors: [
{
name: 'namae',
line: 1,
errorCode: '',
},
{
name: 'namae',
line: 1,
errorCode: 'E1101',
},
],
};
const valdationObject = plainToClass(
PostMultipleImportsCompleteRequest,
request,
);
const errors = await validate(valdationObject);
expect(errors.length).toBe(1);
});
});
});