From 5ae8c5beddf4d6a2d8428d145ad953b13aa658e3 Mon Sep 17 00:00:00 2001 From: 4gray Date: Fri, 22 May 2026 13:01:28 +0300 Subject: [PATCH] test(services): avoid angular testing entrypoint --- .../src/lib/downloads.service.spec.ts | 30 ++++++++++++----- .../playlist-delete-action.service.spec.ts | 33 ++++++++++++++----- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/libs/services/src/lib/downloads.service.spec.ts b/libs/services/src/lib/downloads.service.spec.ts index 886850fad..ee83d16a5 100644 --- a/libs/services/src/lib/downloads.service.spec.ts +++ b/libs/services/src/lib/downloads.service.spec.ts @@ -1,5 +1,12 @@ -import { signal, Signal, WritableSignal } from '@angular/core'; -import { TestBed } from '@angular/core/testing'; +import { + EnvironmentInjector, + Injector, + Signal, + WritableSignal, + createEnvironmentInjector, + runInInjectionContext, + signal, +} from '@angular/core'; import { DownloadItem, DownloadsService, @@ -30,7 +37,6 @@ describe('DownloadsService', () => { afterEach(() => { testWindow.electron = originalElectron; - TestBed.resetTestingModule(); jest.restoreAllMocks(); }); @@ -79,8 +85,8 @@ describe('DownloadsService', () => { } it('reports availability through the runtime capability', () => { - TestBed.configureTestingModule({ - providers: [ + const injector = createEnvironmentInjector( + [ DownloadsService, { provide: SettingsStore, useValue: {} }, { @@ -88,11 +94,19 @@ describe('DownloadsService', () => { useValue: { supportsDownloads: false }, }, ], - }); + Injector.NULL as unknown as EnvironmentInjector + ); - const service = TestBed.inject(DownloadsService); + try { + const service = runInInjectionContext( + injector, + () => new DownloadsService() + ); - expect(service.isAvailable()).toBe(false); + expect(service.isAvailable()).toBe(false); + } finally { + injector.destroy(); + } }); it('tracks loading and loaded state around a successful download list request', async () => { diff --git a/libs/services/src/lib/playlist-delete-action.service.spec.ts b/libs/services/src/lib/playlist-delete-action.service.spec.ts index aa6258c5a..e9bfc0f38 100644 --- a/libs/services/src/lib/playlist-delete-action.service.spec.ts +++ b/libs/services/src/lib/playlist-delete-action.service.spec.ts @@ -1,4 +1,9 @@ -import { TestBed } from '@angular/core/testing'; +import { + EnvironmentInjector, + Injector, + createEnvironmentInjector, + runInInjectionContext, +} from '@angular/core'; import { of } from 'rxjs'; import { PlaylistMeta } from '@iptvnator/shared/interfaces'; import { DatabaseService } from './database-electron.service'; @@ -23,6 +28,7 @@ describe('PlaylistDeleteActionService', () => { let runtime: { isElectron: boolean; }; + let injector: EnvironmentInjector; beforeEach(() => { databaseService = { @@ -38,18 +44,29 @@ describe('PlaylistDeleteActionService', () => { isElectron: false, }; - TestBed.configureTestingModule({ - providers: [ - PlaylistDeleteActionService, + injector = createEnvironmentInjector( + [ { provide: DatabaseService, useValue: databaseService }, { provide: PlaylistsService, useValue: playlistsService }, { provide: RuntimeCapabilitiesService, useValue: runtime }, ], - }); + Injector.NULL as unknown as EnvironmentInjector + ); }); + afterEach(() => { + injector.destroy(); + }); + + function createService(): PlaylistDeleteActionService { + return runInInjectionContext( + injector, + () => new PlaylistDeleteActionService() + ); + } + it('deletes browser playlists through PlaylistsService', async () => { - const service = TestBed.inject(PlaylistDeleteActionService); + const service = createService(); await expect(service.deletePlaylist(playlist)).resolves.toBe(true); @@ -62,7 +79,7 @@ describe('PlaylistDeleteActionService', () => { it('deletes Electron Xtream playlists through DatabaseService with progress options', async () => { runtime.isElectron = true; const onEvent = jest.fn(); - const service = TestBed.inject(PlaylistDeleteActionService); + const service = createService(); await expect( service.deletePlaylist(playlist, { onEvent }) @@ -83,7 +100,7 @@ describe('PlaylistDeleteActionService', () => { it('deletes Electron non-Xtream playlists without progress options', async () => { runtime.isElectron = true; - const service = TestBed.inject(PlaylistDeleteActionService); + const service = createService(); await expect( service.deletePlaylist({