Skip to content

Commit

Permalink
インフラを使用する単体テストを作成した。
Browse files Browse the repository at this point in the history
  • Loading branch information
eigoninaritai-naokichi committed Jan 19, 2024
1 parent 512f536 commit 79c73f0
Show file tree
Hide file tree
Showing 11 changed files with 418 additions and 97 deletions.
1 change: 1 addition & 0 deletions jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import type {Config} from 'jest';
const config: Config = {
preset: 'ts-jest',
testEnvironment: 'node',
testTimeout: 60000,
// All imported modules in your tests should be mocked automatically
// automock: false,

Expand Down
4 changes: 2 additions & 2 deletions tests/actions/user/sns-user-registration-action.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ let snsUserRegistrationAction: SnsUserRegistrationAction;
/**
* 認証プロバイダID。
*/
const authenticationProvidedId = "authenticationProvidedId";
const authenticationProviderId = "authenticationProviderId";

/**
* ユーザー名。
Expand All @@ -32,7 +32,7 @@ beforeEach(() => {
describe("register", () => {
test("register should register a user and return true.", async () => {
// ユーザーを登録する。
const response = await snsUserRegistrationAction.register(authenticationProvidedId, userName);
const response = await snsUserRegistrationAction.register(authenticationProviderId, userName);

// 結果を検証する。
expect(response).toBe(true);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
import { describe, test, expect, beforeEach } from "@jest/globals";
import MockUserRepository from "../../../repositories/user/mock-user-repository";
import delayAsync from "../../../test-utilityies/delay-async";
import PostgresUserRepository from "../../../../app/repositories/user/postgres-user-repository";
import UserRegistrar from "../../../../app/libraries/user/user-registrar";
import SnsUserRegistrationAction from "../../../../app/actions/user/sns-user-registration-action";
import { postgresClientProvider } from "../../../../app/dependency-injector/get-load-context";

/**
* Postgresのユーザーリポジトリ。
*/
let postgresUserRepository: PostgresUserRepository;

/**
* SNSのユーザー登録を行うアクション。
*/
let snsUserRegistrationAction: SnsUserRegistrationAction;

/**
* 認証プロバイダID
* プロフィールID
*/
const authenticationProvidedId = "authenticationProvidedId";
const profileId = "username_world";

/**
* ユーザー名。
Expand All @@ -23,10 +30,25 @@ const userName = "UserName@World";
*/
const id = 1;

beforeEach(() => {
const mockUserRepository = new MockUserRepository();
const userAccountManager = new UserRegistrar(mockUserRepository);
beforeEach(async () => {
postgresUserRepository = new PostgresUserRepository(postgresClientProvider);
const userAccountManager = new UserRegistrar(postgresUserRepository);
snsUserRegistrationAction = new SnsUserRegistrationAction(userAccountManager);

// テスト用のユーザー情報が存在する場合、削除する。
try {
// テスト用のユーザー情報を取得する。
const responseFindByProfileId = await delayAsync(() => postgresUserRepository.findByProfileId(profileId));

// テスト用のユーザー情報が存在しない場合、エラーを投げる。
if (responseFindByProfileId == null) throw new Error("The user does not exist.");

const id = responseFindByProfileId.id;
await delayAsync(() => postgresUserRepository.delete(id));
console.info("テスト用のユーザー情報を削除しました。");
} catch (error) {
console.info("テスト用のユーザー情報は存在しませんでした。");
}
});

describe("register", () => {
Expand All @@ -36,9 +58,9 @@ describe("register", () => {
return;
}

test("register should register a user and return true.", async () => {
// ユーザーを登録する
const response = await snsUserRegistrationAction.register(authenticationProvidedId, userName);
test("register should register a new user", async () => {
// テスト用のユーザー情報を作成する
const response = await delayAsync(() => snsUserRegistrationAction.register(profileId, userName));

// 結果を検証する。
expect(response).toBe(true);
Expand All @@ -52,11 +74,21 @@ describe("delete", () => {
return;
}

test("delete should delete a user and return true.", async () => {
// ユーザーを削除する。
const response = await snsUserRegistrationAction.delete(id);
test("delete should delete a user", async () => {
// テスト用のユーザー情報を作成する。
await delayAsync(() => snsUserRegistrationAction.register(profileId, userName));

// テスト用のユーザー情報を取得する。
const responseFindByProfileId = await delayAsync(() => postgresUserRepository.findByProfileId(profileId));

// テスト用のユーザー情報が存在しない場合、エラーを投げる。
if (responseFindByProfileId == null) throw new Error("The user does not exist.");

// テスト用のユーザー情報を削除する。
const id = responseFindByProfileId.id;
const responseDelete = await delayAsync(() => snsUserRegistrationAction.delete(id));

// 結果を検証する。
expect(response).toBe(true);
expect(responseDelete).toBe(true);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import delayAsync from "../../../test-utilityies/delay-async";
import AuthenticatedUserProvider from "../../../../app/libraries/user/authenticated-user-provider";
import FirebaseClient from "../../../../app/libraries/authentication/firebase-client";
import PostgresUserRepository from "../../../../app/repositories/user/postgres-user-repository";
import { postgresClientProvider } from "../../../../app/dependency-injector/get-load-context";

/**
* Firebaseのクライアント。
Expand All @@ -12,7 +13,7 @@ let firebaseClient: FirebaseClient;
/**
* Postgresのユーザーリポジトリ。
*/
let posgresUserRepository: PostgresUserRepository;
let postgresUserRepository: PostgresUserRepository;

/**
* 認証済みユーザーを提供するクラス。
Expand All @@ -32,12 +33,17 @@ const password = "testPassword123";
/**
* プロフィールID。
*/
const profileId = "test_unicorn";
const profileId = "username_world";

/**
* ユーザー名。
*/
const userName = "UserName@World";

beforeEach(async () => {
firebaseClient = new FirebaseClient();
posgresUserRepository = new PostgresUserRepository();
authenticatedUserProvider = new AuthenticatedUserProvider(firebaseClient, posgresUserRepository);
postgresUserRepository = new PostgresUserRepository(postgresClientProvider);
authenticatedUserProvider = new AuthenticatedUserProvider(firebaseClient, postgresUserRepository);

// テスト用のユーザーが存在する場合、削除する。
try {
Expand All @@ -55,13 +61,13 @@ beforeEach(async () => {
// テスト用のユーザー情報が存在する場合、削除する。
try {
// テスト用のユーザー情報を取得する。
const responseFindByProfileId = await delayAsync(() => posgresUserRepository.findByProfileId(profileId));
const responseFindByProfileId = await delayAsync(() => postgresUserRepository.findByProfileId(profileId));

// テスト用のユーザー情報が存在しない場合、エラーを投げる。
if (responseFindByProfileId == null) throw new Error("The user does not exist.");

const id = responseFindByProfileId.id;
await delayAsync(() => posgresUserRepository.delete(id));
await delayAsync(() => postgresUserRepository.delete(id));
console.info("テスト用のユーザー情報を削除しました。");
} catch (error) {
console.info("テスト用のユーザー情報は存在しませんでした。");
Expand All @@ -81,8 +87,7 @@ describe("getUser", () => {

// テスト用のユーザー情報を登録する。
const authenticationProviderId = responseSignUp.localId;
const userName = "test@Unicorn";
await delayAsync(() => posgresUserRepository.create(profileId, authenticationProviderId, userName));
await delayAsync(() => postgresUserRepository.create(profileId, authenticationProviderId, userName));

// テスト用のユーザー情報を取得する。
const idToken = responseSignUp.idToken;
Expand All @@ -92,13 +97,10 @@ describe("getUser", () => {
if (responseUser === null) throw new Error("The user does not exist.");

// 結果を検証する。
const expectedUser = {
userName: mailAddress,
};
expect(responseUser.id).toBeDefined();
expect(responseUser.profileId).toBe(profileId);
expect(responseUser.authenticationProviderId).toBeDefined();
expect(responseUser.userName).toBe(expectedUser.userName);
expect(responseUser.authenticationProviderId).toBe(authenticationProviderId);
expect(responseUser.userName).toBe(userName);
expect(new Date(responseUser.createdAt)).toBeInstanceOf(Date);
});

Expand All @@ -113,4 +115,24 @@ describe("getUser", () => {
// 結果を検証する。
expect(responseUser).toBeNull();
});
});

describe("getAuthenticationProviderId", () => {
// 環境変数が設定されていない場合、テストをスキップする。
if (!process.env.RUN_INFRA_TESTS) {
test.skip("Skipping infrastructure tests.", () => {});
return;
}

test("getAuthenticationProviderId should return an authentication provider ID.", async () => {
// テスト用のユーザーを登録する。
const responseSignUp = await delayAsync(() => firebaseClient.signUp(mailAddress, password));

// ユーザー情報を取得する。
const idToken = responseSignUp.idToken;
const responseAuthenticationProviderId = await delayAsync(() => authenticatedUserProvider.getAuthenticationProviderId(idToken));

// 結果を検証する。
expect(responseAuthenticationProviderId).toBe(responseSignUp.localId);
});
});
135 changes: 135 additions & 0 deletions tests/infrastructure/libraries/user/user-registrar.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import { describe, test, expect, beforeEach } from "@jest/globals";
import delayAsync from "../../../test-utilityies/delay-async";
import UserRegistrar from "../../../../app/libraries/user/user-registrar";
import PostgresUserRepository from "../../../../app/repositories/user/postgres-user-repository";
import { postgresClientProvider } from "../../../../app/dependency-injector/get-load-context";

/**
* Postgresのユーザーリポジトリ。
*/
let postgresUserRepository: PostgresUserRepository;

/**
* ユーザーの登録を行うクラス。
*/
let userRegistrar: UserRegistrar;

/**
* プロフィールID。
*/
const profileId = "username_world";

/**
* ユーザー名。
*/
const userName = "UserName@World";

beforeEach(async () => {
postgresUserRepository = new PostgresUserRepository(postgresClientProvider);
userRegistrar = new UserRegistrar(postgresUserRepository);

// テスト用のユーザー情報が存在する場合、削除する。
try {
// テスト用のユーザー情報を取得する。
const responseFindByProfileId = await delayAsync(() => postgresUserRepository.findByProfileId(profileId));

// テスト用のユーザー情報が存在しない場合、エラーを投げる。
if (responseFindByProfileId == null) throw new Error("The user does not exist.");

const id = responseFindByProfileId.id;
await delayAsync(() => postgresUserRepository.delete(id));
console.info("テスト用のユーザー情報を削除しました。");
} catch (error) {
console.info("テスト用のユーザー情報は存在しませんでした。");
}
});

describe("register", () => {
// 環境変数が設定されていない場合、テストをスキップする。
if (!process.env.RUN_INFRA_TESTS) {
test.skip("Skipping infrastructure tests.", () => {});
return;
}

test("register should register a new user", async () => {
// テスト用のユーザー情報を作成する。
const response = await delayAsync(() => userRegistrar.register(profileId, userName));

// 結果を検証する。
expect(response).toBe(true);
});

test("register should throw an error when the authenticationProviderId is empty", async () => {
expect.assertions(1);
try {
// テスト用のユーザー情報を作成する。
await delayAsync(() => userRegistrar.register("", userName));
} catch (error) {
// エラーがResponseでない場合、エラーを投げる。
if (!(error instanceof Error)) {
throw error;
}

// エラーを検証する。
expect(error.message).toBe("認証プロバイダIDは必須です。");
}
});

test("register should throw an error when the userName is empty", async () => {
expect.assertions(1);
try {
// テスト用のユーザー情報を作成する。
await delayAsync(() => userRegistrar.register(profileId, ""));
} catch (error) {
// エラーがResponseでない場合、エラーを投げる。
if (!(error instanceof Error)) {
throw error;
}

// エラーを検証する。
expect(error.message).toBe("ユーザー名は「username@world」で入力してください。");
}
});

test("register should throw an error when the userName is invalid", async () => {
expect.assertions(1);
try {
// テスト用のユーザー情報を作成する。
await delayAsync(() => userRegistrar.register(profileId, "invalidUserName"));
} catch (error) {
// エラーがResponseでない場合、エラーを投げる。
if (!(error instanceof Error)) {
throw error;
}

// エラーを検証する。
expect(error.message).toBe("ユーザー名は「username@world」で入力してください。");
}
});
});

describe("delete", () => {
// 環境変数が設定されていない場合、テストをスキップする。
if (!process.env.RUN_INFRA_TESTS) {
test.skip("Skipping infrastructure tests.", () => {});
return;
}

test("delete should delete a user", async () => {
// テスト用のユーザー情報を作成する。
await delayAsync(() => userRegistrar.register(profileId, userName));

// テスト用のユーザー情報を取得する。
const responseFindByProfileId = await delayAsync(() => postgresUserRepository.findByProfileId(profileId));

// テスト用のユーザー情報が存在しない場合、エラーを投げる。
if (responseFindByProfileId == null) throw new Error("The user does not exist.");

// テスト用のユーザー情報を削除する。
const id = responseFindByProfileId.id;
const responseDelete = await delayAsync(() => userRegistrar.delete(id));

// 結果を検証する。
expect(responseDelete).toBe(true);
});
});
Loading

0 comments on commit 79c73f0

Please sign in to comment.