105 lines
3.7 KiB
TypeScript
105 lines
3.7 KiB
TypeScript
import { signal } from '@angular/core';
|
|
import { TestBed } from '@angular/core/testing';
|
|
import { of } from 'rxjs';
|
|
import { PlaylistsService, SettingsStore } from 'services';
|
|
import { StartupBehavior } from 'shared-interfaces';
|
|
import { WorkspaceStartupPreferencesService } from './workspace-startup-preferences.service';
|
|
|
|
describe('WorkspaceStartupPreferencesService', () => {
|
|
let service: WorkspaceStartupPreferencesService;
|
|
let playlistsService: { getAllPlaylists: jest.Mock };
|
|
let settingsStore: {
|
|
loadSettings: jest.Mock;
|
|
showDashboard: ReturnType<typeof signal<boolean>>;
|
|
startupBehavior: ReturnType<typeof signal<StartupBehavior>>;
|
|
};
|
|
|
|
beforeEach(() => {
|
|
localStorage.clear();
|
|
|
|
playlistsService = {
|
|
getAllPlaylists: jest.fn().mockReturnValue(
|
|
of([{ _id: 'playlist-1' }])
|
|
),
|
|
};
|
|
settingsStore = {
|
|
loadSettings: jest.fn().mockResolvedValue(undefined),
|
|
showDashboard: signal(true),
|
|
startupBehavior: signal(StartupBehavior.FirstView),
|
|
};
|
|
|
|
TestBed.configureTestingModule({
|
|
providers: [
|
|
WorkspaceStartupPreferencesService,
|
|
{
|
|
provide: PlaylistsService,
|
|
useValue: playlistsService,
|
|
},
|
|
{
|
|
provide: SettingsStore,
|
|
useValue: settingsStore,
|
|
},
|
|
],
|
|
});
|
|
|
|
service = TestBed.inject(WorkspaceStartupPreferencesService);
|
|
});
|
|
|
|
it('resolves the first view to dashboard when dashboard is enabled', async () => {
|
|
await expect(service.resolveInitialWorkspacePath()).resolves.toBe(
|
|
'/workspace/dashboard'
|
|
);
|
|
});
|
|
|
|
it('resolves the first view to sources when dashboard is hidden', async () => {
|
|
settingsStore.showDashboard.set(false);
|
|
|
|
await expect(service.resolveInitialWorkspacePath()).resolves.toBe(
|
|
'/workspace/sources'
|
|
);
|
|
});
|
|
|
|
it('restores the last route when restore-last-view is enabled', async () => {
|
|
settingsStore.startupBehavior.set(StartupBehavior.RestoreLastView);
|
|
service.persistLastRestorablePath('/workspace/global-recent?q=matrix');
|
|
|
|
await expect(service.resolveInitialWorkspacePath()).resolves.toBe(
|
|
'/workspace/global-recent'
|
|
);
|
|
});
|
|
|
|
it('falls back to sources when the stored dashboard route is hidden', async () => {
|
|
settingsStore.showDashboard.set(false);
|
|
settingsStore.startupBehavior.set(StartupBehavior.RestoreLastView);
|
|
service.persistLastRestorablePath('/workspace/dashboard');
|
|
|
|
await expect(service.resolveInitialWorkspacePath()).resolves.toBe(
|
|
'/workspace/sources'
|
|
);
|
|
});
|
|
|
|
it('canonicalizes detail routes to their section root', () => {
|
|
expect(
|
|
service.getRestorablePath(
|
|
'/workspace/xtreams/playlist-1/vod/123/456?q=matrix'
|
|
)
|
|
).toBe('/workspace/xtreams/playlist-1/vod');
|
|
});
|
|
|
|
it('ignores non-restorable routes', () => {
|
|
expect(service.getRestorablePath('/workspace/settings')).toBeNull();
|
|
expect(service.getRestorablePath('/workspace')).toBeNull();
|
|
expect(service.getRestorablePath('/unknown')).toBeNull();
|
|
});
|
|
|
|
it('falls back to the first available view when the stored playlist no longer exists', async () => {
|
|
settingsStore.startupBehavior.set(StartupBehavior.RestoreLastView);
|
|
playlistsService.getAllPlaylists.mockReturnValue(of([]));
|
|
service.persistLastRestorablePath('/workspace/xtreams/missing/live');
|
|
|
|
await expect(service.resolveInitialWorkspacePath()).resolves.toBe(
|
|
'/workspace/dashboard'
|
|
);
|
|
});
|
|
});
|