feat: dashboard

This commit is contained in:
2026-06-05 01:25:16 +02:00
parent 147858de2f
commit 2f6c52e73c
73 changed files with 3490 additions and 1061 deletions

View File

@@ -0,0 +1,89 @@
import '@angular/compiler';
import {
describe,
it,
expect,
vi
} from 'vitest';
import {
Injector,
runInInjectionContext,
signal
} from '@angular/core';
import { Store } from '@ngrx/store';
import { FindPeopleComponent } from './find-people.component';
import { ViewportService } from '../../../../core/platform';
import { selectAllUsers } from '../../../../store/users/users.selectors';
import { selectSavedRooms } from '../../../../store/rooms/rooms.selectors';
import type { User, Room } from '../../../../shared-kernel';
interface HarnessOptions {
users?: User[];
saved?: Room[];
isMobile?: boolean;
}
function createHarness(options: HarnessOptions = {}) {
const usersSig = signal<User[]>(options.users ?? []);
const savedSig = signal<Room[]>(options.saved ?? []);
const store = {
selectSignal: (selector: unknown) => {
if (selector === selectAllUsers) {
return usersSig;
}
if (selector === selectSavedRooms) {
return savedSig;
}
return signal(null);
},
dispatch: vi.fn()
} as unknown as Store;
const injector = Injector.create({
providers: [
FindPeopleComponent,
{ provide: Store, useValue: store },
{ provide: ViewportService, useValue: { isMobile: signal(options.isMobile ?? false) } }
]
});
const component = runInInjectionContext(injector, () => injector.get(FindPeopleComponent));
return { component };
}
describe('FindPeopleComponent', () => {
it('exposes the mobile viewport flag', () => {
expect(createHarness().component.isMobile()).toBe(false);
expect(createHarness({ isMobile: true }).component.isMobile()).toBe(true);
});
it('has no discoverable people for a brand-new account', () => {
const { component } = createHarness();
expect(component.hasDiscoverablePeople()).toBe(false);
});
it('reports discoverable people when users are known', () => {
const { component } = createHarness({ users: [{ id: 'u1' } as unknown as User] });
expect(component.hasDiscoverablePeople()).toBe(true);
});
it('reports discoverable people from saved-room members', () => {
const { component } = createHarness({
saved: [{ id: 'r1', members: [{ id: 'm1' }] } as unknown as Room]
});
expect(component.hasDiscoverablePeople()).toBe(true);
});
it('updates the search query', () => {
const { component } = createHarness();
component.onSearchChange('alice');
expect(component.searchQuery()).toBe('alice');
});
});