import { IConfigRepository } from 'src/interfaces/config.interface'; import { ICryptoRepository } from 'src/interfaces/crypto.interface'; import { ILoggerRepository } from 'src/interfaces/logger.interface'; import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface'; import { IUserRepository } from 'src/interfaces/user.interface'; import { CliService } from 'src/services/cli.service'; import { userStub } from 'test/fixtures/user.stub'; import { newConfigRepositoryMock } from 'test/repositories/config.repository.mock'; import { newCryptoRepositoryMock } from 'test/repositories/crypto.repository.mock'; import { newLoggerRepositoryMock } from 'test/repositories/logger.repository.mock'; import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock'; import { newUserRepositoryMock } from 'test/repositories/user.repository.mock'; import { Mocked, describe, it } from 'vitest'; describe(CliService.name, () => { let sut: CliService; let configMock: Mocked; let cryptoMock: Mocked; let userMock: Mocked; let systemMock: Mocked; let loggerMock: Mocked; beforeEach(() => { configMock = newConfigRepositoryMock(); cryptoMock = newCryptoRepositoryMock(); systemMock = newSystemMetadataRepositoryMock(); userMock = newUserRepositoryMock(); loggerMock = newLoggerRepositoryMock(); sut = new CliService(configMock, cryptoMock, systemMock, userMock, loggerMock); }); describe('resetAdminPassword', () => { it('should only work when there is an admin account', async () => { userMock.getAdmin.mockResolvedValue(null); const ask = vitest.fn().mockResolvedValue('new-password'); await expect(sut.resetAdminPassword(ask)).rejects.toThrowError('Admin account does not exist'); expect(ask).not.toHaveBeenCalled(); }); it('should default to a random password', async () => { userMock.getAdmin.mockResolvedValue(userStub.admin); const ask = vitest.fn().mockImplementation(() => {}); const response = await sut.resetAdminPassword(ask); const [id, update] = userMock.update.mock.calls[0]; expect(response.provided).toBe(false); expect(ask).toHaveBeenCalled(); expect(id).toEqual(userStub.admin.id); expect(update.password).toBeDefined(); }); it('should use the supplied password', async () => { userMock.getAdmin.mockResolvedValue(userStub.admin); const ask = vitest.fn().mockResolvedValue('new-password'); const response = await sut.resetAdminPassword(ask); const [id, update] = userMock.update.mock.calls[0]; expect(response.provided).toBe(true); expect(ask).toHaveBeenCalled(); expect(id).toEqual(userStub.admin.id); expect(update.password).toBeDefined(); }); }); });