forked from
tangled.org/core
Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
1import { test, describe, beforeAll } from "bun:test";
2import { writeFileSync, mkdirSync, readFileSync } from "fs";
3import { join } from "path";
4import { h, type VNode } from "preact";
5import { renderCard } from "../lib/render";
6import { RepositoryCard } from "../components/cards/repository";
7import { IssueCard } from "../components/cards/issue";
8import { PullRequestCard } from "../components/cards/pull-request";
9import {
10 repositoryCardSchema,
11 issueCardSchema,
12 pullRequestCardSchema,
13} from "../validation";
14import {
15 createRepoData,
16 createIssueData,
17 createPullRequestData,
18 createLongTitleIssueData,
19 createLongTitlePullRequestData,
20} from "./fixtures";
21
22const outputDir = join(process.cwd(), "output");
23let avatarDataUri: string;
24
25const loadAvatar = (): string => {
26 const avatarPath = join(
27 process.cwd(),
28 "src",
29 "__tests__",
30 "assets",
31 "avatar.jpg",
32 );
33 const avatarBase64 = readFileSync(avatarPath).toString("base64");
34 return `data:image/jpeg;base64,${avatarBase64}`;
35};
36
37beforeAll(() => {
38 mkdirSync(outputDir, { recursive: true });
39 avatarDataUri = loadAvatar();
40});
41
42const savePng = (filename: string, buffer: Uint8Array) => {
43 writeFileSync(join(outputDir, filename), buffer);
44};
45
46const renderAndSave = async <P>(component: VNode<P>, filename: string) => {
47 const { png } = await renderCard(component as VNode);
48 savePng(filename, png);
49};
50
51describe("repository card", () => {
52 test("renders repository card", async () => {
53 const data = createRepoData(avatarDataUri);
54 const validated = repositoryCardSchema.parse(data);
55 await renderAndSave(h(RepositoryCard, validated), "repository-card.png");
56 });
57});
58
59describe("issue cards", () => {
60 test("renders open issue", async () => {
61 const data = createIssueData(avatarDataUri);
62 const validated = issueCardSchema.parse(data);
63 await renderAndSave(h(IssueCard, validated), "issue-card.png");
64 });
65
66 test("renders closed issue", async () => {
67 const data = createIssueData(avatarDataUri, {
68 issueNumber: 5,
69 status: "closed",
70 labels: [{ name: "wontfix", color: "#6a737d" }],
71 reactionCount: 2,
72 });
73 const validated = issueCardSchema.parse(data);
74 await renderAndSave(h(IssueCard, validated), "issue-card-closed.png");
75 });
76
77 test("renders issue with long title", async () => {
78 const data = createLongTitleIssueData(avatarDataUri, {
79 issueNumber: 42,
80 });
81 const validated = issueCardSchema.parse(data);
82 await renderAndSave(h(IssueCard, validated), "issue-card-long-title.png");
83 });
84});
85
86describe("pull request cards", () => {
87 test("renders open pull request", async () => {
88 const data = createPullRequestData(avatarDataUri);
89 const validated = pullRequestCardSchema.parse(data);
90 await renderAndSave(h(PullRequestCard, validated), "pull-request-card.png");
91 });
92
93 test("renders merged pull request", async () => {
94 const data = createPullRequestData(avatarDataUri, {
95 pullRequestNumber: 2,
96 status: "merged",
97 title: "Implement OAuth2 authentication flow",
98 filesChanged: 5,
99 additions: 342,
100 deletions: 28,
101 });
102 const validated = pullRequestCardSchema.parse(data);
103 await renderAndSave(
104 h(PullRequestCard, validated),
105 "pull-request-card-merged.png",
106 );
107 });
108
109 test("renders closed pull request", async () => {
110 const data = createPullRequestData(avatarDataUri, {
111 pullRequestNumber: 3,
112 status: "closed",
113 title: "WIP: Experimental feature",
114 });
115 const validated = pullRequestCardSchema.parse(data);
116 await renderAndSave(
117 h(PullRequestCard, validated),
118 "pull-request-card-closed.png",
119 );
120 });
121
122 test("renders pull request with long title", async () => {
123 const data = createLongTitlePullRequestData(avatarDataUri, {
124 pullRequestNumber: 42,
125 });
126 const validated = pullRequestCardSchema.parse(data);
127 await renderAndSave(
128 h(PullRequestCard, validated),
129 "pull-request-card-long-title.png",
130 );
131 });
132});