refactor: test mocks (#16008)

This commit is contained in:
Jason Rasmussen
2025-02-10 18:47:42 -05:00
committed by GitHub
parent 8794c84e9d
commit 735f8d661e
74 changed files with 3820 additions and 4043 deletions

View File

@@ -1,22 +1,15 @@
import { BadRequestException } from '@nestjs/common';
import { IEventRepository } from 'src/interfaces/event.interface';
import { IStackRepository } from 'src/interfaces/stack.interface';
import { StackService } from 'src/services/stack.service';
import { assetStub, stackStub } from 'test/fixtures/asset.stub';
import { authStub } from 'test/fixtures/auth.stub';
import { IAccessRepositoryMock } from 'test/repositories/access.repository.mock';
import { newTestService } from 'test/utils';
import { Mocked } from 'vitest';
import { newTestService, ServiceMocks } from 'test/utils';
describe(StackService.name, () => {
let sut: StackService;
let accessMock: IAccessRepositoryMock;
let eventMock: Mocked<IEventRepository>;
let stackMock: Mocked<IStackRepository>;
let mocks: ServiceMocks;
beforeEach(() => {
({ sut, accessMock, eventMock, stackMock } = newTestService(StackService));
({ sut, mocks } = newTestService(StackService));
});
it('should be defined', () => {
@@ -25,10 +18,10 @@ describe(StackService.name, () => {
describe('search', () => {
it('should search stacks', async () => {
stackMock.search.mockResolvedValue([stackStub('stack-id', [assetStub.image])]);
mocks.stack.search.mockResolvedValue([stackStub('stack-id', [assetStub.image])]);
await sut.search(authStub.admin, { primaryAssetId: assetStub.image.id });
expect(stackMock.search).toHaveBeenCalledWith({
expect(mocks.stack.search).toHaveBeenCalledWith({
ownerId: authStub.admin.user.id,
primaryAssetId: assetStub.image.id,
});
@@ -41,13 +34,13 @@ describe(StackService.name, () => {
sut.create(authStub.admin, { assetIds: [assetStub.image.id, assetStub.image1.id] }),
).rejects.toBeInstanceOf(BadRequestException);
expect(accessMock.asset.checkOwnerAccess).toHaveBeenCalled();
expect(stackMock.create).not.toHaveBeenCalled();
expect(mocks.access.asset.checkOwnerAccess).toHaveBeenCalled();
expect(mocks.stack.create).not.toHaveBeenCalled();
});
it('should create a stack', async () => {
accessMock.asset.checkOwnerAccess.mockResolvedValue(new Set([assetStub.image.id, assetStub.image1.id]));
stackMock.create.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set([assetStub.image.id, assetStub.image1.id]));
mocks.stack.create.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
await expect(
sut.create(authStub.admin, { assetIds: [assetStub.image.id, assetStub.image1.id] }),
).resolves.toEqual({
@@ -59,11 +52,11 @@ describe(StackService.name, () => {
],
});
expect(eventMock.emit).toHaveBeenCalledWith('stack.create', {
expect(mocks.event.emit).toHaveBeenCalledWith('stack.create', {
stackId: 'stack-id',
userId: authStub.admin.user.id,
});
expect(accessMock.asset.checkOwnerAccess).toHaveBeenCalled();
expect(mocks.access.asset.checkOwnerAccess).toHaveBeenCalled();
});
});
@@ -71,22 +64,22 @@ describe(StackService.name, () => {
it('should require stack.read permissions', async () => {
await expect(sut.get(authStub.admin, 'stack-id')).rejects.toBeInstanceOf(BadRequestException);
expect(accessMock.stack.checkOwnerAccess).toHaveBeenCalled();
expect(stackMock.getById).not.toHaveBeenCalled();
expect(mocks.access.stack.checkOwnerAccess).toHaveBeenCalled();
expect(mocks.stack.getById).not.toHaveBeenCalled();
});
it('should fail if stack could not be found', async () => {
accessMock.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
mocks.access.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
await expect(sut.get(authStub.admin, 'stack-id')).rejects.toBeInstanceOf(Error);
expect(accessMock.stack.checkOwnerAccess).toHaveBeenCalled();
expect(stackMock.getById).toHaveBeenCalledWith('stack-id');
expect(mocks.access.stack.checkOwnerAccess).toHaveBeenCalled();
expect(mocks.stack.getById).toHaveBeenCalledWith('stack-id');
});
it('should get stack', async () => {
accessMock.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
stackMock.getById.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
mocks.access.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
mocks.stack.getById.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
await expect(sut.get(authStub.admin, 'stack-id')).resolves.toEqual({
id: 'stack-id',
@@ -96,8 +89,8 @@ describe(StackService.name, () => {
expect.objectContaining({ id: assetStub.image1.id }),
],
});
expect(accessMock.stack.checkOwnerAccess).toHaveBeenCalled();
expect(stackMock.getById).toHaveBeenCalledWith('stack-id');
expect(mocks.access.stack.checkOwnerAccess).toHaveBeenCalled();
expect(mocks.stack.getById).toHaveBeenCalledWith('stack-id');
});
});
@@ -105,47 +98,47 @@ describe(StackService.name, () => {
it('should require stack.update permissions', async () => {
await expect(sut.update(authStub.admin, 'stack-id', {})).rejects.toBeInstanceOf(BadRequestException);
expect(stackMock.getById).not.toHaveBeenCalled();
expect(stackMock.update).not.toHaveBeenCalled();
expect(eventMock.emit).not.toHaveBeenCalled();
expect(mocks.stack.getById).not.toHaveBeenCalled();
expect(mocks.stack.update).not.toHaveBeenCalled();
expect(mocks.event.emit).not.toHaveBeenCalled();
});
it('should fail if stack could not be found', async () => {
accessMock.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
mocks.access.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
await expect(sut.update(authStub.admin, 'stack-id', {})).rejects.toBeInstanceOf(Error);
expect(stackMock.getById).toHaveBeenCalledWith('stack-id');
expect(stackMock.update).not.toHaveBeenCalled();
expect(eventMock.emit).not.toHaveBeenCalled();
expect(mocks.stack.getById).toHaveBeenCalledWith('stack-id');
expect(mocks.stack.update).not.toHaveBeenCalled();
expect(mocks.event.emit).not.toHaveBeenCalled();
});
it('should fail if the provided primary asset id is not in the stack', async () => {
accessMock.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
stackMock.getById.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
mocks.access.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
mocks.stack.getById.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
await expect(sut.update(authStub.admin, 'stack-id', { primaryAssetId: 'unknown-asset' })).rejects.toBeInstanceOf(
BadRequestException,
);
expect(stackMock.getById).toHaveBeenCalledWith('stack-id');
expect(stackMock.update).not.toHaveBeenCalled();
expect(eventMock.emit).not.toHaveBeenCalled();
expect(mocks.stack.getById).toHaveBeenCalledWith('stack-id');
expect(mocks.stack.update).not.toHaveBeenCalled();
expect(mocks.event.emit).not.toHaveBeenCalled();
});
it('should update stack', async () => {
accessMock.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
stackMock.getById.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
stackMock.update.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
mocks.access.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
mocks.stack.getById.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
mocks.stack.update.mockResolvedValue(stackStub('stack-id', [assetStub.image, assetStub.image1]));
await sut.update(authStub.admin, 'stack-id', { primaryAssetId: assetStub.image1.id });
expect(stackMock.getById).toHaveBeenCalledWith('stack-id');
expect(stackMock.update).toHaveBeenCalledWith('stack-id', {
expect(mocks.stack.getById).toHaveBeenCalledWith('stack-id');
expect(mocks.stack.update).toHaveBeenCalledWith('stack-id', {
id: 'stack-id',
primaryAssetId: assetStub.image1.id,
});
expect(eventMock.emit).toHaveBeenCalledWith('stack.update', {
expect(mocks.event.emit).toHaveBeenCalledWith('stack.update', {
stackId: 'stack-id',
userId: authStub.admin.user.id,
});
@@ -156,17 +149,17 @@ describe(StackService.name, () => {
it('should require stack.delete permissions', async () => {
await expect(sut.delete(authStub.admin, 'stack-id')).rejects.toBeInstanceOf(BadRequestException);
expect(stackMock.delete).not.toHaveBeenCalled();
expect(eventMock.emit).not.toHaveBeenCalled();
expect(mocks.stack.delete).not.toHaveBeenCalled();
expect(mocks.event.emit).not.toHaveBeenCalled();
});
it('should delete stack', async () => {
accessMock.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
mocks.access.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
await sut.delete(authStub.admin, 'stack-id');
expect(stackMock.delete).toHaveBeenCalledWith('stack-id');
expect(eventMock.emit).toHaveBeenCalledWith('stack.delete', {
expect(mocks.stack.delete).toHaveBeenCalledWith('stack-id');
expect(mocks.event.emit).toHaveBeenCalledWith('stack.delete', {
stackId: 'stack-id',
userId: authStub.admin.user.id,
});
@@ -177,17 +170,17 @@ describe(StackService.name, () => {
it('should require stack.delete permissions', async () => {
await expect(sut.deleteAll(authStub.admin, { ids: ['stack-id'] })).rejects.toBeInstanceOf(BadRequestException);
expect(stackMock.deleteAll).not.toHaveBeenCalled();
expect(eventMock.emit).not.toHaveBeenCalled();
expect(mocks.stack.deleteAll).not.toHaveBeenCalled();
expect(mocks.event.emit).not.toHaveBeenCalled();
});
it('should delete all stacks', async () => {
accessMock.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
mocks.access.stack.checkOwnerAccess.mockResolvedValue(new Set(['stack-id']));
await sut.deleteAll(authStub.admin, { ids: ['stack-id'] });
expect(stackMock.deleteAll).toHaveBeenCalledWith(['stack-id']);
expect(eventMock.emit).toHaveBeenCalledWith('stacks.delete', {
expect(mocks.stack.deleteAll).toHaveBeenCalledWith(['stack-id']);
expect(mocks.event.emit).toHaveBeenCalledWith('stacks.delete', {
stackIds: ['stack-id'],
userId: authStub.admin.user.id,
});