#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
@@ -6,6 +6,7 @@ import { vi } from 'vitest';
import { Issues } from './issues';
import { IssueEntity, IssuesStore } from './issues.store';
import { MilestoneEntity, MilestonesStore } from '../milestones/milestones.store';
import { StatusesStore } from '../statuses/statuses.store';
const makeIssue = (overrides: Partial<IssueEntity> = {}): IssueEntity => ({
id: 99,
@@ -104,6 +105,24 @@ const makeMilestone = (overrides: Partial<MilestoneEntity> = {}): MilestoneEntit
...overrides,
});
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));
getById = vi.fn((id: string) =>
id === 'done'
? { id: 'done', label: 'TERMINÉ', bg: '#dcfce7', color: '#166534', order: 3, countsAsCompleted: true }
: undefined,
);
readonly statuses = signal([
{ id: 'done', label: 'TERMINÉ', bg: '#dcfce7', color: '#166534', order: 3, countsAsCompleted: true },
]);
}
class FakeMilestonesStore {
private _data = signal<MilestoneEntity[]>([]);
@@ -141,17 +160,20 @@ describe('Issues', () => {
let fixture: ComponentFixture<Issues>;
let store: FakeIssuesStore;
let milestonesStore: FakeMilestonesStore;
let statusesStore: FakeStatusesStore;
let router: Router;
beforeEach(async () => {
store = new FakeIssuesStore();
milestonesStore = new FakeMilestonesStore();
statusesStore = new FakeStatusesStore();
await TestBed.configureTestingModule({
imports: [Issues],
providers: [
provideRouter([]),
{ provide: IssuesStore, useValue: store },
{ provide: MilestonesStore, useValue: milestonesStore },
{ provide: StatusesStore, useValue: statusesStore },
],
}).compileComponents();
@@ -308,6 +330,15 @@ describe('Issues', () => {
store.upsert(makeIssue({ id: 58, name: 'DepChild', dependsOnIds: [57], status: 'done' }));
expect((component as any).getProgress(epic)).toBe(100);
});
it('counts a custom countsAsCompleted status as done for an Epic', () => {
statusesStore.setCompleted(['done', 'abandoned']);
const epic = makeIssue({ id: 60, type: 'Epic', name: 'Custom Epic', progress: 0 });
store.upsert(epic);
store.upsert(makeIssue({ id: 61, name: 'Done Child', epic: 'Custom Epic', status: 'abandoned' }));
store.upsert(makeIssue({ id: 62, name: 'Todo Child', epic: 'Custom Epic', status: 'todo' }));
expect((component as any).getProgress(epic)).toBe(50);
});
});
describe('getMilestoneForIssue', () => {