Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: clean board #1240

Merged
merged 9 commits into from
Mar 17, 2023
33 changes: 8 additions & 25 deletions backend/src/libs/test-utils/mocks/factories/card-factory.mock.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import faker from '@faker-js/faker';
import Card from 'src/modules/cards/entities/card.schema';
import { CardItemFactory } from './cardItem-factory.mock';
import { CommentFactory } from './comment-factory.mock';
import { buildTestFactory } from './generic-factory.mock';
import { UserFactory } from './user-factory';

const cardId = faker.datatype.uuid();
const cardText = faker.lorem.words(5);
const commentText = faker.lorem.words(4);
const teamId = faker.datatype.uuid();
const createdAtDate = faker.datatype.datetime();
const user = UserFactory.create();
const user = UserFactory.create({ joinedAt: new Date(faker.datatype.datetime()) });

const mockCardData = (): Card => {
return {
Expand All @@ -17,32 +18,14 @@ const mockCardData = (): Card => {
createdBy: user,
createdByTeam: teamId,
createdAt: createdAtDate,
comments: [
{
text: commentText,
createdBy: user,
anonymous: false
}
],
comments: CommentFactory.createMany(2, () => ({ createdBy: user })),
votes: [],
anonymous: false,
anonymous: faker.datatype.boolean(),
items: [
{
_id: cardId,
text: cardText,
CardItemFactory.create({
createdBy: user,
comments: [
{
text: commentText,
createdBy: user,
anonymous: false
}
],
votes: [],
anonymous: false,
createdByTeam: teamId,
createdAt: createdAtDate
}
comments: CommentFactory.createMany(2, () => ({ createdBy: user }))
})
]
};
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import faker from '@faker-js/faker';
import CardItem from 'src/modules/cards/entities/card.item.schema';
import { CommentFactory } from './comment-factory.mock';
import { buildTestFactory } from './generic-factory.mock';
import { UserFactory } from './user-factory';

const cardId = faker.datatype.uuid();
const cardText = faker.lorem.words(5);
const teamId = faker.datatype.uuid();
const createdAtDate = faker.datatype.datetime();
const user = UserFactory.create({ joinedAt: new Date(faker.datatype.datetime()) });

const mockCardItemData = () => {
return {
_id: cardId,
text: cardText,
createdBy: user,
createdByTeam: teamId,
createdAt: createdAtDate,
comments: CommentFactory.createMany(2, () => ({ createdBy: user })),
votes: [],
anonymous: faker.datatype.boolean()
};
};

export const CardItemFactory = buildTestFactory<CardItem>(() => {
return mockCardItemData();
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import { buildTestFactory } from './generic-factory.mock';

const cardText = faker.lorem.words();

const mockColumnData = (cardsCount = 1): Column => {
const mockColumnData = (): Column => {
return {
_id: faker.datatype.uuid(),
title: faker.lorem.words(),
color: '#aaaaaa',
cards: CardFactory.createMany(cardsCount),
cards: CardFactory.createMany(2),
cardText: cardText,
isDefaultText: faker.datatype.boolean()
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import faker from '@faker-js/faker';
import Comment from 'src/modules/comments/schemas/comment.schema';
import { buildTestFactory } from './generic-factory.mock';
import { UserFactory } from './user-factory';

const mockCommentData = (): Comment => {
return {
text: faker.lorem.words(),
createdBy: UserFactory.create(),
anonymous: faker.datatype.boolean()
};
};

export const CommentFactory = buildTestFactory<Comment>(() => {
return mockCommentData();
});
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export default class CreateBoardService implements CreateBoardServiceInterface {
});

const teamUsersWotStakeholders = teamUsers.filter(
(teamUser) => teamUser.role !== TeamRoles.STAKEHOLDER
(teamUser) => teamUser.role !== TeamRoles.STAKEHOLDER
);
const teamLength = teamUsersWotStakeholders.length;
const rawMaxTeams = teamLength / Number(maxUsersPerTeam);
Expand Down
144 changes: 76 additions & 68 deletions backend/src/modules/boards/services/get.board.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,31 @@ import faker from '@faker-js/faker';
import { BoardUserFactory } from 'src/libs/test-utils/mocks/factories/boardUser-factory.mock';
import { TeamFactory } from 'src/libs/test-utils/mocks/factories/team-factory.mock';
import { UserDtoFactory } from 'src/libs/test-utils/mocks/factories/dto/userDto-factory';
import { NotFoundException } from '@nestjs/common';
import { BadRequestException, NotFoundException } from '@nestjs/common';
import { GetTeamServiceInterface } from 'src/modules/teams/interfaces/services/get.team.service.interface';
import { GetTokenAuthServiceInterface } from 'src/modules/auth/interfaces/services/get-token.auth.service.interface';
import { Tokens } from 'src/libs/interfaces/jwt/tokens.interface';
import { UpdateUserServiceInterface } from 'src/modules/users/interfaces/services/update.user.service.interface';
import { BoardRepositoryInterface } from '../repositories/board.repository.interface';
import { GetBoardServiceInterface } from '../interfaces/services/get.board.service.interface';
import { hideVotes } from '../utils/clean-boards.spec';
import Column from 'src/modules/columns/entities/column.schema';
import { CreateBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/create.board.user.service.interface';
import { createBoardUserService } from 'src/modules/boardusers/boardusers.providers';

const hideVotesFromColumns = (columns: Column[], userId: string) => {
return columns.map((column) => {
column.cards.forEach((card) => {
card.votes = hideVotes(card.votes as string[], userId);
card.items.forEach(
(cardItem) => (cardItem.votes = hideVotes(cardItem.votes as string[], userId))
);
});

return column;
});
};

describe('GetBoardService', () => {
let boardService: GetBoardServiceInterface;
let boardRepositoryMock: DeepMocked<BoardRepositoryInterface>;
Expand Down Expand Up @@ -184,17 +199,17 @@ describe('GetBoardService', () => {
});

it('should return all boards for the superAdmin', async () => {
const boards = BoardFactory.createMany(4);
const teams = TeamFactory.createMany(2);
const userId = faker.datatype.uuid();

const teamIds = teams.map((team) => team._id);
const boards = BoardFactory.createMany(4, [
{ isSubBoard: true },
{ team: teamIds[0] },
{ isSubBoard: false },
{ isSubBoard: false }
]);
const userId = faker.datatype.uuid();
const boardIds = boards.map((board) => board._id);
const getBoardAndTeamIdsResult = { boardIds, teamIds };

boards[2].isSubBoard = false;
boards[3].isSubBoard = false;
boards[0].team = teamIds[0];
const filterBoardsResponse = boards.filter(
(board) =>
!board.isSubBoard &&
Expand Down Expand Up @@ -237,17 +252,17 @@ describe('GetBoardService', () => {
});

it('should return all boards of a user', async () => {
const boards = BoardFactory.createMany(4);
const teams = TeamFactory.createMany(2);
const userId = faker.datatype.uuid();

const teamIds = teams.map((team) => team._id);
const boards = BoardFactory.createMany(4, [
{ isSubBoard: false },
{ team: teamIds[1] },
{ isSubBoard: false },
{ isSubBoard: true }
]);
const userId = faker.datatype.uuid();
const boardIds = boards.map((board) => board._id);
const getBoardAndTeamIdsResult = { boardIds, teamIds };

boards[0].isSubBoard = false;
boards[2].isSubBoard = false;
boards[1].team = teamIds[1];
const filterBoardsResponse = boards.filter(
(board) =>
!board.isSubBoard &&
Expand Down Expand Up @@ -279,13 +294,14 @@ describe('GetBoardService', () => {
});

it('should return all boards from a team', async () => {
const boards = BoardFactory.createMany(4);
const team = TeamFactory.create();
const boards = BoardFactory.createMany(4, [
{ isSubBoard: false },
{ team: team._id },
{ isSubBoard: false },
{ isSubBoard: true }
]);
const userId = faker.datatype.uuid();

boards[0].isSubBoard = false;
boards[2].isSubBoard = false;
boards[1].team = team._id;
const filterBoardsResponse = boards.filter(
(board) => !board.isSubBoard || String(board.team) === team._id
);
Expand Down Expand Up @@ -318,20 +334,17 @@ describe('GetBoardService', () => {
});

it('should return all personal boards of a user', async () => {
const boards = BoardFactory.createMany(4);
const teams = TeamFactory.createMany(1);
const userId = faker.datatype.uuid();

const teamIds = teams.map((team) => team._id);
const boards = BoardFactory.createMany(4, [
{ isSubBoard: false, team: null },
{ team: null },
{ isSubBoard: false, team: teamIds[0] },
{ isSubBoard: true, team: teamIds[0] }
]);
const userId = faker.datatype.uuid();
const boardIds = boards.map((board) => board._id);
const getBoardAndTeamIdsResult = { boardIds, teamIds };

boards[0].isSubBoard = false;
boards[2].isSubBoard = false;
boards[0].team = null;
boards[1].team = null;
boards[2].team = teamIds[0];
boards[3].team = teamIds[0];
const filterBoardsResponse = boards.filter(
(board) => !board.isSubBoard && !board.team && boardIds.includes(board._id)
);
Expand Down Expand Up @@ -379,40 +392,30 @@ describe('GetBoardService', () => {
});

it('should return board and main board if is a subBoard', async () => {
const mainBoard = BoardFactory.create();
mainBoard.isSubBoard = false;
const subBoard = BoardFactory.create();
subBoard.isSubBoard = true;
const boardUser = BoardUserFactory.create();
boardUser.board = subBoard._id;

const mainBoard = BoardFactory.create({ isSubBoard: false });
const subBoard = BoardFactory.create({ isSubBoard: true });
const boardUser = BoardUserFactory.create({ board: subBoard._id });
const userDtoMock = UserDtoFactory.create();
userDtoMock._id = String(boardUser.user);

boardRepositoryMock.getBoardData.mockResolvedValue(subBoard);

getBoardUserServiceMock.getBoardUser.mockResolvedValue(boardUser);

boardRepositoryMock.getMainBoard.mockResolvedValue(mainBoard);

const boardResult = await boardService.getBoard(subBoard._id, userDtoMock);

//format columns to hideVotes that is called on clean board function
subBoard.columns = hideVotesFromColumns(subBoard.columns, userDtoMock._id);

const response = { board: subBoard, mainBoard };

expect(boardResult).toEqual(response);
});

it('should return board and guestUser if is a guestUser', async () => {
const board = BoardFactory.create();
board.isSubBoard = false;
board.isPublic = true;

const userDtoMock = UserDtoFactory.create();
userDtoMock.isSAdmin = false;
userDtoMock.isAnonymous = true;

const board = BoardFactory.create({ isSubBoard: false, isPublic: true });
const userDtoMock = UserDtoFactory.create({ isSAdmin: false, isAnonymous: true });
const boardUser = BoardUserFactory.create();

const tokens: Tokens = {
accessToken: {
expiresIn: String(faker.datatype.number()),
Expand All @@ -425,13 +428,12 @@ describe('GetBoardService', () => {
};

boardRepositoryMock.getBoardData.mockResolvedValue(board);

getBoardUserServiceMock.getBoardUser.mockResolvedValue(null);

getTokenAuthServiceMock.getTokens.mockResolvedValue(tokens);

getBoardUserServiceMock.getBoardUserPopulated.mockResolvedValue(boardUser);

board.columns = hideVotesFromColumns(board.columns, userDtoMock._id);

const boardResponse = {
guestUser: { accessToken: tokens.accessToken, user: userDtoMock._id },
board
Expand All @@ -443,42 +445,48 @@ describe('GetBoardService', () => {
});

it('should return a board when boardUserIsFound', async () => {
const board = BoardFactory.create();
board.isSubBoard = false;
board.isPublic = false;

const userDtoMock = UserDtoFactory.create();
userDtoMock.isSAdmin = false;
userDtoMock.isAnonymous = true;

const board = BoardFactory.create({ isSubBoard: false, isPublic: false });
const userDtoMock = UserDtoFactory.create({ isSAdmin: false, isAnonymous: true });
const boardUser = BoardUserFactory.create();

boardRepositoryMock.getBoardData.mockResolvedValue(board);

getBoardUserServiceMock.getBoardUser.mockResolvedValue(boardUser);

//format columns to hideVotes that is called on clean board function
board.columns = hideVotesFromColumns(board.columns, userDtoMock._id);

const boardResult = await boardService.getBoard(board._id, userDtoMock);

expect(boardResult.board).toEqual(board);
});

it('should return a board when boardIsPublic, boardUser is not found and userDto is not anonymous', async () => {
const board = BoardFactory.create();
board.isSubBoard = false;
board.isPublic = true;

const userDtoMock = UserDtoFactory.create();
userDtoMock.isSAdmin = false;
userDtoMock.isAnonymous = false;
const board = BoardFactory.create({ isSubBoard: false, isPublic: true });
const userDtoMock = UserDtoFactory.create({ isSAdmin: false, isAnonymous: false });

boardRepositoryMock.getBoardData.mockResolvedValue(board);

getBoardUserServiceMock.getBoardUser.mockResolvedValue(null);

//format columns to hideVotes that is called on clean board function
board.columns = hideVotesFromColumns(board.columns, userDtoMock._id);

const boardResult = await boardService.getBoard(board._id, userDtoMock);

expect(boardResult.board).toEqual(board);
});

it('should throw error when boardIsPublic and creating a board user fails', async () => {
const board = BoardFactory.create({ isSubBoard: false, isPublic: true });
const userDtoMock = UserDtoFactory.create({ isSAdmin: false, isAnonymous: false });

boardRepositoryMock.getBoardData.mockResolvedValue(board);
getBoardUserServiceMock.getBoardUser.mockResolvedValueOnce(null);
getBoardUserServiceMock.getBoardUserPopulated.mockResolvedValueOnce(null);

expect(async () => await boardService.getBoard(board._id, userDtoMock)).rejects.toThrow(
BadRequestException
);
});
});

describe('countBoards', () => {
Expand Down
Loading