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
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
74 changed files with 3820 additions and 4043 deletions

View file

@ -2,51 +2,49 @@ import { ChildProcessWithoutNullStreams } from 'node:child_process';
import { Writable } from 'node:stream';
import { PNG } from 'pngjs';
import { ImmichWorker } from 'src/enum';
import { IAlbumRepository } from 'src/interfaces/album.interface';
import { IAssetRepository } from 'src/interfaces/asset.interface';
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
import { IEventRepository } from 'src/interfaces/event.interface';
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.interface';
import { IUserRepository } from 'src/interfaces/user.interface';
import { AccessRepository } from 'src/repositories/access.repository';
import { ActivityRepository } from 'src/repositories/activity.repository';
import { AlbumUserRepository } from 'src/repositories/album-user.repository';
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
import { AuditRepository } from 'src/repositories/audit.repository';
import { ConfigRepository } from 'src/repositories/config.repository';
import { CronRepository } from 'src/repositories/cron.repository';
import { CryptoRepository } from 'src/repositories/crypto.repository';
import { DatabaseRepository } from 'src/repositories/database.repository';
import { JobRepository } from 'src/repositories/job.repository';
import { LibraryRepository } from 'src/repositories/library.repository';
import { LoggingRepository } from 'src/repositories/logging.repository';
import { MapRepository } from 'src/repositories/map.repository';
import { MediaRepository } from 'src/repositories/media.repository';
import { MemoryRepository } from 'src/repositories/memory.repository';
import { MetadataRepository } from 'src/repositories/metadata.repository';
import { MoveRepository } from 'src/repositories/move.repository';
import { NotificationRepository } from 'src/repositories/notification.repository';
import { OAuthRepository } from 'src/repositories/oauth.repository';
import { PartnerRepository } from 'src/repositories/partner.repository';
import { PersonRepository } from 'src/repositories/person.repository';
import { ProcessRepository } from 'src/repositories/process.repository';
import { SearchRepository } from 'src/repositories/search.repository';
import { ServerInfoRepository } from 'src/repositories/server-info.repository';
import { SessionRepository } from 'src/repositories/session.repository';
import { SharedLinkRepository } from 'src/repositories/shared-link.repository';
import { StackRepository } from 'src/repositories/stack.repository';
import { StorageRepository } from 'src/repositories/storage.repository';
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
import { TagRepository } from 'src/repositories/tag.repository';
import { TelemetryRepository } from 'src/repositories/telemetry.repository';
import { TrashRepository } from 'src/repositories/trash.repository';
import { VersionHistoryRepository } from 'src/repositories/version-history.repository';
import { ViewRepository } from 'src/repositories/view-repository';
import { BaseService } from 'src/services/base.service';
import {
IAccessRepository,
IActivityRepository,
IAlbumUserRepository,
IApiKeyRepository,
IAuditRepository,
ICronRepository,
ILoggingRepository,
IMapRepository,
IMediaRepository,
IMemoryRepository,
IMetadataRepository,
INotificationRepository,
IOAuthRepository,
IProcessRepository,
IServerInfoRepository,
ISessionRepository,
ISystemMetadataRepository,
ITrashRepository,
IVersionHistoryRepository,
IViewRepository,
} from 'src/types';
import { newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
import { RepositoryInterface } from 'src/types';
import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
import { newActivityRepositoryMock } from 'test/repositories/activity.repository.mock';
import { newAlbumUserRepositoryMock } from 'test/repositories/album-user.repository.mock';
import { newAlbumRepositoryMock } from 'test/repositories/album.repository.mock';
@ -60,7 +58,7 @@ import { newDatabaseRepositoryMock } from 'test/repositories/database.repository
import { newEventRepositoryMock } from 'test/repositories/event.repository.mock';
import { newJobRepositoryMock } from 'test/repositories/job.repository.mock';
import { newLibraryRepositoryMock } from 'test/repositories/library.repository.mock';
import { newLoggingRepositoryMock } from 'test/repositories/logger.repository.mock';
import { ILoggingRepository, newLoggingRepositoryMock } from 'test/repositories/logger.repository.mock';
import { newMachineLearningRepositoryMock } from 'test/repositories/machine-learning.repository.mock';
import { newMapRepositoryMock } from 'test/repositories/map.repository.mock';
import { newMediaRepositoryMock } from 'test/repositories/media.repository.mock';
@ -80,7 +78,7 @@ import { newStackRepositoryMock } from 'test/repositories/stack.repository.mock'
import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock';
import { newTagRepositoryMock } from 'test/repositories/tag.repository.mock';
import { newTelemetryRepositoryMock } from 'test/repositories/telemetry.repository.mock';
import { ITelemetryRepositoryMock, newTelemetryRepositoryMock } from 'test/repositories/telemetry.repository.mock';
import { newTrashRepositoryMock } from 'test/repositories/trash.repository.mock';
import { newUserRepositoryMock } from 'test/repositories/user.repository.mock';
import { newVersionHistoryRepositoryMock } from 'test/repositories/version-history.repository.mock';
@ -97,6 +95,50 @@ type Constructor<Type, Args extends Array<any>> = {
new (...deps: Args): Type;
};
type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInterface<AccessRepository[K]> };
export type ServiceMocks = {
access: IAccessRepositoryMock;
activity: Mocked<RepositoryInterface<ActivityRepository>>;
album: Mocked<IAlbumRepository>;
albumUser: Mocked<RepositoryInterface<AlbumUserRepository>>;
apiKey: Mocked<RepositoryInterface<ApiKeyRepository>>;
audit: Mocked<RepositoryInterface<AuditRepository>>;
asset: Mocked<IAssetRepository>;
config: Mocked<RepositoryInterface<ConfigRepository>>;
cron: Mocked<RepositoryInterface<CronRepository>>;
crypto: Mocked<ICryptoRepository>;
database: Mocked<RepositoryInterface<DatabaseRepository>>;
event: Mocked<IEventRepository>;
job: Mocked<RepositoryInterface<JobRepository>>;
library: Mocked<RepositoryInterface<LibraryRepository>>;
logger: Mocked<ILoggingRepository>;
machineLearning: Mocked<IMachineLearningRepository>;
map: Mocked<RepositoryInterface<MapRepository>>;
media: Mocked<RepositoryInterface<MediaRepository>>;
memory: Mocked<RepositoryInterface<MemoryRepository>>;
metadata: Mocked<RepositoryInterface<MetadataRepository>>;
move: Mocked<RepositoryInterface<MoveRepository>>;
notification: Mocked<RepositoryInterface<NotificationRepository>>;
oauth: Mocked<RepositoryInterface<OAuthRepository>>;
partner: Mocked<RepositoryInterface<PartnerRepository>>;
person: Mocked<RepositoryInterface<PersonRepository>>;
process: Mocked<RepositoryInterface<ProcessRepository>>;
search: Mocked<RepositoryInterface<SearchRepository>>;
serverInfo: Mocked<RepositoryInterface<ServerInfoRepository>>;
session: Mocked<RepositoryInterface<SessionRepository>>;
sharedLink: Mocked<RepositoryInterface<SharedLinkRepository>>;
stack: Mocked<RepositoryInterface<StackRepository>>;
storage: Mocked<RepositoryInterface<StorageRepository>>;
systemMetadata: Mocked<RepositoryInterface<SystemMetadataRepository>>;
tag: Mocked<RepositoryInterface<TagRepository>>;
telemetry: ITelemetryRepositoryMock;
trash: Mocked<RepositoryInterface<TrashRepository>>;
user: Mocked<IUserRepository>;
versionHistory: Mocked<RepositoryInterface<VersionHistoryRepository>>;
view: Mocked<RepositoryInterface<ViewRepository>>;
};
export const newTestService = <T extends BaseService>(
Service: Constructor<T, BaseServiceArgs>,
overrides?: Overrides,
@ -116,13 +158,15 @@ export const newTestService = <T extends BaseService>(
const databaseMock = newDatabaseRepositoryMock();
const eventMock = newEventRepositoryMock();
const jobMock = newJobRepositoryMock();
const keyMock = newKeyRepositoryMock();
const apiKeyMock = newKeyRepositoryMock();
const libraryMock = newLibraryRepositoryMock();
const machineLearningMock = newMachineLearningRepositoryMock();
const mapMock = newMapRepositoryMock();
const mediaMock = newMediaRepositoryMock();
const memoryMock = newMemoryRepositoryMock();
const metadataMock = (metadataRepository || newMetadataRepositoryMock()) as Mocked<IMetadataRepository>;
const metadataMock = (metadataRepository || newMetadataRepositoryMock()) as Mocked<
RepositoryInterface<MetadataRepository>
>;
const moveMock = newMoveRepositoryMock();
const notificationMock = newNotificationRepositoryMock();
const oauthMock = newOAuthRepositoryMock();
@ -146,86 +190,88 @@ export const newTestService = <T extends BaseService>(
const sut = new Service(
loggerMock as ILoggingRepository as LoggingRepository,
accessMock as IAccessRepository as AccessRepository,
activityMock as IActivityRepository as ActivityRepository,
auditMock as IAuditRepository as AuditRepository,
activityMock as RepositoryInterface<ActivityRepository> as ActivityRepository,
auditMock as RepositoryInterface<AuditRepository> as AuditRepository,
albumMock,
albumUserMock as IAlbumUserRepository as AlbumUserRepository,
albumUserMock as RepositoryInterface<AlbumUserRepository> as AlbumUserRepository,
assetMock,
configMock,
cronMock as ICronRepository as CronRepository,
cryptoMock,
cronMock as RepositoryInterface<CronRepository> as CronRepository,
cryptoMock as RepositoryInterface<CryptoRepository> as CryptoRepository,
databaseMock,
eventMock,
jobMock,
keyMock as IApiKeyRepository as ApiKeyRepository,
apiKeyMock as RepositoryInterface<ApiKeyRepository> as ApiKeyRepository,
libraryMock,
machineLearningMock,
mapMock as IMapRepository as MapRepository,
mediaMock as IMediaRepository as MediaRepository,
memoryMock as IMemoryRepository as MemoryRepository,
metadataMock as IMetadataRepository as MetadataRepository,
mapMock as RepositoryInterface<MapRepository> as MapRepository,
mediaMock as RepositoryInterface<MediaRepository> as MediaRepository,
memoryMock as RepositoryInterface<MemoryRepository> as MemoryRepository,
metadataMock as RepositoryInterface<MetadataRepository> as MetadataRepository,
moveMock,
notificationMock as INotificationRepository as NotificationRepository,
oauthMock as IOAuthRepository as OAuthRepository,
notificationMock as RepositoryInterface<NotificationRepository> as NotificationRepository,
oauthMock as RepositoryInterface<OAuthRepository> as OAuthRepository,
partnerMock,
personMock,
processMock as IProcessRepository as ProcessRepository,
processMock as RepositoryInterface<ProcessRepository> as ProcessRepository,
searchMock,
serverInfoMock as IServerInfoRepository as ServerInfoRepository,
sessionMock as ISessionRepository as SessionRepository,
serverInfoMock as RepositoryInterface<ServerInfoRepository> as ServerInfoRepository,
sessionMock as RepositoryInterface<SessionRepository> as SessionRepository,
sharedLinkMock,
stackMock,
storageMock,
systemMock as ISystemMetadataRepository as SystemMetadataRepository,
systemMock as RepositoryInterface<SystemMetadataRepository> as SystemMetadataRepository,
tagMock,
telemetryMock as unknown as TelemetryRepository,
trashMock as ITrashRepository as TrashRepository,
trashMock as RepositoryInterface<TrashRepository> as TrashRepository,
userMock,
versionHistoryMock as IVersionHistoryRepository as VersionHistoryRepository,
viewMock as IViewRepository as ViewRepository,
versionHistoryMock as RepositoryInterface<VersionHistoryRepository> as VersionHistoryRepository,
viewMock as RepositoryInterface<ViewRepository> as ViewRepository,
);
return {
sut,
accessMock,
loggerMock,
cronMock,
cryptoMock,
activityMock,
auditMock,
albumMock,
albumUserMock,
assetMock,
configMock,
databaseMock,
eventMock,
jobMock,
keyMock,
libraryMock,
machineLearningMock,
mapMock,
mediaMock,
memoryMock,
metadataMock,
moveMock,
notificationMock,
oauthMock,
partnerMock,
personMock,
processMock,
searchMock,
serverInfoMock,
sessionMock,
sharedLinkMock,
stackMock,
storageMock,
systemMock,
tagMock,
telemetryMock,
trashMock,
userMock,
versionHistoryMock,
viewMock,
mocks: {
access: accessMock,
apiKey: apiKeyMock,
cron: cronMock,
crypto: cryptoMock,
activity: activityMock,
audit: auditMock,
album: albumMock,
albumUser: albumUserMock,
asset: assetMock,
config: configMock,
database: databaseMock,
event: eventMock,
job: jobMock,
library: libraryMock,
logger: loggerMock,
machineLearning: machineLearningMock,
map: mapMock,
media: mediaMock,
memory: memoryMock,
metadata: metadataMock,
move: moveMock,
notification: notificationMock,
oauth: oauthMock,
partner: partnerMock,
person: personMock,
process: processMock,
search: searchMock,
serverInfo: serverInfoMock,
session: sessionMock,
sharedLink: sharedLinkMock,
stack: stackMock,
storage: storageMock,
systemMetadata: systemMock,
tag: tagMock,
telemetry: telemetryMock,
trash: trashMock,
user: userMock,
versionHistory: versionHistoryMock,
view: viewMock,
} as ServiceMocks,
};
};