diff --git a/server/src/services/api-key.service.ts b/server/src/services/api-key.service.ts index 7d9a4f3776..44c3015330 100644 --- a/server/src/services/api-key.service.ts +++ b/server/src/services/api-key.service.ts @@ -15,7 +15,7 @@ export class APIKeyService extends BaseService { throw new BadRequestException('Cannot grant permissions you do not have'); } - const entity = await this.keyRepository.create({ + const entity = await this.apiKeyRepository.create({ key: this.cryptoRepository.hashSha256(secret), name: dto.name || 'API Key', userId: auth.user.id, @@ -26,27 +26,27 @@ export class APIKeyService extends BaseService { } async update(auth: AuthDto, id: string, dto: APIKeyUpdateDto): Promise { - const exists = await this.keyRepository.getById(auth.user.id, id); + const exists = await this.apiKeyRepository.getById(auth.user.id, id); if (!exists) { throw new BadRequestException('API Key not found'); } - const key = await this.keyRepository.update(auth.user.id, id, { name: dto.name }); + const key = await this.apiKeyRepository.update(auth.user.id, id, { name: dto.name }); return this.map(key); } async delete(auth: AuthDto, id: string): Promise { - const exists = await this.keyRepository.getById(auth.user.id, id); + const exists = await this.apiKeyRepository.getById(auth.user.id, id); if (!exists) { throw new BadRequestException('API Key not found'); } - await this.keyRepository.delete(auth.user.id, id); + await this.apiKeyRepository.delete(auth.user.id, id); } async getById(auth: AuthDto, id: string): Promise { - const key = await this.keyRepository.getById(auth.user.id, id); + const key = await this.apiKeyRepository.getById(auth.user.id, id); if (!key) { throw new BadRequestException('API Key not found'); } @@ -54,7 +54,7 @@ export class APIKeyService extends BaseService { } async getAll(auth: AuthDto): Promise { - const keys = await this.keyRepository.getByUserId(auth.user.id); + const keys = await this.apiKeyRepository.getByUserId(auth.user.id); return keys.map((key) => this.map(key)); } diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts index 35d48cf57e..4ed3db8419 100644 --- a/server/src/services/auth.service.ts +++ b/server/src/services/auth.service.ts @@ -307,7 +307,7 @@ export class AuthService extends BaseService { private async validateApiKey(key: string): Promise { const hashedKey = this.cryptoRepository.hashSha256(key); - const apiKey = await this.keyRepository.getKey(hashedKey); + const apiKey = await this.apiKeyRepository.getKey(hashedKey); if (apiKey?.user) { return { user: apiKey.user, diff --git a/server/src/services/base.service.ts b/server/src/services/base.service.ts index 63cca43cc2..a1720aeb31 100644 --- a/server/src/services/base.service.ts +++ b/server/src/services/base.service.ts @@ -57,17 +57,17 @@ export class BaseService { protected logger: LoggingRepository, protected accessRepository: AccessRepository, protected activityRepository: ActivityRepository, - protected auditRepository: AuditRepository, protected albumRepository: AlbumRepository, protected albumUserRepository: AlbumUserRepository, + protected apiKeyRepository: ApiKeyRepository, protected assetRepository: AssetRepository, + protected auditRepository: AuditRepository, protected configRepository: ConfigRepository, protected cronRepository: CronRepository, protected cryptoRepository: CryptoRepository, protected databaseRepository: DatabaseRepository, protected eventRepository: EventRepository, protected jobRepository: JobRepository, - protected keyRepository: ApiKeyRepository, protected libraryRepository: LibraryRepository, protected machineLearningRepository: MachineLearningRepository, protected mapRepository: MapRepository, diff --git a/server/test/factory.ts b/server/test/factory.ts index 0b96b74e8e..8811b08628 100644 --- a/server/test/factory.ts +++ b/server/test/factory.ts @@ -4,13 +4,38 @@ import { Writable } from 'node:stream'; import { Assets, DB, Partners, Sessions, Users } from 'src/db'; import { AuthDto } from 'src/dtos/auth.dto'; import { AssetType } from 'src/enum'; +import { AccessRepository } from 'src/repositories/access.repository'; +import { ActivityRepository } from 'src/repositories/activity.repository'; import { AlbumRepository } from 'src/repositories/album.repository'; +import { ApiKeyRepository } from 'src/repositories/api-key.repository'; import { AssetRepository } from 'src/repositories/asset.repository'; +import { AuditRepository } from 'src/repositories/audit.repository'; +import { ConfigRepository } from 'src/repositories/config.repository'; +import { LibraryRepository } from 'src/repositories/library.repository'; +import { LoggingRepository } from 'src/repositories/logging.repository'; +import { MachineLearningRepository } from 'src/repositories/machine-learning.repository'; +import { MediaRepository } from 'src/repositories/media.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 { SyncRepository } from 'src/repositories/sync.repository'; +import { TelemetryRepository } from 'src/repositories/telemetry.repository'; +import { TrashRepository } from 'src/repositories/trash.repository'; import { UserRepository } from 'src/repositories/user.repository'; import { VersionHistoryRepository } from 'src/repositories/version-history.repository'; +import { ViewRepository } from 'src/repositories/view-repository'; +import { newLoggingRepositoryMock } from 'test/repositories/logger.repository.mock'; +import { newTelemetryRepositoryMock } from 'test/repositories/telemetry.repository.mock'; class CustomWritable extends Writable { private data = ''; @@ -157,22 +182,71 @@ export class TestFactory { } export class TestContext { - userRepository: UserRepository; - assetRepository: AssetRepository; - albumRepository: AlbumRepository; - sessionRepository: SessionRepository; - syncRepository: SyncRepository; - partnerRepository: PartnerRepository; - versionHistoryRepository: VersionHistoryRepository; + access: AccessRepository; + logger: LoggingRepository; + activity: ActivityRepository; + album: AlbumRepository; + apiKey: ApiKeyRepository; + asset: AssetRepository; + audit: AuditRepository; + config: ConfigRepository; + library: LibraryRepository; + machineLearning: MachineLearningRepository; + media: MediaRepository; + metadata: MetadataRepository; + move: MoveRepository; + notification: NotificationRepository; + oauth: OAuthRepository; + partner: PartnerRepository; + person: PersonRepository; + process: ProcessRepository; + search: SearchRepository; + serverInfo: ServerInfoRepository; + session: SessionRepository; + sharedLink: SharedLinkRepository; + stack: StackRepository; + storage: StorageRepository; + sync: SyncRepository; + telemetry: TelemetryRepository; + trash: TrashRepository; + user: UserRepository; + versionHistory: VersionHistoryRepository; + view: ViewRepository; private constructor(private db: Kysely) { - this.userRepository = new UserRepository(this.db); - this.assetRepository = new AssetRepository(this.db); - this.albumRepository = new AlbumRepository(this.db); - this.sessionRepository = new SessionRepository(this.db); - this.syncRepository = new SyncRepository(this.db); - this.partnerRepository = new PartnerRepository(this.db); - this.versionHistoryRepository = new VersionHistoryRepository(this.db); + const logger = newLoggingRepositoryMock() as unknown as LoggingRepository; + const config = new ConfigRepository(); + + this.access = new AccessRepository(this.db); + this.logger = logger; + this.activity = new ActivityRepository(this.db); + this.album = new AlbumRepository(this.db); + this.apiKey = new ApiKeyRepository(this.db); + this.asset = new AssetRepository(this.db); + this.audit = new AuditRepository(this.db); + this.config = config; + this.library = new LibraryRepository(this.db); + this.machineLearning = new MachineLearningRepository(logger); + this.media = new MediaRepository(logger); + this.metadata = new MetadataRepository(logger); + this.move = new MoveRepository(this.db); + this.notification = new NotificationRepository(logger); + this.oauth = new OAuthRepository(logger); + this.partner = new PartnerRepository(this.db); + this.person = new PersonRepository(this.db); + this.process = new ProcessRepository(logger); + this.search = new SearchRepository(logger, this.db); + this.serverInfo = new ServerInfoRepository(config, logger); + this.session = new SessionRepository(this.db); + this.sharedLink = new SharedLinkRepository(this.db); + this.stack = new StackRepository(this.db); + this.storage = new StorageRepository(logger); + this.sync = new SyncRepository(this.db); + this.telemetry = newTelemetryRepositoryMock() as unknown as TelemetryRepository; + this.trash = new TrashRepository(this.db); + this.user = new UserRepository(this.db); + this.versionHistory = new VersionHistoryRepository(this.db); + this.view = new ViewRepository(this.db); } static from(db: Kysely) { @@ -184,18 +258,18 @@ export class TestContext { } createUser(user: User = {}) { - return this.userRepository.create(TestFactory.user(user)); + return this.user.create(TestFactory.user(user)); } createPartner(partner: Partner) { - return this.partnerRepository.create(TestFactory.partner(partner)); + return this.partner.create(TestFactory.partner(partner)); } createAsset(asset: Asset) { - return this.assetRepository.create(TestFactory.asset(asset)); + return this.asset.create(TestFactory.asset(asset)); } createSession(session: Session) { - return this.sessionRepository.create(TestFactory.session(session)); + return this.session.create(TestFactory.session(session)); } } diff --git a/server/test/medium/specs/metadata.service.spec.ts b/server/test/medium/specs/metadata.service.spec.ts index 275d3f1bda..22b9174ccd 100644 --- a/server/test/medium/specs/metadata.service.spec.ts +++ b/server/test/medium/specs/metadata.service.spec.ts @@ -34,7 +34,7 @@ describe(MetadataService.name, () => { let mocks: ServiceMocks; beforeEach(() => { - ({ sut, mocks } = newTestService(MetadataService, { metadataRepository })); + ({ sut, mocks } = newTestService(MetadataService, { metadata: metadataRepository })); mocks.storage.stat.mockResolvedValue({ size: 123_456 } as Stats); diff --git a/server/test/medium/specs/sync.service.spec.ts b/server/test/medium/specs/sync.service.spec.ts index 7cd849c6ff..b33b010258 100644 --- a/server/test/medium/specs/sync.service.spec.ts +++ b/server/test/medium/specs/sync.service.spec.ts @@ -37,7 +37,7 @@ describe(SyncService.name, () => { it('should detect and sync the first user', async () => { const { context, auth, sut, testSync } = await setup(); - const user = await context.userRepository.get(auth.user.id, { withDeleted: false }); + const user = await context.user.get(auth.user.id, { withDeleted: false }); if (!user) { expect.fail('First user should exist'); } @@ -109,7 +109,7 @@ describe(SyncService.name, () => { const { auth, context, sut, testSync } = await setup(); const user = await context.createUser(); - await context.userRepository.delete({ id: user.id }, true); + await context.user.delete({ id: user.id }, true); const response = await testSync(auth, [SyncRequestType.UsersV1]); @@ -167,7 +167,7 @@ describe(SyncService.name, () => { const acks = [initialSyncResponse[0].ack]; await sut.setAcks(auth, { acks }); - const updated = await context.userRepository.update(auth.user.id, { name: 'new name' }); + const updated = await context.user.update(auth.user.id, { name: 'new name' }); const updatedSyncResponse = await testSync(auth, [SyncRequestType.UsersV1]); @@ -230,7 +230,7 @@ describe(SyncService.name, () => { const user2 = await context.createUser(); const partner = await context.createPartner({ sharedById: user2.id, sharedWithId: user1.id }); - await context.partnerRepository.remove(partner); + await context.partner.remove(partner); const response = await testSync(auth, [SyncRequestType.PartnersV1]); @@ -326,7 +326,7 @@ describe(SyncService.name, () => { const acks = [initialSyncResponse[0].ack]; await sut.setAcks(auth, { acks }); - const updated = await context.partnerRepository.update( + const updated = await context.partner.update( { sharedById: partner.sharedById, sharedWithId: partner.sharedWithId }, { inTimeline: true }, ); diff --git a/server/test/medium/specs/version.service.spec.ts b/server/test/medium/specs/version.service.spec.ts index dd157b6fa7..5be36b26ba 100644 --- a/server/test/medium/specs/version.service.spec.ts +++ b/server/test/medium/specs/version.service.spec.ts @@ -21,12 +21,12 @@ describe(VersionService.name, () => { it('record the current version on startup', async () => { const { context, sut } = await setup(); - const itemsBefore = await context.versionHistoryRepository.getAll(); + const itemsBefore = await context.versionHistory.getAll(); expect(itemsBefore).toHaveLength(0); await sut.onBootstrap(); - const itemsAfter = await context.versionHistoryRepository.getAll(); + const itemsAfter = await context.versionHistory.getAll(); expect(itemsAfter).toHaveLength(1); expect(itemsAfter[0]).toEqual({ createdAt: expect.any(Date), @@ -38,7 +38,7 @@ describe(VersionService.name, () => { it('should queue memory creation when upgrading from 1.128.0', async () => { const { context, jobMock, sut } = await setup(); - await context.versionHistoryRepository.create({ version: 'v1.128.0' }); + await context.versionHistory.create({ version: 'v1.128.0' }); await sut.onBootstrap(); expect(jobMock.queue).toHaveBeenCalledWith({ name: JobName.MEMORIES_CREATE }); @@ -47,7 +47,7 @@ describe(VersionService.name, () => { it('should not queue memory creation when upgrading from 1.129.0', async () => { const { context, jobMock, sut } = await setup(); - await context.versionHistoryRepository.create({ version: 'v1.129.0' }); + await context.versionHistory.create({ version: 'v1.129.0' }); await sut.onBootstrap(); expect(jobMock.queue).not.toHaveBeenCalled(); diff --git a/server/test/utils.ts b/server/test/utils.ts index 36f6c9f738..b15888e4a3 100644 --- a/server/test/utils.ts +++ b/server/test/utils.ts @@ -6,7 +6,6 @@ import { parse } from 'pg-connection-string'; import { PNG } from 'pngjs'; import postgres, { Notice } from 'postgres'; import { DB } from 'src/db'; -import { ImmichWorker } from 'src/enum'; import { AccessRepository } from 'src/repositories/access.repository'; import { ActivityRepository } from 'src/repositories/activity.repository'; import { AlbumUserRepository } from 'src/repositories/album-user.repository'; @@ -92,198 +91,154 @@ import { newViewRepositoryMock } from 'test/repositories/view.repository.mock'; import { Readable } from 'typeorm/platform/PlatformTools'; import { Mocked, vitest } from 'vitest'; -type Overrides = { - worker?: ImmichWorker; - metadataRepository?: MetadataRepository; - syncRepository?: SyncRepository; - userRepository?: UserRepository; - versionHistoryRepository?: VersionHistoryRepository; +export type ServiceOverrides = { + access: AccessRepository; + activity: ActivityRepository; + album: AlbumRepository; + albumUser: AlbumUserRepository; + apiKey: ApiKeyRepository; + audit: AuditRepository; + asset: AssetRepository; + config: ConfigRepository; + cron: CronRepository; + crypto: CryptoRepository; + database: DatabaseRepository; + event: EventRepository; + job: JobRepository; + library: LibraryRepository; + logger: LoggingRepository; + machineLearning: MachineLearningRepository; + map: MapRepository; + media: MediaRepository; + memory: MemoryRepository; + metadata: MetadataRepository; + move: MoveRepository; + notification: NotificationRepository; + oauth: OAuthRepository; + partner: PartnerRepository; + person: PersonRepository; + process: ProcessRepository; + search: SearchRepository; + serverInfo: ServerInfoRepository; + session: SessionRepository; + sharedLink: SharedLinkRepository; + stack: StackRepository; + storage: StorageRepository; + sync: SyncRepository; + systemMetadata: SystemMetadataRepository; + tag: TagRepository; + telemetry: TelemetryRepository; + trash: TrashRepository; + user: UserRepository; + versionHistory: VersionHistoryRepository; + view: ViewRepository; }; + +type As = T extends RepositoryInterface ? U : never; +type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInterface }; + +export type ServiceMocks = { + [K in keyof Omit]: Mocked>; +} & { access: IAccessRepositoryMock; telemetry: ITelemetryRepositoryMock }; + type BaseServiceArgs = ConstructorParameters; type Constructor> = { new (...deps: Args): Type; }; -type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInterface }; - -export type ServiceMocks = { - access: IAccessRepositoryMock; - activity: Mocked>; - album: Mocked>; - albumUser: Mocked>; - apiKey: Mocked>; - audit: Mocked>; - asset: Mocked>; - config: Mocked>; - cron: Mocked>; - crypto: Mocked>; - database: Mocked>; - event: Mocked>; - job: Mocked>; - library: Mocked>; - logger: Mocked>; - machineLearning: Mocked>; - map: Mocked>; - media: Mocked>; - memory: Mocked>; - metadata: Mocked>; - move: Mocked>; - notification: Mocked>; - oauth: Mocked>; - partner: Mocked>; - person: Mocked>; - process: Mocked>; - search: Mocked>; - serverInfo: Mocked>; - session: Mocked>; - sharedLink: Mocked>; - stack: Mocked>; - storage: Mocked>; - systemMetadata: Mocked>; - tag: Mocked>; - telemetry: ITelemetryRepositoryMock; - trash: Mocked>; - user: Mocked>; - versionHistory: Mocked>; - view: Mocked>; -}; - export const newTestService = ( Service: Constructor, - overrides?: Overrides, + overrides: Partial = {}, ) => { - const { metadataRepository, userRepository, syncRepository, versionHistoryRepository } = overrides || {}; - - const accessMock = newAccessRepositoryMock(); - const loggerMock = newLoggingRepositoryMock(); - const cronMock = newCronRepositoryMock(); - const cryptoMock = newCryptoRepositoryMock(); - const activityMock = newActivityRepositoryMock(); - const auditMock = newAuditRepositoryMock(); - const albumMock = newAlbumRepositoryMock(); - const albumUserMock = newAlbumUserRepositoryMock(); - const assetMock = newAssetRepositoryMock(); - const configMock = newConfigRepositoryMock(); - const databaseMock = newDatabaseRepositoryMock(); - const eventMock = newEventRepositoryMock(); - const jobMock = newJobRepositoryMock(); - const apiKeyMock = newKeyRepositoryMock(); - const libraryMock = newLibraryRepositoryMock(); - const machineLearningMock = newMachineLearningRepositoryMock(); - const mapMock = newMapRepositoryMock(); - const mediaMock = newMediaRepositoryMock(); - const memoryMock = newMemoryRepositoryMock(); - const metadataMock = (metadataRepository || newMetadataRepositoryMock()) as Mocked< - RepositoryInterface - >; - const moveMock = newMoveRepositoryMock(); - const notificationMock = newNotificationRepositoryMock(); - const oauthMock = newOAuthRepositoryMock(); - const partnerMock = newPartnerRepositoryMock(); - const personMock = newPersonRepositoryMock(); - const processMock = newProcessRepositoryMock(); - const searchMock = newSearchRepositoryMock(); - const serverInfoMock = newServerInfoRepositoryMock(); - const sessionMock = newSessionRepositoryMock(); - const sharedLinkMock = newSharedLinkRepositoryMock(); - const stackMock = newStackRepositoryMock(); - const storageMock = newStorageRepositoryMock(); - const syncMock = (syncRepository || newSyncRepositoryMock()) as Mocked>; - const systemMock = newSystemMetadataRepositoryMock(); - const tagMock = newTagRepositoryMock(); - const telemetryMock = newTelemetryRepositoryMock(); - const trashMock = newTrashRepositoryMock(); - const userMock = (userRepository || newUserRepositoryMock()) as Mocked>; - const versionHistoryMock = newVersionHistoryRepositoryMock(); - const viewMock = newViewRepositoryMock(); + const mocks: ServiceMocks = { + access: newAccessRepositoryMock(), + logger: newLoggingRepositoryMock(), + cron: newCronRepositoryMock(), + crypto: newCryptoRepositoryMock(), + activity: newActivityRepositoryMock(), + audit: newAuditRepositoryMock(), + album: newAlbumRepositoryMock(), + albumUser: newAlbumUserRepositoryMock(), + asset: newAssetRepositoryMock(), + config: newConfigRepositoryMock(), + database: newDatabaseRepositoryMock(), + event: newEventRepositoryMock(), + job: newJobRepositoryMock(), + apiKey: newKeyRepositoryMock(), + library: newLibraryRepositoryMock(), + machineLearning: newMachineLearningRepositoryMock(), + map: newMapRepositoryMock(), + media: newMediaRepositoryMock(), + memory: newMemoryRepositoryMock(), + metadata: newMetadataRepositoryMock(), + move: newMoveRepositoryMock(), + notification: newNotificationRepositoryMock(), + oauth: newOAuthRepositoryMock(), + partner: newPartnerRepositoryMock(), + person: newPersonRepositoryMock(), + process: newProcessRepositoryMock(), + search: newSearchRepositoryMock(), + serverInfo: newServerInfoRepositoryMock(), + session: newSessionRepositoryMock(), + sharedLink: newSharedLinkRepositoryMock(), + stack: newStackRepositoryMock(), + storage: newStorageRepositoryMock(), + sync: newSyncRepositoryMock(), + systemMetadata: newSystemMetadataRepositoryMock(), + tag: newTagRepositoryMock(), + telemetry: newTelemetryRepositoryMock(), + trash: newTrashRepositoryMock(), + user: newUserRepositoryMock(), + versionHistory: newVersionHistoryRepositoryMock(), + view: newViewRepositoryMock(), + }; const sut = new Service( - loggerMock as RepositoryInterface as LoggingRepository, - accessMock as IAccessRepository as AccessRepository, - activityMock as RepositoryInterface as ActivityRepository, - auditMock as RepositoryInterface as AuditRepository, - albumMock as RepositoryInterface as AlbumRepository, - albumUserMock as RepositoryInterface as AlbumUserRepository, - assetMock as RepositoryInterface as AssetRepository, - configMock as RepositoryInterface as ConfigRepository, - cronMock as RepositoryInterface as CronRepository, - cryptoMock as RepositoryInterface as CryptoRepository, - databaseMock as RepositoryInterface as DatabaseRepository, - eventMock as RepositoryInterface as EventRepository, - jobMock as RepositoryInterface as JobRepository, - apiKeyMock as RepositoryInterface as ApiKeyRepository, - libraryMock as RepositoryInterface as LibraryRepository, - machineLearningMock as RepositoryInterface as MachineLearningRepository, - mapMock as RepositoryInterface as MapRepository, - mediaMock as RepositoryInterface as MediaRepository, - memoryMock as RepositoryInterface as MemoryRepository, - metadataMock as RepositoryInterface as MetadataRepository, - moveMock as RepositoryInterface as MoveRepository, - notificationMock as RepositoryInterface as NotificationRepository, - oauthMock as RepositoryInterface as OAuthRepository, - partnerMock as RepositoryInterface as PartnerRepository, - personMock as RepositoryInterface as PersonRepository, - processMock as RepositoryInterface as ProcessRepository, - searchMock as RepositoryInterface as SearchRepository, - serverInfoMock as RepositoryInterface as ServerInfoRepository, - sessionMock as RepositoryInterface as SessionRepository, - sharedLinkMock as RepositoryInterface as SharedLinkRepository, - stackMock as RepositoryInterface as StackRepository, - storageMock as RepositoryInterface as StorageRepository, - syncMock as RepositoryInterface as SyncRepository, - systemMock as RepositoryInterface as SystemMetadataRepository, - tagMock as RepositoryInterface as TagRepository, - telemetryMock as unknown as TelemetryRepository, - trashMock as RepositoryInterface as TrashRepository, - userMock as RepositoryInterface as UserRepository, - versionHistoryRepository || - (versionHistoryMock as RepositoryInterface as VersionHistoryRepository), - viewMock as RepositoryInterface as ViewRepository, + overrides.logger || (mocks.logger as As), + overrides.access || (mocks.access as IAccessRepository as AccessRepository), + overrides.activity || (mocks.activity as As), + overrides.album || (mocks.album as As), + overrides.albumUser || (mocks.albumUser as As), + overrides.apiKey || (mocks.apiKey as As), + overrides.asset || (mocks.asset as As), + overrides.audit || (mocks.audit as As), + overrides.config || (mocks.config as As as ConfigRepository), + overrides.cron || (mocks.cron as As), + overrides.crypto || (mocks.crypto as As), + overrides.database || (mocks.database as As), + overrides.event || (mocks.event as As), + overrides.job || (mocks.job as As), + overrides.library || (mocks.library as As), + overrides.machineLearning || (mocks.machineLearning as As), + overrides.map || (mocks.map as As), + overrides.media || (mocks.media as As), + overrides.memory || (mocks.memory as As), + overrides.metadata || (mocks.metadata as As), + overrides.move || (mocks.move as As), + overrides.notification || (mocks.notification as As), + overrides.oauth || (mocks.oauth as As), + overrides.partner || (mocks.partner as As), + overrides.person || (mocks.person as As), + overrides.process || (mocks.process as As), + overrides.search || (mocks.search as As), + overrides.serverInfo || (mocks.serverInfo as As), + overrides.session || (mocks.session as As), + overrides.sharedLink || (mocks.sharedLink as As), + overrides.stack || (mocks.stack as As), + overrides.storage || (mocks.storage as As), + overrides.sync || (mocks.sync as As), + overrides.systemMetadata || (mocks.systemMetadata as As), + overrides.tag || (mocks.tag as As), + overrides.telemetry || (mocks.telemetry as unknown as TelemetryRepository), + overrides.trash || (mocks.trash as As), + overrides.user || (mocks.user as As), + overrides.versionHistory || (mocks.versionHistory as As), + overrides.view || (mocks.view as As), ); return { sut, - 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, + mocks, }; };