OMDSCloud/dictation_server/src/features/users/users.service.spec.ts
makabe.t 5690b66e41 Merged PR 338: トライアルライセンスの期限が30日後になっていないので対応
## 概要
[Task2442: トライアルライセンスの期限が30日後になっていないので対応](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2442)

- トライアルライセンスの有効期限をライセンス割り当てと同様にDateのラップクラス内で設定するように修正しました。

## レビューポイント
- 修正内容は適切か

## UIの変更
- なし

## 動作確認状況
- ローカルで確認
2023-08-21 06:24:53 +00:00

2131 lines
62 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 { HttpException, HttpStatus } from '@nestjs/common';
import { AccessToken } from '../../common/token';
import { makeErrorResponse } from '../../common/error/makeErrorResponse';
import {
makeDefaultAdB2cMockValue,
makeDefaultConfigValue,
makeDefaultSendGridlValue,
makeDefaultSortCriteriaRepositoryMockValue,
makeDefaultUsersRepositoryMockValue,
makeUsersServiceMock,
} from './test/users.service.mock';
import { EmailAlreadyVerifiedError } from '../../repositories/users/errors/types';
import {
createAccount,
createAccountAndAdminUser,
createLicense,
createUser,
createUserGroup,
getLicenses,
getUser,
getUserByExternalId,
getUsers,
makeTestingModuleWithAdb2c,
} from './test/utility';
import { DataSource } from 'typeorm';
import { UsersService } from './users.service';
import {
LICENSE_ALLOCATED_STATUS,
LICENSE_EXPIRATION_THRESHOLD_DAYS,
LICENSE_TYPE,
USER_LICENSE_STATUS,
USER_ROLES,
} from '../../constants';
import { makeTestingModule } from '../../common/test/modules';
import { Context, makeContext } from '../../common/log';
import {
overrideAdB2cService,
overrideSendgridService,
overrideUsersRepositoryService,
} from '../../common/test/overrides';
import { NewTrialLicenseExpirationDate } from '../licenses/types/types';
import { License } from '../../repositories/licenses/entity/license.entity';
describe('UsersService.confirmUser', () => {
let source: DataSource = null;
beforeEach(async () => {
source = new DataSource({
type: 'sqlite',
database: ':memory:',
entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
synchronize: true, // trueにすると自動的にmigrationが行われるため注意
});
return source.initialize();
});
afterEach(async () => {
await source.destroy();
source = null;
});
it('ユーザの仮登録時に払い出されるトークンにより、未認証のユーザが認証済みになり、トライアルライセンスが100件作成される', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
await createUser(
source,
accountId,
'externalId_user1',
USER_ROLES.NONE,
undefined,
true,
false,
undefined,
false,
false,
);
const { userId } = await createUser(
source,
accountId,
'externalId_user2',
USER_ROLES.NONE,
undefined,
true,
false,
undefined,
false,
false,
);
const service = module.get<UsersService>(UsersService);
const token =
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw';
await service.confirmUser(token);
//result
const resultUser = await getUser(source, userId);
const resultLicenses = await getLicenses(source, accountId);
// トライアルライセンスは有効期限は今日を起算日として30日後の日付が変わるまで
const expiryDate = new NewTrialLicenseExpirationDate();
const resultLicensesCheckParam: Omit<
License,
'deleted_at' | 'created_by' | 'created_at' | 'updated_at' | 'updated_by'
> = {
id: 0,
expiry_date: resultLicenses[0].expiry_date,
account_id: resultLicenses[0].account_id,
type: resultLicenses[0].type,
status: resultLicenses[0].status,
allocated_user_id: resultLicenses[0].allocated_user_id,
order_id: resultLicenses[0].order_id,
delete_order_id: resultLicenses[0].delete_order_id,
};
expect(resultUser.email_verified).toBe(true);
expect(resultLicenses.length).toBe(100);
expect(resultLicensesCheckParam).toEqual({
id: 0,
expiry_date: expiryDate,
account_id: accountId,
type: LICENSE_TYPE.TRIAL,
status: LICENSE_ALLOCATED_STATUS.UNALLOCATED,
allocated_user_id: null,
order_id: null,
delete_order_id: null,
});
});
it('トークンの形式が不正な場合、形式不正エラーとなる。', async () => {
const module = await makeTestingModule(source);
const token = 'invalid.id.token';
const service = module.get<UsersService>(UsersService);
await expect(service.confirmUser(token)).rejects.toEqual(
new HttpException(makeErrorResponse('E000101'), HttpStatus.BAD_REQUEST),
);
});
it('ユーザが既に認証済みだった場合、認証済みユーザエラーとなる。', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
await createUser(
source,
accountId,
'externalId_user1',
USER_ROLES.NONE,
undefined,
true,
false,
undefined,
false,
false,
);
await createUser(
source,
accountId,
'externalId_user2',
USER_ROLES.NONE,
undefined,
true,
false,
undefined,
false,
true, //emailを認証済みにする
);
const service = module.get<UsersService>(UsersService);
const token =
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw';
await expect(service.confirmUser(token)).rejects.toEqual(
new HttpException(makeErrorResponse('E010202'), HttpStatus.BAD_REQUEST),
);
});
it('ユーザーが存在しない場合は、想定外のエラーとなる', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const token =
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw';
await expect(service.confirmUser(token)).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
});
describe('UsersService.confirmUserAndInitPassword', () => {
it('ユーザーが発行されたパスワードでログインできるようにする', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
usersRepositoryMockValue.findUserById = {
id: 1,
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
email_verified: false,
created_by: 'string;',
created_at: new Date(),
updated_by: 'string;',
updated_at: new Date(),
auto_renew: true,
license_alert: true,
notification: true,
encryption: false,
prompt: false,
};
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
const sendGridMockValue = makeDefaultSendGridlValue();
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendGridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
const token =
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw';
expect(
await service.confirmUserAndInitPassword(
makeContext('trackingId'),
token,
),
).toEqual(undefined);
});
it('トークンの形式が不正な場合、形式不正エラーとなる。(メール認証API)', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
usersRepositoryMockValue.findUserById = {
id: 1,
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
email_verified: false,
created_by: 'string;',
created_at: new Date(),
updated_by: 'string;',
updated_at: new Date(),
auto_renew: true,
license_alert: true,
notification: true,
encryption: false,
prompt: false,
};
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendGridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendGridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
const token = 'invalid.id.token';
await expect(
service.confirmUserAndInitPassword(makeContext('trackingId'), token),
).rejects.toEqual(
new HttpException(makeErrorResponse('E000101'), HttpStatus.BAD_REQUEST),
);
});
it('ユーザが既に認証済みだった場合、認証済みユーザエラーとなる。(メール認証API)', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
usersRepositoryMockValue.findUserById = {
id: 1,
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
email_verified: true,
created_by: 'string;',
created_at: new Date(),
updated_by: 'string;',
updated_at: new Date(),
auto_renew: true,
license_alert: true,
notification: true,
encryption: false,
prompt: false,
};
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendGridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
usersRepositoryMockValue.updateUserVerified =
new EmailAlreadyVerifiedError();
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendGridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
const token =
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw';
await expect(
service.confirmUserAndInitPassword(makeContext('trackingId'), token),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010202'), HttpStatus.BAD_REQUEST),
);
});
it('DBネットワークエラーとなる場合、エラーとなる。(メール認証API)', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
usersRepositoryMockValue.findUserById = {
id: 1,
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
email_verified: false,
created_by: 'string;',
created_at: new Date(),
updated_by: 'string;',
updated_at: new Date(),
auto_renew: true,
license_alert: true,
notification: true,
encryption: false,
prompt: false,
};
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendGridMockValue = makeDefaultSendGridlValue();
usersRepositoryMockValue.updateUserVerified = new Error('DB error');
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendGridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
const token =
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw';
await expect(
service.confirmUserAndInitPassword(makeContext('trackingId'), token),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
});
describe('UsersService.createUser', () => {
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('管理者権限のあるアクセストークンを使用して、新規ユーザが追加される(role:None)', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const {
accountId,
role: adminRole,
tier,
} = await createAccountAndAdminUser(source, adminExternalId);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user1';
const role = USER_ROLES.NONE;
const email = 'test1@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
const externalId = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId };
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
expect(
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
),
).toEqual(undefined);
// 追加されたユーザーが正しくDBに登録されていることを確認
const user = await getUserByExternalId(source, externalId);
expect(user).not.toBeNull();
expect(user.account_id).toEqual(accountId);
expect(user.role).toEqual(role);
expect(user.author_id).toEqual(null);
expect(user.email_verified).toEqual(false);
expect(user.auto_renew).toEqual(autoRenew);
expect(user.license_alert).toEqual(licenseAlert);
expect(user.notification).toEqual(notification);
expect(user.encryption).toEqual(false);
expect(user.encryption_password).toEqual(null);
expect(user.prompt).toEqual(false);
// 他にユーザーが登録されていないことを確認
const users = await getUsers(source);
expect(users.length).toEqual(2);
});
it('管理者権限のあるアクセストークンを使用して、新規ユーザが追加される(role:Author; 暗号化あり)', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const {
accountId,
role: adminRole,
tier,
} = await createAccountAndAdminUser(source, adminExternalId);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user2';
const role = USER_ROLES.AUTHOR;
const email = 'test2@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
const authorId = 'testID';
const encryption = true;
const prompt = true;
const encryptionPassword = 'testPassword';
const externalId = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId };
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
expect(
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
authorId,
encryption,
encryptionPassword,
prompt,
),
).toEqual(undefined);
// 追加されたユーザーが正しくDBに登録されていることを確認
const user = await getUserByExternalId(source, externalId);
expect(user).not.toBeNull();
expect(user.account_id).toEqual(accountId);
expect(user.role).toEqual(role);
expect(user.author_id).toEqual(authorId);
expect(user.email_verified).toEqual(false);
expect(user.auto_renew).toEqual(autoRenew);
expect(user.license_alert).toEqual(licenseAlert);
expect(user.notification).toEqual(notification);
expect(user.encryption).toEqual(encryption);
expect(user.encryption_password).toEqual(encryptionPassword);
expect(user.prompt).toEqual(prompt);
// 他にユーザーが登録されていないことを確認
const users = await getUsers(source);
expect(users.length).toEqual(2);
});
it('管理者権限のあるアクセストークンを使用して、新規ユーザが追加される(role:Author; 暗号化無し)', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const {
accountId,
role: adminRole,
tier,
} = await createAccountAndAdminUser(source, adminExternalId);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user2';
const role = USER_ROLES.AUTHOR;
const email = 'test2@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
const authorId = 'testID';
const encryption = false;
const prompt = true;
const externalId = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId };
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
expect(
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
authorId,
encryption,
undefined,
prompt,
),
).toEqual(undefined);
// 追加されたユーザーが正しくDBに登録されていることを確認
const user = await getUserByExternalId(source, externalId);
expect(user).not.toBeNull();
expect(user.account_id).toEqual(accountId);
expect(user.role).toEqual(role);
expect(user.author_id).toEqual(authorId);
expect(user.email_verified).toEqual(false);
expect(user.auto_renew).toEqual(autoRenew);
expect(user.license_alert).toEqual(licenseAlert);
expect(user.notification).toEqual(notification);
expect(user.encryption).toEqual(encryption);
expect(user.encryption_password).toBeNull();
expect(user.prompt).toEqual(prompt);
// 他にユーザーが登録されていないことを確認
const users = await getUsers(source);
expect(users.length).toEqual(2);
});
it('管理者権限のあるアクセストークンを使用して、新規ユーザが追加される(role:Transcriptioninst)', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const {
accountId,
role: adminRole,
tier,
} = await createAccountAndAdminUser(source, adminExternalId);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user3';
const role = USER_ROLES.TYPIST;
const email = 'test3@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
const externalId = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId };
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
expect(
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
),
).toEqual(undefined);
// 追加されたユーザーが正しくDBに登録されていることを確認
const user = await getUserByExternalId(source, externalId);
expect(user).not.toBeNull();
expect(user.account_id).toEqual(accountId);
expect(user.role).toEqual(role);
expect(user.author_id).toBeNull();
expect(user.email_verified).toEqual(false);
expect(user.auto_renew).toEqual(autoRenew);
expect(user.license_alert).toEqual(licenseAlert);
expect(user.notification).toEqual(notification);
expect(user.encryption).toEqual(false);
expect(user.encryption_password).toBeNull();
expect(user.prompt).toEqual(false);
// 他にユーザーが登録されていないことを確認
const users = await getUsers(source);
expect(users.length).toEqual(2);
});
it('DBネットワークエラーとなる場合、エラーとなる。', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const { role: adminRole, tier } = await createAccountAndAdminUser(
source,
adminExternalId,
);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user1';
const role = USER_ROLES.NONE;
const email = 'test1@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
const externalId = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId };
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
// DBエラーを発生させる
overrideUsersRepositoryService(service, {
createNormalUser: async () => {
throw new Error('DB error');
},
});
try {
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.INTERNAL_SERVER_ERROR);
expect(e.getResponse()).toEqual(makeErrorResponse('E009999'));
} else {
fail();
}
}
});
it('Azure ADB2Cでネットワークエラーとなる場合、エラーとなる。', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const { role: adminRole, tier } = await createAccountAndAdminUser(
source,
adminExternalId,
);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user1';
const role = USER_ROLES.NONE;
const email = 'test1@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
throw new Error('ADB2C error');
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
try {
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.INTERNAL_SERVER_ERROR);
expect(e.getResponse()).toEqual(makeErrorResponse('E009999'));
} else {
fail();
}
}
// ユーザーが登録されていないことを確認
const users = await getUsers(source);
expect(users.length).toEqual(1);
});
it('Azure AD B2C内でメールアドレスが重複している場合、エラーとなる。', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const { role: adminRole, tier } = await createAccountAndAdminUser(
source,
adminExternalId,
);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user1';
const role = USER_ROLES.NONE;
const email = 'test1@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
// Conflictエラーを返す
return {
reason: 'email',
message: 'The email address is already in use by another account.',
};
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
try {
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010301'));
} else {
fail();
}
}
// ユーザーが登録されていないことを確認
const users = await getUsers(source);
expect(users.length).toEqual(1);
});
it('AuthorIDが重複している場合、エラーとなる。(AuthorID重複チェックでエラー)', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const { role: adminRole, tier } = await createAccountAndAdminUser(
source,
adminExternalId,
);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user2';
const role = USER_ROLES.AUTHOR;
const autoRenew = true;
const licenseAlert = true;
const notification = true;
const authorId = 'testID';
const encryption = true;
const prompt = true;
const encryptionPassword = 'testPassword';
const email_1 = 'test_1@example.com';
const externalId_1 = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email_1).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId_1 };
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
expect(
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email_1,
autoRenew,
licenseAlert,
notification,
authorId,
encryption,
encryptionPassword,
prompt,
),
).toEqual(undefined);
{
// 他にユーザーが登録されていないことを確認
const users = await getUsers(source);
expect(users.length).toEqual(2);
}
// Azure Ad B2CのMockをユーザー2用に切り替える
const email_2 = 'test_1@example.com';
const externalId_2 = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email_2).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId_2 };
},
});
try {
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email_2,
autoRenew,
licenseAlert,
notification,
authorId,
encryption,
encryptionPassword,
prompt,
);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010302'));
} else {
fail();
}
}
// 新規にユーザーが登録されていないことを確認
{
const users = await getUsers(source);
expect(users.length).toEqual(2);
}
});
it('AuthorIDが重複している場合、エラーとなる。(insert失敗)', async () => {
const module = await makeTestingModule(source);
const service = module.get<UsersService>(UsersService);
const adminExternalId = 'ADMIN0001';
const { role: adminRole, tier } = await createAccountAndAdminUser(
source,
adminExternalId,
);
const token: AccessToken = {
userId: adminExternalId,
role: adminRole,
tier: tier,
};
const name = 'test_user2';
const role = USER_ROLES.AUTHOR;
const email = 'test2@example.com';
const autoRenew = true;
const licenseAlert = true;
const notification = true;
const authorId = 'testID';
const encryption = true;
const prompt = true;
const encryptionPassword = 'testPassword';
const externalId = '0001';
overrideAdB2cService(service, {
createUser: async (
_context: Context,
_email: string,
_password: string,
_username: string,
) => {
// ユーザー作成時に指定したパラメータが正しく渡されていることを確認
expect(email).toEqual(_email);
expect(name).toEqual(_username);
return { sub: externalId };
},
});
overrideSendgridService(service, {
sendMail: async () => {
return;
},
createMailContentFromEmailConfirmForNormalUser: async () => {
return { html: '', text: '', subject: '' };
},
});
// AuthorIDのUNIQUE制約エラーを発生させる
overrideUsersRepositoryService(service, {
createNormalUser: async () => {
throw { code: 'ER_DUP_ENTRY' };
},
});
try {
await service.createUser(
makeContext('trackingId'),
token,
name,
role,
email,
autoRenew,
licenseAlert,
notification,
authorId,
encryption,
encryptionPassword,
prompt,
);
} catch (e) {
if (e instanceof HttpException) {
expect(e.getStatus()).toEqual(HttpStatus.BAD_REQUEST);
expect(e.getResponse()).toEqual(makeErrorResponse('E010302'));
} else {
fail();
}
}
});
});
describe('UsersService.getUsers', () => {
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 adb2cParam = makeDefaultAdB2cMockValue();
const module = await makeTestingModuleWithAdb2c(source, adb2cParam);
const { accountId } = await createAccount(source);
const { externalId: externalId_author, userId: authorUserId } =
await createUser(
source,
accountId,
'external_id1',
'author',
'AUTHOR_ID',
true,
);
const { userId: typistUserId } = await createUser(
source,
accountId,
'external_id2',
'typist',
undefined,
true,
);
await createUserGroup(source, accountId, 'group1', [typistUserId]);
const { userId: noneUserId } = await createUser(
source,
accountId,
'external_id3',
'none',
undefined,
true,
);
const service = module.get<UsersService>(UsersService);
const expectedUsers = [
{
id: authorUserId,
name: 'test1',
role: 'author',
authorId: 'AUTHOR_ID',
typistGroupName: [],
email: 'test1@mail.com',
emailVerified: true,
autoRenew: true,
licenseAlert: true,
notification: true,
encryption: false,
prompt: false,
expiration: undefined,
remaining: undefined,
licenseStatus: USER_LICENSE_STATUS.NO_LICENSE,
},
{
id: typistUserId,
name: 'test2',
role: 'typist',
authorId: undefined,
typistGroupName: ['group1'],
email: 'test2@mail.com',
emailVerified: true,
autoRenew: true,
licenseAlert: true,
notification: true,
encryption: false,
prompt: false,
expiration: undefined,
remaining: undefined,
licenseStatus: USER_LICENSE_STATUS.NO_LICENSE,
},
{
id: noneUserId,
name: 'test3',
role: 'none',
authorId: undefined,
typistGroupName: [],
email: 'test3@mail.com',
emailVerified: true,
autoRenew: true,
licenseAlert: true,
notification: true,
encryption: false,
prompt: false,
expiration: undefined,
remaining: undefined,
licenseStatus: USER_LICENSE_STATUS.NO_LICENSE,
},
];
expect(await service.getUsers(externalId_author)).toEqual(expectedUsers);
});
it('ユーザーの一覧を取得できること(ライセンス割当済み)', async () => {
const adb2cParam = makeDefaultAdB2cMockValue();
const module = await makeTestingModuleWithAdb2c(source, adb2cParam);
const { accountId } = await createAccount(source);
const { userId: user1, externalId: external_id1 } = await createUser(
source,
accountId,
'external_id1',
'author',
'AUTHOR_ID1',
true,
);
const { userId: user2 } = await createUser(
source,
accountId,
'external_id2',
'author',
'AUTHOR_ID2',
true,
);
const { userId: user3 } = await createUser(
source,
accountId,
'external_id3',
'author',
'AUTHOR_ID3',
false,
);
const date1 = new Date();
date1.setDate(date1.getDate() + LICENSE_EXPIRATION_THRESHOLD_DAYS + 1);
const date2 = new Date();
date2.setDate(date2.getDate() + LICENSE_EXPIRATION_THRESHOLD_DAYS);
const date3 = new Date();
date3.setDate(date3.getDate() + LICENSE_EXPIRATION_THRESHOLD_DAYS - 1);
await createLicense(source, accountId, user1, date1);
await createLicense(source, accountId, user2, date2);
await createLicense(source, accountId, user3, date3);
const service = module.get<UsersService>(UsersService);
const expectedUsers = [
{
id: user1,
name: 'test1',
role: 'author',
authorId: 'AUTHOR_ID1',
typistGroupName: [],
email: 'test1@mail.com',
emailVerified: true,
autoRenew: true,
licenseAlert: true,
notification: true,
encryption: false,
prompt: false,
expiration: `${date1.getFullYear()}/${
date1.getMonth() + 1
}/${date1.getDate()}`,
remaining: LICENSE_EXPIRATION_THRESHOLD_DAYS + 1,
licenseStatus: USER_LICENSE_STATUS.NORMAL,
},
{
id: user2,
name: 'test2',
role: 'author',
authorId: 'AUTHOR_ID2',
typistGroupName: [],
email: 'test2@mail.com',
emailVerified: true,
autoRenew: true,
licenseAlert: true,
notification: true,
encryption: false,
prompt: false,
expiration: `${date2.getFullYear()}/${
date2.getMonth() + 1
}/${date2.getDate()}`,
remaining: LICENSE_EXPIRATION_THRESHOLD_DAYS,
licenseStatus: USER_LICENSE_STATUS.RENEW,
},
{
id: user3,
name: 'test3',
role: 'author',
authorId: 'AUTHOR_ID3',
typistGroupName: [],
email: 'test3@mail.com',
emailVerified: true,
autoRenew: false,
licenseAlert: true,
notification: true,
encryption: false,
prompt: false,
expiration: `${date3.getFullYear()}/${
date3.getMonth() + 1
}/${date3.getDate()}`,
remaining: LICENSE_EXPIRATION_THRESHOLD_DAYS - 1,
licenseStatus: USER_LICENSE_STATUS.ALERT,
},
];
expect(await service.getUsers(external_id1)).toEqual(expectedUsers);
});
it('DBからのユーザーの取得に失敗した場合、エラーとなる', async () => {
const adb2cParam = makeDefaultAdB2cMockValue();
const module = await makeTestingModuleWithAdb2c(source, adb2cParam);
const { accountId } = await createAccount(source);
await createUser(
source,
accountId,
'external_id1',
'author',
'AUTHOR_ID',
true,
);
const service = module.get<UsersService>(UsersService);
await expect(service.getUsers('externalId_failed')).rejects.toEqual(
new HttpException(makeErrorResponse('E009999'), HttpStatus.NOT_FOUND),
);
});
it('ADB2Cからのユーザーの取得に失敗した場合、エラーとなる', async () => {
const adb2cParam = makeDefaultAdB2cMockValue();
adb2cParam.getUsers = new Error('ADB2C error');
const module = await makeTestingModuleWithAdb2c(source, adb2cParam);
const { accountId } = await createAccount(source);
const { externalId: externalId_author } = await createUser(
source,
accountId,
'external_id1',
'author',
'AUTHOR_ID',
true,
);
const service = module.get<UsersService>(UsersService);
await expect(service.getUsers(externalId_author)).rejects.toEqual(
new HttpException(makeErrorResponse('E009999'), HttpStatus.NOT_FOUND),
);
});
});
describe('UsersService.updateSortCriteria', () => {
it('ソート条件を変更できる', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendgridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendgridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
expect(
await service.updateSortCriteria('AUTHOR_ID', 'ASC', {
role: 'none admin',
userId: 'xxxxxxxxxxxx',
tier: 5,
}),
).toEqual(undefined);
});
it('ユーザー情報が存在せず、ソート条件を変更できない', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendgridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
usersRepositoryMockValue.findUserByExternalId = new Error('user not found');
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendgridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
await expect(
service.updateSortCriteria('AUTHOR_ID', 'ASC', {
role: 'none admin',
userId: 'xxxxxxxxxxxx',
tier: 5,
}),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
it('ソート条件が存在せず、ソート条件を変更できない', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendgridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
sortCriteriaRepositoryMockValue.updateSortCriteria = new Error(
'sort criteria not found',
);
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendgridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
await expect(
service.updateSortCriteria('AUTHOR_ID', 'ASC', {
role: 'none admin',
userId: 'xxxxxxxxxxxx',
tier: 5,
}),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
});
describe('UsersService.getSortCriteria', () => {
it('ソート条件を取得できる', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendgridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendgridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
expect(
await service.getSortCriteria({
role: 'none admin',
userId: 'xxxxxxxxxxxx',
tier: 5,
}),
).toEqual({ direction: 'ASC', paramName: 'JOB_NUMBER' });
});
it('ソート条件が存在せず、ソート条件を取得できない', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendgridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
sortCriteriaRepositoryMockValue.getSortCriteria = new Error(
'sort criteria not found',
);
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendgridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
await expect(
service.getSortCriteria({
role: 'none admin',
userId: 'xxxxxxxxxxxx',
tier: 5,
}),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
it('DBから取得した値が不正だった場合、エラーとなる', async () => {
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
const licensesRepositoryMockValue = null;
const adb2cParam = makeDefaultAdB2cMockValue();
const sendgridMockValue = makeDefaultSendGridlValue();
const configMockValue = makeDefaultConfigValue();
const sortCriteriaRepositoryMockValue =
makeDefaultSortCriteriaRepositoryMockValue();
sortCriteriaRepositoryMockValue.getSortCriteria = {
id: 1,
direction: 'AAA',
parameter: 'BBBBB',
user_id: 1,
};
const service = await makeUsersServiceMock(
usersRepositoryMockValue,
licensesRepositoryMockValue,
adb2cParam,
sendgridMockValue,
configMockValue,
sortCriteriaRepositoryMockValue,
);
await expect(
service.getSortCriteria({
role: 'none admin',
userId: 'xxxxxxxxxxxx',
tier: 5,
}),
).rejects.toEqual(
new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
),
);
});
});
describe('UsersService.updateUser', () => {
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('ユーザー情報を更新できるNone', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.NONE,
undefined,
true,
);
const service = module.get<UsersService>(UsersService);
expect(
await service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.NONE,
undefined,
false,
false,
false,
undefined,
undefined,
undefined,
),
).toEqual(undefined);
const createdUser = await getUser(source, user1);
expect(createdUser.id).toBe(user1);
expect(createdUser.role).toBe(USER_ROLES.NONE);
expect(createdUser.author_id).toBeNull();
expect(createdUser.auto_renew).toBe(false);
expect(createdUser.license_alert).toBe(false);
expect(createdUser.notification).toBe(false);
expect(createdUser.encryption).toBe(false);
expect(createdUser.encryption_password).toBeNull();
expect(createdUser.prompt).toBe(false);
});
it('ユーザー情報を更新できるTypist', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.TYPIST,
undefined,
true,
);
const service = module.get<UsersService>(UsersService);
expect(
await service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.TYPIST,
undefined,
false,
false,
false,
undefined,
undefined,
undefined,
),
).toEqual(undefined);
const createdUser = await getUser(source, user1);
expect(createdUser.id).toBe(user1);
expect(createdUser.role).toBe(USER_ROLES.TYPIST);
expect(createdUser.author_id).toBeNull();
expect(createdUser.auto_renew).toBe(false);
expect(createdUser.license_alert).toBe(false);
expect(createdUser.notification).toBe(false);
expect(createdUser.encryption).toBe(false);
expect(createdUser.encryption_password).toBeNull();
expect(createdUser.prompt).toBe(false);
});
it('ユーザー情報を更新できるAuthor', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.AUTHOR,
undefined,
true,
true,
'password',
true,
);
const service = module.get<UsersService>(UsersService);
expect(
await service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.AUTHOR,
'AUTHOR_ID',
false,
false,
false,
true,
'new_password',
true,
),
).toEqual(undefined);
const createdUser = await getUser(source, user1);
expect(createdUser.id).toBe(user1);
expect(createdUser.role).toBe(USER_ROLES.AUTHOR);
expect(createdUser.author_id).toBe('AUTHOR_ID');
expect(createdUser.auto_renew).toBe(false);
expect(createdUser.license_alert).toBe(false);
expect(createdUser.notification).toBe(false);
expect(createdUser.encryption).toBe(true);
expect(createdUser.encryption_password).toBe('new_password');
expect(createdUser.prompt).toBe(true);
});
it('ユーザーのRoleを更新できるNone⇒Typist', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.NONE,
undefined,
true,
);
const service = module.get<UsersService>(UsersService);
expect(
await service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.TYPIST,
undefined,
false,
false,
false,
undefined,
undefined,
undefined,
),
).toEqual(undefined);
const createdUser = await getUser(source, user1);
expect(createdUser.id).toBe(user1);
expect(createdUser.role).toBe(USER_ROLES.TYPIST);
expect(createdUser.author_id).toBeNull();
expect(createdUser.auto_renew).toBe(false);
expect(createdUser.license_alert).toBe(false);
expect(createdUser.notification).toBe(false);
expect(createdUser.encryption).toBe(false);
expect(createdUser.encryption_password).toBeNull();
expect(createdUser.prompt).toBe(false);
});
it('ユーザーのRoleを更新できるNone⇒Author', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.NONE,
undefined,
true,
);
const service = module.get<UsersService>(UsersService);
expect(
await service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.AUTHOR,
'AUTHOR_ID',
false,
false,
false,
false,
undefined,
false,
),
).toEqual(undefined);
const createdUser = await getUser(source, user1);
expect(createdUser.id).toBe(user1);
expect(createdUser.role).toBe(USER_ROLES.AUTHOR);
expect(createdUser.author_id).toBe('AUTHOR_ID');
expect(createdUser.auto_renew).toBe(false);
expect(createdUser.license_alert).toBe(false);
expect(createdUser.notification).toBe(false);
expect(createdUser.encryption).toBe(false);
expect(createdUser.encryption_password).toBeNull();
expect(createdUser.prompt).toBe(false);
});
it('None以外からRoleを変更した場合、エラーとなるTypist⇒None', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.TYPIST,
undefined,
true,
);
const service = module.get<UsersService>(UsersService);
await expect(
service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.NONE,
undefined,
false,
false,
false,
undefined,
undefined,
undefined,
),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010207'), HttpStatus.BAD_REQUEST),
);
});
it('Authorがパスワードundefinedで渡されたとき、元のパスワードを維持するEncryptionがtrue', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.AUTHOR,
'AUTHOR_ID',
true,
true,
'password',
true,
);
const service = module.get<UsersService>(UsersService);
expect(
await service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.AUTHOR,
'AUTHOR_ID',
false,
false,
false,
true,
undefined,
true,
),
).toEqual(undefined);
const createdUser = await getUser(source, user1);
expect(createdUser.id).toBe(user1);
expect(createdUser.role).toBe(USER_ROLES.AUTHOR);
expect(createdUser.author_id).toBe('AUTHOR_ID');
expect(createdUser.auto_renew).toBe(false);
expect(createdUser.license_alert).toBe(false);
expect(createdUser.notification).toBe(false);
expect(createdUser.encryption).toBe(true);
expect(createdUser.encryption_password).toBe('password');
expect(createdUser.prompt).toBe(true);
});
it('Authorが暗号化なしで更新した場合、パスワードをNULLにするEncryptionがfalse', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.AUTHOR,
'AUTHOR_ID',
true,
false,
'password',
true,
);
const service = module.get<UsersService>(UsersService);
expect(
await service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.AUTHOR,
'AUTHOR_ID',
false,
false,
false,
false,
'password',
true,
),
).toEqual(undefined);
const createdUser = await getUser(source, user1);
expect(createdUser.id).toBe(user1);
expect(createdUser.role).toBe(USER_ROLES.AUTHOR);
expect(createdUser.author_id).toBe('AUTHOR_ID');
expect(createdUser.auto_renew).toBe(false);
expect(createdUser.license_alert).toBe(false);
expect(createdUser.notification).toBe(false);
expect(createdUser.encryption).toBe(false);
expect(createdUser.encryption_password).toBeNull();
expect(createdUser.prompt).toBe(true);
});
it('AuthorのDBにパスワードが設定されていない場合、パスワードundefinedでわたすとエラーとなるEncryptionがtrue', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.AUTHOR,
'AUTHOR_ID',
true,
true,
undefined,
true,
);
const service = module.get<UsersService>(UsersService);
await expect(
service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.AUTHOR,
'AUTHOR_ID',
false,
false,
false,
true,
undefined,
true,
),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010208'), HttpStatus.BAD_REQUEST),
);
});
it('AuthorIdが既存のユーザーと重複した場合、エラーとなる', async () => {
const module = await makeTestingModule(source);
const { accountId } = await createAccount(source);
const { externalId: external_id } = await createUser(
source,
accountId,
'external_id',
USER_ROLES.NONE,
undefined,
true,
);
const { userId: user1 } = await createUser(
source,
accountId,
'external_id1',
USER_ROLES.AUTHOR,
'AUTHOR_ID1',
true,
true,
'password',
true,
);
await createUser(
source,
accountId,
'external_id2',
USER_ROLES.AUTHOR,
'AUTHOR_ID2',
true,
true,
'password',
true,
);
const service = module.get<UsersService>(UsersService);
await expect(
service.updateUser(
{ trackingId: 'trackingId' },
external_id,
user1,
USER_ROLES.AUTHOR,
'AUTHOR_ID2',
false,
false,
false,
true,
undefined,
true,
),
).rejects.toEqual(
new HttpException(makeErrorResponse('E010302'), HttpStatus.BAD_REQUEST),
);
});
});