Skip to content

Commit d43507c

Browse files
committed
ci: improve sync-docs-receiver
Signed-off-by: Emilien Escalle <emilien.escalle@escemi.com>
1 parent 80d6dd0 commit d43507c

16 files changed

Lines changed: 4190 additions & 17 deletions

.devcontainer/devcontainer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
"ms-vscode.makefile-tools",
1616
"dbaeumer.vscode-eslint",
1717
"esbenp.prettier-vscode",
18-
"msjsdiag.vscode-react-native",
1918
"digitalbrainstem.javascript-ejs-support",
2019
"unifiedjs.vscode-mdx"
2120
],
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import fs from "fs";
2+
import path from "path";
3+
import { fileURLToPath } from "url";
4+
import {
5+
describe,
6+
it,
7+
expect,
8+
vi,
9+
beforeEach,
10+
afterEach,
11+
afterAll,
12+
} from "vitest";
13+
14+
const __filename = fileURLToPath(import.meta.url);
15+
const __dirname = path.dirname(__filename);
16+
17+
const previousOwner = process.env.GITHUB_REPOSITORY_OWNER;
18+
const previousRepository = process.env.GITHUB_REPOSITORY;
19+
const previousWorkspace = process.env.GITHUB_WORKSPACE;
20+
21+
const workspaceRoot = path.resolve(__dirname, "../../../..");
22+
process.env.GITHUB_REPOSITORY_OWNER = "hoverkraft-tech";
23+
process.env.GITHUB_REPOSITORY = "hoverkraft-tech/public-docs";
24+
process.env.GITHUB_WORKSPACE = workspaceRoot;
25+
26+
const { DocumentationGenerator } = await import(
27+
"../lib/documentation-generator.js"
28+
);
29+
const { PROJECTS_MD_PATH, HOMEPAGE_PATH } = await import("../lib/constants.js");
30+
31+
afterAll(() => {
32+
process.env.GITHUB_REPOSITORY_OWNER = previousOwner;
33+
process.env.GITHUB_REPOSITORY = previousRepository;
34+
process.env.GITHUB_WORKSPACE = previousWorkspace;
35+
});
36+
37+
describe("DocumentationGenerator", () => {
38+
afterEach(() => {
39+
vi.restoreAllMocks();
40+
});
41+
42+
describe("run", () => {
43+
let generator;
44+
let fetchRepositories;
45+
let fetchPinned;
46+
let filterRepositories;
47+
let categorizeRepositories;
48+
let homepageUpdate;
49+
50+
const rawRepositories = [
51+
{ name: "alpha", stargazers_count: 10 },
52+
{ name: "beta", stargazers_count: 7 },
53+
];
54+
55+
const showcaseRepositories = [{ name: "alpha", stargazers_count: 10 }];
56+
57+
const categorized = {
58+
"Core Services": [{ name: "alpha" }],
59+
Other: [],
60+
};
61+
62+
beforeEach(() => {
63+
generator = new DocumentationGenerator({ github: {} });
64+
65+
fetchRepositories = vi.fn().mockResolvedValue(rawRepositories);
66+
fetchPinned = vi.fn().mockResolvedValue(["alpha"]);
67+
generator.repositoryService = {
68+
fetchOrganizationRepositories: fetchRepositories,
69+
fetchOrganizationPinnedRepositories: fetchPinned,
70+
};
71+
72+
filterRepositories = vi.fn().mockReturnValue(showcaseRepositories);
73+
generator.repositoryFilter = { apply: filterRepositories };
74+
75+
categorizeRepositories = vi.fn().mockReturnValue(categorized);
76+
generator.repositoryCategorizer = {
77+
categorize: categorizeRepositories,
78+
};
79+
80+
homepageUpdate = vi.fn().mockResolvedValue();
81+
generator.homepageUpdater = { update: homepageUpdate };
82+
});
83+
84+
it("orchestrates repository generation end-to-end", async () => {
85+
const writeAssets = vi
86+
.spyOn(generator, "writeProjectsAssets")
87+
.mockResolvedValue();
88+
const logSummary = vi
89+
.spyOn(generator, "logSummary")
90+
.mockImplementation(() => {});
91+
const consoleLog = vi.spyOn(console, "log").mockImplementation(() => {});
92+
93+
await generator.run();
94+
95+
expect(fetchRepositories).toHaveBeenCalledWith(
96+
process.env.GITHUB_REPOSITORY_OWNER,
97+
);
98+
expect(filterRepositories).toHaveBeenCalledWith(rawRepositories);
99+
expect(categorizeRepositories).toHaveBeenCalledWith(showcaseRepositories);
100+
101+
expect(writeAssets).toHaveBeenCalledTimes(1);
102+
const callArgs = writeAssets.mock.calls[0][0];
103+
expect(callArgs.categories).toBe(categorized);
104+
expect(callArgs.repositories).toBe(showcaseRepositories);
105+
expect(callArgs.generatedAt).toBeInstanceOf(Date);
106+
107+
expect(fetchPinned).toHaveBeenCalledWith(
108+
process.env.GITHUB_REPOSITORY_OWNER,
109+
);
110+
expect(homepageUpdate).toHaveBeenCalledWith(rawRepositories, ["alpha"]);
111+
112+
expect(logSummary).toHaveBeenCalledWith(categorized);
113+
expect(consoleLog).toHaveBeenCalledWith(
114+
"🚀 Starting documentation generation...",
115+
);
116+
expect(consoleLog).toHaveBeenCalledWith(
117+
"✅ Documentation generation completed!",
118+
);
119+
});
120+
});
121+
122+
describe("writeProjectsAssets", () => {
123+
it("writes generated markdown and logs relative paths", async () => {
124+
const generator = new DocumentationGenerator({ github: {} });
125+
const generatedAt = new Date("2025-01-01T00:00:00.000Z");
126+
const categories = { Other: [] };
127+
const repositories = [];
128+
129+
const buildContent = vi
130+
.spyOn(generator.projectsContentBuilder, "build")
131+
.mockReturnValue("# Projects");
132+
const writeFile = vi.spyOn(fs.promises, "writeFile").mockResolvedValue();
133+
const consoleLog = vi.spyOn(console, "log").mockImplementation(() => {});
134+
135+
await generator.writeProjectsAssets({
136+
categories,
137+
repositories,
138+
generatedAt,
139+
});
140+
141+
expect(buildContent).toHaveBeenCalledWith({
142+
categories,
143+
repositories,
144+
generatedAt,
145+
});
146+
expect(writeFile).toHaveBeenCalledWith(
147+
PROJECTS_MD_PATH,
148+
"# Projects",
149+
"utf8",
150+
);
151+
152+
const projectsRelative = path.relative(
153+
process.env.GITHUB_WORKSPACE,
154+
PROJECTS_MD_PATH,
155+
);
156+
const homepageRelative = path.relative(
157+
process.env.GITHUB_WORKSPACE,
158+
HOMEPAGE_PATH,
159+
);
160+
161+
expect(consoleLog).toHaveBeenNthCalledWith(1, "📄 Generated files:");
162+
expect(consoleLog).toHaveBeenNthCalledWith(2, ` - ${projectsRelative}`);
163+
expect(consoleLog).toHaveBeenNthCalledWith(3, ` - ${homepageRelative}`);
164+
});
165+
});
166+
});

.github/actions/generate-docs/lib/templates/projects.md.ejs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ including <%= stats.languagesSummary %>, and more.
3333
tags={[<% repository.topics.forEach((topic, index) => { %>"<%= topic %>"<%= index < repository.topics.length - 1 ? ', ' : '' %><% }) %>]}
3434
actions={[
3535
{ label: "View on GitHub", href: "<%= repository.htmlUrl %>" }<% if (repository.homepage) { %>,
36-
{ label: "Live Demo", href: "<%= repository.homepage %>" }<% } %>
36+
{ label: "Documentation", href: "<%= repository.homepage %>" }<% } %>
3737
]}
3838
/>
3939
<% }) %>

0 commit comments

Comments
 (0)