Skip to content

Commit

Permalink
test(factories): add or improve factories among tests (#145)
Browse files Browse the repository at this point in the history
  • Loading branch information
antoinezanardi committed May 6, 2023
1 parent 5b3650f commit 8cedb0e
Show file tree
Hide file tree
Showing 36 changed files with 26,916 additions and 26,817 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { GAME_PHASES } from "../../enums/game.enum";
import type { GameOptions } from "../../schemas/game-options/game-options.schema";

const defaultGameOptions: GameOptions = Object.freeze({
composition: { isHidden: true },
composition: { isHidden: false },
roles: {
areRevealedOnDeath: true,
sheriff: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class CreateGamePlayerDto extends IntersectionType(
@Type(() => CreateGamePlayerSideDto)
@ValidateNested()
@Transform(playerSideTransformer)
public side: CreateGamePlayerSideDto;
public side: CreateGamePlayerSideDto = {};

@ApiProperty({ description: "Player's unique position among all players. Maximum is `players.length - 1`. Either all players position must be set or none of them. In that last case, it will be generated automatically" })
public position?: number;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@ import type { NestFastifyApplication } from "@nestjs/platform-fastify";
import { FastifyAdapter } from "@nestjs/platform-fastify";
import type { TestingModule } from "@nestjs/testing";
import { Test } from "@nestjs/testing";
import { instanceToPlain, plainToInstance } from "class-transformer";
import { instanceToPlain } from "class-transformer";
import type { Model, Types } from "mongoose";
import { stringify } from "qs";
import { defaultGameOptions } from "../../../../../../src/modules/game/constants/game-options/game-options.constant";
import { CreateGameOptionsDto } from "../../../../../../src/modules/game/dto/create-game/create-game-options/create-game-options.dto";
import type { CreateGamePlayerDto } from "../../../../../../src/modules/game/dto/create-game/create-game-player/create-game-player.dto";
import type { CreateGameDto } from "../../../../../../src/modules/game/dto/create-game/create-game.dto";
import type { GetGameRandomCompositionDto } from "../../../../../../src/modules/game/dto/get-game-random-composition/get-game-random-composition.dto";
Expand All @@ -25,12 +24,12 @@ import type { Player } from "../../../../../../src/modules/game/schemas/player/p
import { ROLE_NAMES, ROLE_SIDES } from "../../../../../../src/modules/role/enums/role.enum";
import { E2eTestModule } from "../../../../../../src/modules/test/e2e-test.module";
import { fastifyServerDefaultOptions } from "../../../../../../src/server/constants/server.constant";
import { plainToInstanceDefaultOptions } from "../../../../../../src/shared/validation/constants/validation.constant";
import { createFakeGameOptionsDto } from "../../../../../factories/game/dto/create-game/create-game-options/create-game-options.dto.factory";
import { bulkCreateFakeCreateGamePlayerDto } from "../../../../../factories/game/dto/create-game/create-game-player/create-game-player.dto.factory";
import { createFakeCreateGameDto } from "../../../../../factories/game/dto/create-game/create-game.dto.factory";
import { createFakeCreateGameDto, createFakeCreateGameWithPlayersDto } from "../../../../../factories/game/dto/create-game/create-game.dto.factory";
import { createFakeMakeGamePlayDto } from "../../../../../factories/game/dto/make-game-play/make-game-play.dto.factory";
import { bulkCreateFakeGames, createFakeGame } from "../../../../../factories/game/schemas/game.schema.factory";
import { createFakeSeerPlayer, createFakeVillagerPlayer, createFakeWerewolfPlayer } from "../../../../../factories/game/schemas/player/player-with-role.schema.factory";
import { createFakeSeerAlivePlayer, createFakeVillagerAlivePlayer, createFakeWerewolfAlivePlayer } from "../../../../../factories/game/schemas/player/player-with-role.schema.factory";
import { bulkCreateFakePlayers } from "../../../../../factories/game/schemas/player/player.schema.factory";
import { createObjectIdFromString } from "../../../../../helpers/mongoose/mongoose.helper";
import { initNestApp } from "../../../../helpers/nest-app.helper";
Expand Down Expand Up @@ -416,14 +415,14 @@ describe("Game Controller", () => {
raven: { markPenalty: 5 },
},
};
const payload = createFakeCreateGameDto({}, { options });
const payload = createFakeCreateGameWithPlayersDto({}, { options });
const response = await app.inject({
method: "POST",
url: "/games",
payload,
});
expect(response.statusCode).toBe(HttpStatus.CREATED);
expect(response.json<Game>().options).toMatchObject(plainToInstance(CreateGameOptionsDto, options, plainToInstanceDefaultOptions));
expect(response.json<Game>().options).toMatchObject(createFakeGameOptionsDto({ ...options, composition: { isHidden: defaultGameOptions.composition.isHidden } }));
});
});

Expand Down Expand Up @@ -526,10 +525,10 @@ describe("Game Controller", () => {

it("should make a game play when called with votes.", async() => {
const players = bulkCreateFakePlayers(4, [
createFakeWerewolfPlayer(),
createFakeSeerPlayer(),
createFakeVillagerPlayer(),
createFakeWerewolfPlayer(),
createFakeWerewolfAlivePlayer(),
createFakeSeerAlivePlayer(),
createFakeVillagerAlivePlayer(),
createFakeWerewolfAlivePlayer(),
]);
const game = createFakeGame({
status: GAME_STATUSES.PLAYING,
Expand Down Expand Up @@ -558,10 +557,10 @@ describe("Game Controller", () => {

it("should make a game play when called with targets.", async() => {
const players = bulkCreateFakePlayers(4, [
createFakeWerewolfPlayer(),
createFakeSeerPlayer(),
createFakeVillagerPlayer(),
createFakeWerewolfPlayer(),
createFakeWerewolfAlivePlayer(),
createFakeSeerAlivePlayer(),
createFakeVillagerAlivePlayer(),
createFakeWerewolfAlivePlayer(),
]);
const game = createFakeGame({
status: GAME_STATUSES.PLAYING,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import type { GameSource } from "../../../../../../../src/modules/game/types/gam
import type { ROLE_SIDES } from "../../../../../../../src/modules/role/enums/role.enum";
import { E2eTestModule } from "../../../../../../../src/modules/test/e2e-test.module";
import { fastifyServerDefaultOptions } from "../../../../../../../src/server/constants/server.constant";
import { bulkCreateFakeGameHistoryRecords, createFakeGameHistoryRecord, createFakeGameHistoryRecordPlay } from "../../../../../../factories/game/schemas/game-history-record/game-history-record.schema.factory";
import { bulkCreateFakeGameHistoryRecords, createFakeGameHistoryRecord, createFakeGameHistoryRecordPlay, createFakeGameHistoryRecordPlaySource } from "../../../../../../factories/game/schemas/game-history-record/game-history-record.schema.factory";
import { bulkCreateFakePlayers, createFakePlayer } from "../../../../../../factories/game/schemas/player/player.schema.factory";
import { createFakeGameHistoryRecordToInsert } from "../../../../../../factories/game/types/game-history-record/game-history-record.type.factory";
import { createObjectIdFromString } from "../../../../../../helpers/mongoose/mongoose.helper";
Expand All @@ -43,8 +43,8 @@ describe("Game History Record Repository", () => {
await app.close();
});

async function populate(length: number, override: Partial<GameHistoryRecord>[] = []): Promise<void> {
await model.insertMany(bulkCreateFakeGameHistoryRecords(length, override));
async function populate(length: number, gameHistoryRecords: Partial<GameHistoryRecord>[] = []): Promise<void> {
await model.insertMany(bulkCreateFakeGameHistoryRecords(length, gameHistoryRecords));
}

describe("find", () => {
Expand All @@ -53,13 +53,32 @@ describe("Game History Record Repository", () => {
});

it("should get 10 game history records when called.", async() => {
await populate(10);
const gameHistoryRecordPlay = createFakeGameHistoryRecordPlay({ source: createFakeGameHistoryRecordPlaySource({ players: [createFakePlayer()] }) });
await populate(10, [
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
]);
await expect(repository.find()).resolves.toHaveLength(10);
});

it("should get 3 game history records when called with a specific gameId.", async() => {
const gameId = createObjectIdFromString(faker.database.mongodbObjectId());
await populate(10, [createFakeGameHistoryRecord({ gameId }), createFakeGameHistoryRecord({ gameId }), createFakeGameHistoryRecord({ gameId })]);
const gameHistoryRecordPlay = createFakeGameHistoryRecordPlay({ source: createFakeGameHistoryRecordPlaySource({ players: [createFakePlayer()] }) });
await populate(5, [
createFakeGameHistoryRecord({ gameId, play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ gameId, play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ gameId, play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
createFakeGameHistoryRecord({ play: gameHistoryRecordPlay }),
]);
await expect(repository.find({ gameId })).resolves.toHaveLength(3);
});
});
Expand Down Expand Up @@ -112,7 +131,8 @@ describe("Game History Record Repository", () => {
});

it("should create history record when called.", async() => {
const gameHistoryRecordToInsert = createFakeGameHistoryRecordToInsert();
const gameHistoryRecordPlayToInsert = createFakeGameHistoryRecordPlay({ source: createFakeGameHistoryRecordPlaySource({ players: [createFakePlayer()] }) });
const gameHistoryRecordToInsert = createFakeGameHistoryRecordToInsert({ play: gameHistoryRecordPlayToInsert });
const gameHistoryRecord = await repository.create(gameHistoryRecordToInsert);
expect(JSON.parse(JSON.stringify(gameHistoryRecord))).toMatchObject<GameHistoryRecord>({
...instanceToPlain(gameHistoryRecordToInsert, { excludeExtraneousValues: true }) as GameHistoryRecordToInsert,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import type { NestFastifyApplication } from "@nestjs/platform-fastify";
import { FastifyAdapter } from "@nestjs/platform-fastify";
import type { TestingModule } from "@nestjs/testing";
import { Test } from "@nestjs/testing";
import { plainToInstance } from "class-transformer";
import { roles } from "../../../../../../src/modules/role/constants/role.constant";
import { RoleModule } from "../../../../../../src/modules/role/role.module";
import { Role } from "../../../../../../src/modules/role/types/role.type";
import type { Role } from "../../../../../../src/modules/role/types/role.type";
import { E2eTestModule } from "../../../../../../src/modules/test/e2e-test.module";
import { fastifyServerDefaultOptions } from "../../../../../../src/server/constants/server.constant";
import { bulkCreateFakeRoles } from "../../../../../factories/role/types/role.type.factory";

describe("Role Controller", () => {
let app: NestFastifyApplication;
Expand All @@ -26,8 +26,9 @@ describe("Role Controller", () => {
describe("GET /roles", () => {
it("should return roles when route is called.", async() => {
const response = await app.inject({ method: "GET", url: "/roles" });
const respondedRoles = response.json<Role[]>();
expect(response.statusCode).toBe(200);
expect(plainToInstance(Role, response.json<Role[]>())).toStrictEqual(roles);
expect(bulkCreateFakeRoles(respondedRoles.length, respondedRoles)).toStrictEqual(roles);
});
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { faker } from "@faker-js/faker";
import { plainToInstance } from "class-transformer";
import { CreateGameOptionsDto } from "../../../../../../src/modules/game/dto/create-game/create-game-options/create-game-options.dto";
import { plainToInstanceDefaultOptions } from "../../../../../../src/shared/validation/constants/validation.constant";
import { createFakeRolesGameOptionsDto } from "./create-roles-game-options/create-roles-game-options.dto.factory";

function createFakeGameOptionsDto(createGameOptionsDto: Partial<CreateGameOptionsDto> = {}, override: object = {}): CreateGameOptionsDto {
return plainToInstance(CreateGameOptionsDto, {
composition: { isHidden: createGameOptionsDto.composition?.isHidden ?? faker.datatype.boolean() },
roles: createFakeRolesGameOptionsDto(createGameOptionsDto.roles),
...override,
}, plainToInstanceDefaultOptions);
}

export { createFakeGameOptionsDto };

0 comments on commit 8cedb0e

Please sign in to comment.