test-utils.ts.new•4.46 kB
import {
ResourceStatus,
ResourceType
} from "../domain/resource-types";
import {
Issue,
Milestone,
Project,
Sprint,
CreateIssue,
CreateProject,
CreateMilestone,
CreateSprint,
ProjectView,
CustomField
} from "../domain/types";
export class TestFactory {
static createProject(overrides: Partial<CreateProject> = {}): CreateProject {
return {
title: "Test Project",
shortDescription: "A test project",
owner: "test-owner",
visibility: "private",
views: [],
fields: [],
...overrides
};
}
static createMilestone(overrides: Partial<CreateMilestone> = {}): CreateMilestone {
return {
title: "Test Milestone",
description: "A test milestone",
dueDate: this.futureDate(30),
...overrides
};
}
static createIssue(overrides: Partial<CreateIssue> = {}): CreateIssue {
return {
title: "Test Issue",
description: "A test issue",
assignees: [],
labels: [],
...overrides
};
}
static createSprint(overrides: Partial<CreateSprint> = {}): CreateSprint {
const startDate = new Date();
const endDate = new Date(startDate);
endDate.setDate(endDate.getDate() + 14);
return {
title: "Test Sprint",
description: "A test sprint",
startDate: startDate.toISOString(),
endDate: endDate.toISOString(),
status: ResourceStatus.ACTIVE,
issues: [],
...overrides
};
}
static createProjectView(overrides: Partial<ProjectView> = {}): ProjectView {
return {
id: `view-${Date.now()}`,
name: "Test View",
layout: "board",
...overrides
};
}
static createCustomField(overrides: Partial<CustomField> = {}): CustomField {
return {
id: `field-${Date.now()}`,
name: "Test Field",
type: "text",
options: [],
...overrides
};
}
static completeProject(data: CreateProject = this.createProject()): Project {
return {
id: `proj-${Date.now()}`,
title: data.title,
description: data.shortDescription || "",
owner: data.owner,
number: 1,
url: `https://github.com/${data.owner}/projects/1`,
fields: data.fields || [],
views: data.views || [],
closed: false,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
status: ResourceStatus.ACTIVE,
visibility: data.visibility || "private",
version: 1
};
}
static completeMilestone(data: CreateMilestone = this.createMilestone()): Milestone {
return {
id: `milestone-${Date.now()}`,
number: 1,
title: data.title,
description: data.description,
dueDate: data.dueDate,
status: ResourceStatus.ACTIVE,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
url: `https://github.com/test-owner/test-repo/milestone/1`,
progress: {
percent: 0,
complete: 0,
total: 0
}
};
}
static completeIssue(data: CreateIssue = this.createIssue()): Issue {
return {
id: `issue-${Date.now()}`,
number: 1,
title: data.title,
description: data.description,
status: ResourceStatus.ACTIVE,
assignees: data.assignees || [],
labels: data.labels || [],
milestoneId: data.milestoneId,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
url: `https://github.com/test-owner/test-repo/issues/1`
};
}
static completeSprint(data: CreateSprint = this.createSprint()): Sprint {
return {
id: `sprint-${Date.now()}`,
title: data.title,
description: data.description,
startDate: data.startDate,
endDate: data.endDate,
status: data.status || ResourceStatus.ACTIVE,
issues: data.issues || [],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
};
}
static futureDate(daysFromNow: number): string {
const date = new Date();
date.setDate(date.getDate() + daysFromNow);
return date.toISOString();
}
static pastDate(daysAgo: number): string {
const date = new Date();
date.setDate(date.getDate() - daysAgo);
return date.toISOString();
}
static randomId(): string {
return Math.random().toString(36).substring(2, 15);
}
static mockGitHubResponse<T>(data: T): Promise<{ data: T }> {
return Promise.resolve({ data });
}
}