## 概要 [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の変更 なし ## 動作確認状況 ユニットテスト実施済み ローカルでの動作確認実施済み ## 補足 なし
218 lines
7.7 KiB
TypeScript
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);
|
|
});
|
|
});
|