feat: use ILoggerRepository (#8855)
* Migrate ImmichLogger over to injected ILoggerRepository * chore: cleanup and tests --------- Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
This commit is contained in:
@@ -1,18 +1,20 @@
|
||||
import { DatabaseExtension, IDatabaseRepository, VectorIndex } from 'src/interfaces/database.interface';
|
||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||
import { DatabaseService } from 'src/services/database.service';
|
||||
import { ImmichLogger } from 'src/utils/logger';
|
||||
import { Version, VersionType } from 'src/utils/version';
|
||||
import { newDatabaseRepositoryMock } from 'test/repositories/database.repository.mock';
|
||||
import { MockInstance, Mocked, vitest } from 'vitest';
|
||||
import { newLoggerRepositoryMock } from 'test/repositories/logger.repository.mock';
|
||||
import { Mocked } from 'vitest';
|
||||
|
||||
describe(DatabaseService.name, () => {
|
||||
let sut: DatabaseService;
|
||||
let databaseMock: Mocked<IDatabaseRepository>;
|
||||
let loggerMock: Mocked<ILoggerRepository>;
|
||||
|
||||
beforeEach(() => {
|
||||
databaseMock = newDatabaseRepositoryMock();
|
||||
|
||||
sut = new DatabaseService(databaseMock);
|
||||
loggerMock = newLoggerRepositoryMock();
|
||||
sut = new DatabaseService(databaseMock, loggerMock);
|
||||
});
|
||||
|
||||
it('should work', () => {
|
||||
@@ -23,18 +25,11 @@ describe(DatabaseService.name, () => {
|
||||
[{ vectorExt: DatabaseExtension.VECTORS, extName: 'pgvecto.rs', minVersion: new Version(0, 1, 1) }],
|
||||
[{ vectorExt: DatabaseExtension.VECTOR, extName: 'pgvector', minVersion: new Version(0, 5, 0) }],
|
||||
] as const)('init', ({ vectorExt, extName, minVersion }) => {
|
||||
let fatalLog: MockInstance;
|
||||
let errorLog: MockInstance;
|
||||
let warnLog: MockInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
fatalLog = vitest.spyOn(ImmichLogger.prototype, 'fatal');
|
||||
errorLog = vitest.spyOn(ImmichLogger.prototype, 'error');
|
||||
warnLog = vitest.spyOn(ImmichLogger.prototype, 'warn');
|
||||
databaseMock.getPreferredVectorExtension.mockReturnValue(vectorExt);
|
||||
databaseMock.getExtensionVersion.mockResolvedValue(minVersion);
|
||||
|
||||
sut = new DatabaseService(databaseMock);
|
||||
sut = new DatabaseService(databaseMock, loggerMock);
|
||||
|
||||
sut.minVectorVersion = minVersion;
|
||||
sut.minVectorsVersion = minVersion;
|
||||
@@ -42,11 +37,6 @@ describe(DatabaseService.name, () => {
|
||||
sut.vectorsVersionPin = VersionType.MINOR;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
fatalLog.mockRestore();
|
||||
warnLog.mockRestore();
|
||||
});
|
||||
|
||||
it(`should resolve successfully if minimum supported PostgreSQL and ${extName} version are installed`, async () => {
|
||||
databaseMock.getPostgresVersion.mockResolvedValueOnce(new Version(14, 0, 0));
|
||||
|
||||
@@ -57,7 +47,7 @@ describe(DatabaseService.name, () => {
|
||||
expect(databaseMock.createExtension).toHaveBeenCalledTimes(1);
|
||||
expect(databaseMock.getExtensionVersion).toHaveBeenCalled();
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should throw an error if PostgreSQL version is below minimum supported version', async () => {
|
||||
@@ -74,7 +64,7 @@ describe(DatabaseService.name, () => {
|
||||
expect(databaseMock.createExtension).toHaveBeenCalledWith(vectorExt);
|
||||
expect(databaseMock.createExtension).toHaveBeenCalledTimes(1);
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it(`should throw an error if ${extName} version is not installed even after createVectorExtension`, async () => {
|
||||
@@ -134,7 +124,7 @@ describe(DatabaseService.name, () => {
|
||||
|
||||
await expect(sut.init()).rejects.toThrow('Failed to create extension');
|
||||
|
||||
expect(fatalLog).toHaveBeenCalledTimes(1);
|
||||
expect(loggerMock.fatal).toHaveBeenCalledTimes(1);
|
||||
expect(databaseMock.createExtension).toHaveBeenCalledTimes(1);
|
||||
expect(databaseMock.runMigrations).not.toHaveBeenCalled();
|
||||
});
|
||||
@@ -148,7 +138,7 @@ describe(DatabaseService.name, () => {
|
||||
expect(databaseMock.updateVectorExtension).toHaveBeenCalledWith(vectorExt, version);
|
||||
expect(databaseMock.updateVectorExtension).toHaveBeenCalledTimes(1);
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it(`should not update ${extName} if a newer version is higher than the maximum`, async () => {
|
||||
@@ -159,7 +149,7 @@ describe(DatabaseService.name, () => {
|
||||
|
||||
expect(databaseMock.updateVectorExtension).not.toHaveBeenCalled();
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it(`should warn if attempted to update ${extName} and failed`, async () => {
|
||||
@@ -169,10 +159,10 @@ describe(DatabaseService.name, () => {
|
||||
|
||||
await expect(sut.init()).resolves.toBeUndefined();
|
||||
|
||||
expect(warnLog).toHaveBeenCalledTimes(1);
|
||||
expect(warnLog.mock.calls[0][0]).toContain(extName);
|
||||
expect(errorLog).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.warn).toHaveBeenCalledTimes(1);
|
||||
expect(loggerMock.warn.mock.calls[0][0]).toContain(extName);
|
||||
expect(loggerMock.error).toHaveBeenCalledTimes(1);
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
expect(databaseMock.updateVectorExtension).toHaveBeenCalledWith(vectorExt, version);
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
@@ -184,11 +174,11 @@ describe(DatabaseService.name, () => {
|
||||
|
||||
await expect(sut.init()).resolves.toBeUndefined();
|
||||
|
||||
expect(warnLog).toHaveBeenCalledTimes(1);
|
||||
expect(warnLog.mock.calls[0][0]).toContain(extName);
|
||||
expect(loggerMock.warn).toHaveBeenCalledTimes(1);
|
||||
expect(loggerMock.warn.mock.calls[0][0]).toContain(extName);
|
||||
expect(databaseMock.updateVectorExtension).toHaveBeenCalledWith(vectorExt, version);
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it.each([{ index: VectorIndex.CLIP }, { index: VectorIndex.FACE }])(
|
||||
@@ -203,7 +193,7 @@ describe(DatabaseService.name, () => {
|
||||
expect(databaseMock.reindex).toHaveBeenCalledWith(index);
|
||||
expect(databaseMock.reindex).toHaveBeenCalledTimes(1);
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
},
|
||||
);
|
||||
|
||||
@@ -217,7 +207,7 @@ describe(DatabaseService.name, () => {
|
||||
expect(databaseMock.shouldReindex).toHaveBeenCalledTimes(2);
|
||||
expect(databaseMock.reindex).not.toHaveBeenCalled();
|
||||
expect(databaseMock.runMigrations).toHaveBeenCalledTimes(1);
|
||||
expect(fatalLog).not.toHaveBeenCalled();
|
||||
expect(loggerMock.fatal).not.toHaveBeenCalled();
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user