#62 Ajoute d'une configuration pour les status à considérer comme terminé

Signed-off-by: Gato <cedric@goutailler-olivier.fr>
This commit is contained in:
2026-05-30 14:43:06 +02:00
parent 43b275b064
commit 401da09f8f
21 changed files with 251 additions and 53 deletions
+31
View File
@@ -5,6 +5,7 @@ import { vi } from 'vitest';
import { Dashboard } from './dashboard';
import { IssueEntity, IssuesStore } from '../issues/issues.store';
import { MilestoneEntity, MilestonesStore } from '../milestones/milestones.store';
import { StatusesStore } from '../statuses/statuses.store';
const makeIssue = (overrides: Partial<IssueEntity> = {}): IssueEntity => ({
id: 1,
@@ -43,6 +44,16 @@ class FakeIssuesStore {
deleteById = vi.fn();
}
class FakeStatusesStore {
private completedIds = new Set<string>(['done']);
setCompleted(ids: string[]): void {
this.completedIds = new Set(ids);
}
isCompleted = vi.fn((statusId: string) => this.completedIds.has(statusId));
}
class FakeMilestonesStore {
private _data = signal<MilestoneEntity[]>([]);
readonly milestones = this._data.asReadonly();
@@ -63,11 +74,13 @@ describe('Dashboard', () => {
let fixture: ComponentFixture<Dashboard>;
let issuesStore: FakeIssuesStore;
let milestonesStore: FakeMilestonesStore;
let statusesStore: FakeStatusesStore;
let router: Router;
beforeEach(async () => {
issuesStore = new FakeIssuesStore();
milestonesStore = new FakeMilestonesStore();
statusesStore = new FakeStatusesStore();
await TestBed.configureTestingModule({
imports: [Dashboard],
@@ -75,6 +88,7 @@ describe('Dashboard', () => {
provideRouter([]),
{ provide: IssuesStore, useValue: issuesStore },
{ provide: MilestonesStore, useValue: milestonesStore },
{ provide: StatusesStore, useValue: statusesStore },
],
}).compileComponents();
@@ -123,6 +137,17 @@ describe('Dashboard', () => {
]);
expect((component as any).completionRate()).toBe(50);
});
it('compte un statut personnalisé countsAsCompleted comme terminé', () => {
statusesStore.setCompleted(['done', 'abandoned']);
issuesStore.seed([
makeIssue({ id: 1, status: 'done' }),
makeIssue({ id: 2, status: 'abandoned' }),
makeIssue({ id: 3, status: 'todo' }),
makeIssue({ id: 4, status: 'todo' }),
]);
expect((component as any).completionRate()).toBe(50);
});
});
describe('statusCounts', () => {
@@ -180,6 +205,12 @@ describe('Dashboard', () => {
expect((component as any).highPriorityIssues().length).toBe(0);
});
it('exclut les issues avec un statut personnalisé countsAsCompleted', () => {
statusesStore.setCompleted(['done', 'abandoned']);
issuesStore.seed([makeIssue({ priority: 'TRES_HAUTE', status: 'abandoned' })]);
expect((component as any).highPriorityIssues().length).toBe(0);
});
it('limite à 6 résultats', () => {
issuesStore.seed(
Array.from({ length: 10 }, (_, i) =>