Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/tests/unit/tools/tinytex.test.ts
12925 views
1
/*
2
* tinytex.test.ts
3
*
4
* Copyright (C) 2026 Posit Software, PBC
5
*/
6
7
import { unitTest } from "../../test.ts";
8
import { assert, assertEquals } from "testing/asserts";
9
import { tinyTexPkgName } from "../../../src/tools/impl/tinytex.ts";
10
import { getLatestRelease } from "../../../src/tools/github.ts";
11
import { GitHubRelease } from "../../../src/tools/types.ts";
12
13
// ---- Pure logic tests for tinyTexPkgName ----
14
15
unitTest("tinyTexPkgName - Linux aarch64 with version", async () => {
16
assertEquals(
17
tinyTexPkgName("TinyTeX", "v2026.04", { os: "linux", arch: "aarch64" }),
18
[
19
"TinyTeX-linux-arm64-v2026.04.tar.xz",
20
"TinyTeX-arm64-v2026.04.tar.gz",
21
],
22
);
23
});
24
25
unitTest("tinyTexPkgName - Linux x86_64 with version", async () => {
26
assertEquals(
27
tinyTexPkgName("TinyTeX", "v2026.04", { os: "linux", arch: "x86_64" }),
28
[
29
"TinyTeX-linux-x86_64-v2026.04.tar.xz",
30
"TinyTeX-v2026.04.tar.gz",
31
],
32
);
33
});
34
35
unitTest("tinyTexPkgName - macOS with version", async () => {
36
assertEquals(
37
tinyTexPkgName("TinyTeX", "v2026.04", { os: "darwin", arch: "aarch64" }),
38
[
39
"TinyTeX-darwin-v2026.04.tar.xz",
40
"TinyTeX-v2026.04.tgz",
41
],
42
);
43
});
44
45
unitTest("tinyTexPkgName - Windows with version", async () => {
46
assertEquals(
47
tinyTexPkgName("TinyTeX", "v2026.04", { os: "windows", arch: "x86_64" }),
48
[
49
"TinyTeX-windows-v2026.04.exe",
50
"TinyTeX-v2026.04.zip",
51
],
52
);
53
});
54
55
unitTest("tinyTexPkgName - versionless Linux aarch64", async () => {
56
assertEquals(
57
tinyTexPkgName("TinyTeX", undefined, { os: "linux", arch: "aarch64" }),
58
["TinyTeX.tar.gz"],
59
);
60
});
61
62
unitTest("tinyTexPkgName - TinyTeX-1 ARM64 Linux", async () => {
63
assertEquals(
64
tinyTexPkgName("TinyTeX-1", "v2026.04", {
65
os: "linux",
66
arch: "aarch64",
67
}),
68
[
69
"TinyTeX-1-linux-arm64-v2026.04.tar.xz",
70
"TinyTeX-1-arm64-v2026.04.tar.gz",
71
],
72
);
73
});
74
75
unitTest("tinyTexPkgName - default base", async () => {
76
assertEquals(
77
tinyTexPkgName(undefined, "v2026.04", { os: "linux", arch: "x86_64" }),
78
[
79
"TinyTeX-linux-x86_64-v2026.04.tar.xz",
80
"TinyTeX-v2026.04.tar.gz",
81
],
82
);
83
});
84
85
// ---- Asset-existence tests (network, verify against latest release) ----
86
87
const kTinyTexRepo = "rstudio/tinytex-releases";
88
89
let cachedRelease: GitHubRelease | undefined;
90
async function getRelease() {
91
if (!cachedRelease) {
92
cachedRelease = await getLatestRelease(kTinyTexRepo);
93
}
94
return cachedRelease;
95
}
96
97
function assertAssetExists(
98
candidates: string[],
99
assetNames: string[],
100
label: string,
101
) {
102
const found = candidates.some((c) => assetNames.includes(c));
103
assert(
104
found,
105
`No matching asset for ${label}. Candidates: ${candidates.join(", ")}. ` +
106
`Available TinyTeX assets: ${assetNames.filter((a) => a.startsWith("TinyTeX")).join(", ")}`,
107
);
108
}
109
110
unitTest(
111
"tinyTexPkgName - Linux x86_64 candidates match latest release",
112
async () => {
113
const release = await getRelease();
114
const assetNames = release.assets.map((a) => a.name);
115
const candidates = tinyTexPkgName("TinyTeX", release.tag_name, {
116
os: "linux",
117
arch: "x86_64",
118
});
119
assertAssetExists(candidates, assetNames, "Linux x86_64");
120
},
121
);
122
123
unitTest(
124
"tinyTexPkgName - Linux aarch64 candidates match latest release",
125
async () => {
126
const release = await getRelease();
127
const assetNames = release.assets.map((a) => a.name);
128
const candidates = tinyTexPkgName("TinyTeX", release.tag_name, {
129
os: "linux",
130
arch: "aarch64",
131
});
132
assertAssetExists(candidates, assetNames, "Linux aarch64");
133
},
134
);
135
136
unitTest(
137
"tinyTexPkgName - macOS candidates match latest release",
138
async () => {
139
const release = await getRelease();
140
const assetNames = release.assets.map((a) => a.name);
141
const candidates = tinyTexPkgName("TinyTeX", release.tag_name, {
142
os: "darwin",
143
arch: "aarch64",
144
});
145
assertAssetExists(candidates, assetNames, "macOS");
146
},
147
);
148
149
unitTest(
150
"tinyTexPkgName - Windows candidates match latest release",
151
async () => {
152
const release = await getRelease();
153
const assetNames = release.assets.map((a) => a.name);
154
const candidates = tinyTexPkgName("TinyTeX", release.tag_name, {
155
os: "windows",
156
arch: "x86_64",
157
});
158
assertAssetExists(candidates, assetNames, "Windows");
159
},
160
);
161
162