OMDSCloud/dictation_server/src/features/licenses/licenses.service.spec.ts
maruyama.t ceea4920f6 Merged PR 186: API実装(カードライセンス発行API)
## 概要
[Task1992: API実装(カードライセンス発行API)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/1992)

- タスク 1992: API実装(カードライセンス発行API)
-カードライセンス発行APIを実装

## レビューポイント
- DB登録時の処理が適切かどうか

## UIの変更
なし

## 動作確認状況
ユニットテスト実施済み
ローカルでの動作確認実施済み

## 補足
なし
2023-07-04 08:58:28 +00:00

218 lines
7.7 KiB
TypeScript

import { AccessToken } from '../../common/token';
import {
CreateOrdersRequest,
IssueCardLicensesRequest,
IssueCardLicensesResponse,
} from './types/types';
import {
makeDefaultAccountsRepositoryMockValue,
makeDefaultLicensesRepositoryMockValue,
makeDefaultUsersRepositoryMockValue,
makeLicensesServiceMock,
} from './test/liscense.service.mock';
import { makeErrorResponse } from '../../common/error/makeErrorResponse';
import { HttpException, HttpStatus } from '@nestjs/common';
import { PoNumberAlreadyExistError } from '../../repositories/licenses/errors/types';
import { LicensesService } from './licenses.service';
import { makeTestingModule } from '../../common/test/modules';
import { DataSource } from 'typeorm';
import {
createAccount,
createUser,
selectCardLicensesCount,
} from './test/utility';
describe('LicensesService', () => {
it('ライセンス注文が完了する', async () => {
const lisencesRepositoryMockValue =
makeDefaultLicensesRepositoryMockValue();
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const accountsRepositoryMockValue =
makeDefaultAccountsRepositoryMockValue();
const service = await makeLicensesServiceMock(
lisencesRepositoryMockValue,
usersRepositoryMockValue,
accountsRepositoryMockValue,
);
const body = new CreateOrdersRequest();
const token: AccessToken = { userId: '0001', role: '', tier: 5 };
body.orderCount = 1000;
body.poNumber = '1';
expect(
await service.licenseOrders(token, body.poNumber, body.orderCount),
).toEqual(undefined);
});
it('ユーザID取得できなかった場合、エラーとなる', async () => {
const lisencesRepositoryMockValue =
makeDefaultLicensesRepositoryMockValue();
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
usersRepositoryMockValue.findUserByExternalId = new Error(
'User not Found Error.',
);
const accountsRepositoryMockValue =
makeDefaultAccountsRepositoryMockValue();
const service = await makeLicensesServiceMock(
lisencesRepositoryMockValue,
usersRepositoryMockValue,
accountsRepositoryMockValue,
);
const body = new CreateOrdersRequest();
const token: AccessToken = { userId: '', role: '', tier: 5 };
body.orderCount = 1000;
body.poNumber = '1';
await expect(
service.licenseOrders(token, body.poNumber, body.orderCount),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
it('親ユーザID取得できなかった場合、エラーとなる', async () => {
const lisencesRepositoryMockValue =
makeDefaultLicensesRepositoryMockValue();
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
usersRepositoryMockValue.findUserByExternalId = new Error(
'Account not Found Error.',
);
const accountsRepositoryMockValue =
makeDefaultAccountsRepositoryMockValue();
const service = await makeLicensesServiceMock(
lisencesRepositoryMockValue,
usersRepositoryMockValue,
accountsRepositoryMockValue,
);
const body = new CreateOrdersRequest();
const token: AccessToken = { userId: '0001', role: '', tier: 5 };
body.orderCount = 1000;
body.poNumber = '1';
await expect(
service.licenseOrders(token, body.poNumber, body.orderCount),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
it('POナンバー重複時、エラーとなる', async () => {
const lisencesRepositoryMockValue =
makeDefaultLicensesRepositoryMockValue();
lisencesRepositoryMockValue.order = new PoNumberAlreadyExistError();
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const accountsRepositoryMockValue =
makeDefaultAccountsRepositoryMockValue();
const service = await makeLicensesServiceMock(
lisencesRepositoryMockValue,
usersRepositoryMockValue,
accountsRepositoryMockValue,
);
const body = new CreateOrdersRequest();
const token: AccessToken = { userId: '0001', role: '', tier: 5 };
body.orderCount = 1000;
body.poNumber = '1';
await expect(
service.licenseOrders(token, body.poNumber, body.orderCount),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E010401'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
it('カードライセンス発行が完了する', async () => {
const lisencesRepositoryMockValue =
makeDefaultLicensesRepositoryMockValue();
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const accountsRepositoryMockValue =
makeDefaultAccountsRepositoryMockValue();
const service = await makeLicensesServiceMock(
lisencesRepositoryMockValue,
usersRepositoryMockValue,
accountsRepositoryMockValue,
);
const body = new IssueCardLicensesRequest();
const token: AccessToken = { userId: '0001', role: '', tier: 5 };
body.createCount = 10;
const issueCardLicensesResponse: IssueCardLicensesResponse = {
cardLicenseKeys: [
'WZCETXC0Z9PQZ9GKRGGY',
'F0JD7EZEDBH4PQRQ83YF',
'H0HXBP5K9RW7T7JSVDJV',
'HKIWX54EESYL4X132223',
'363E81JR460UBHXGFXFI',
'70IKAPV9K6YMEVLTOXBY',
'1RJY1TRRYYTGF1LL9WLU',
'BXM0HKFO7IULTL0A1B36',
'XYLEWNY2LR6Q657CZE41',
'AEJWRFFSWRQYQQJ6WVLV',
],
};
expect(
await service.issueCardLicenseKeys(token.userId, body.createCount),
).toEqual(issueCardLicensesResponse);
});
it('カードライセンス発行に失敗した場合、エラーになる', async () => {
const lisencesRepositoryMockValue =
makeDefaultLicensesRepositoryMockValue();
lisencesRepositoryMockValue.createCardLicenses = new Error('DB failed');
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const accountsRepositoryMockValue =
makeDefaultAccountsRepositoryMockValue();
const service = await makeLicensesServiceMock(
lisencesRepositoryMockValue,
usersRepositoryMockValue,
accountsRepositoryMockValue,
);
const body = new IssueCardLicensesRequest();
const token: AccessToken = { userId: '0001', role: '', tier: 5 };
body.createCount = 1000;
await expect(
service.issueCardLicenseKeys(token.userId, body.createCount),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
});
describe('DBテスト', () => {
let source: DataSource = 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 () => {
await source.destroy();
source = null;
});
it('カードライセンス発行が完了する(発行数が合っているか確認)', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId } = await createUser(
source,
accountId,
'userId',
'admin',
);
const service = module.get<LicensesService>(LicensesService);
const issueCount = 1000;
await service.issueCardLicenseKeys(externalId, issueCount);
const dbSelectResult = await selectCardLicensesCount(source);
expect(dbSelectResult.count).toEqual(issueCount);
});
});