A Docker-like CLI and HTTP API for managing headless VMs
1import { assertEquals } from "@std/assert";
2import { Effect, pipe } from "effect";
3import {
4 ALMA_LINUX_IMG_URL,
5 ALPINE_ISO_URL,
6 DEBIAN_CLOUD_IMG_URL,
7 DEBIAN_ISO_URL,
8 FEDORA_COREOS_IMG_URL,
9 GENTOO_IMG_URL,
10 NIXOS_ISO_URL,
11 ROCKY_LINUX_IMG_URL,
12 UBUNTU_CLOUD_IMG_URL,
13 UBUNTU_ISO_URL,
14} from "./constants.ts";
15import {
16 constructAlmaLinuxImageURL,
17 constructAlpineImageURL,
18 constructCoreOSImageURL,
19 constructDebianImageURL,
20 constructGentooImageURL,
21 constructNixOSImageURL,
22 constructRockyLinuxImageURL,
23 constructUbuntuImageURL,
24} from "./utils.ts";
25
26Deno.test("Test Default Fedora CoreOS Image URL", () => {
27 const url = Effect.runSync(
28 pipe(
29 constructCoreOSImageURL("fedora-coreos"),
30 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
31 ),
32 );
33
34 assertEquals(url, FEDORA_COREOS_IMG_URL);
35});
36
37Deno.test("Test Default Fedora CoreOS Image URL", () => {
38 const url = Effect.runSync(
39 pipe(
40 constructCoreOSImageURL("coreos"),
41 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
42 ),
43 );
44
45 assertEquals(url, FEDORA_COREOS_IMG_URL);
46});
47
48Deno.test("Test Specific Fedora CoreOS Version", () => {
49 const url = Effect.runSync(
50 pipe(
51 constructCoreOSImageURL("fedora-coreos-43.20251024.2.0"),
52 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
53 ),
54 );
55
56 assertEquals(
57 url,
58 "https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/43.20251024.2.0/" +
59 `${Deno.build.arch}/fedora-coreos-43.20251024.2.0-qemu.${Deno.build.arch}.qcow2.xz`,
60 );
61});
62
63Deno.test("Test invalid Fedora CoreOS Image Name", () => {
64 const url = Effect.runSync(
65 pipe(
66 constructCoreOSImageURL("fedora-coreos-latest"),
67 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
68 ),
69 );
70
71 assertEquals(url, null);
72});
73
74Deno.test("Test Default NixOS Image URL", () => {
75 const url = Effect.runSync(
76 pipe(
77 constructNixOSImageURL("nixos"),
78 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
79 ),
80 );
81
82 assertEquals(url, NIXOS_ISO_URL);
83});
84
85Deno.test("Test Specific NixOS Version", () => {
86 const url = Effect.runSync(
87 pipe(
88 constructNixOSImageURL("nixos-24.05"),
89 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
90 ),
91 );
92
93 assertEquals(
94 url,
95 `https://channels.nixos.org/nixos-24.05/latest-nixos-minimal-${Deno.build.arch}-linux.iso`,
96 );
97});
98
99Deno.test("Test invalid NixOS Image Name", () => {
100 const url = Effect.runSync(
101 pipe(
102 constructNixOSImageURL("nixos-latest"),
103 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
104 ),
105 );
106
107 assertEquals(url, null);
108});
109
110Deno.test("Test valid Gentoo Image Name", () => {
111 const url = Effect.runSync(
112 pipe(
113 constructGentooImageURL("gentoo-20251116T161545Z"),
114 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
115 ),
116 );
117
118 const arch = Deno.build.arch === "aarch64" ? "arm64" : "amd64";
119 assertEquals(
120 url,
121 `https://distfiles.gentoo.org/releases/${arch}/autobuilds/20251116T161545Z/di-${arch}-console-20251116T161545Z.qcow2`,
122 );
123});
124
125Deno.test("Test valid Gentoo Image Name", () => {
126 const url = Effect.runSync(
127 pipe(
128 constructGentooImageURL("gentoo"),
129 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
130 ),
131 );
132
133 assertEquals(url, GENTOO_IMG_URL);
134});
135
136Deno.test("Test invalid Gentoo Image Name", () => {
137 const url = Effect.runSync(
138 pipe(
139 constructGentooImageURL("gentoo-latest"),
140 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
141 ),
142 );
143
144 assertEquals(url, null);
145});
146
147Deno.test("Test valid Debian Image Name", () => {
148 const url = Effect.runSync(
149 pipe(
150 constructDebianImageURL("debian-13.2.0"),
151 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
152 ),
153 );
154
155 const arch = Deno.build.arch === "aarch64" ? "arm64" : "amd64";
156 assertEquals(
157 url,
158 `https://cdimage.debian.org/debian-cd/current/${arch}/iso-cd/debian-13.2.0-${arch}-netinst.iso`,
159 );
160});
161
162Deno.test("Test valid Debian Image Name", () => {
163 const url = Effect.runSync(
164 pipe(
165 constructDebianImageURL("debian"),
166 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
167 ),
168 );
169
170 assertEquals(url, DEBIAN_ISO_URL);
171});
172
173Deno.test("Test valid Debian Image Name (Cloud)", () => {
174 const url = Effect.runSync(
175 pipe(
176 constructDebianImageURL("debian", true),
177 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
178 ),
179 );
180
181 assertEquals(url, DEBIAN_CLOUD_IMG_URL);
182});
183
184Deno.test("Test invalid Debian Image Name", () => {
185 const url = Effect.runSync(
186 pipe(
187 constructDebianImageURL("debian-latest"),
188 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
189 ),
190 );
191
192 assertEquals(url, null);
193});
194
195Deno.test("Test valid Alpine Image Name", () => {
196 const url = Effect.runSync(
197 pipe(
198 constructAlpineImageURL("alpine-3.22.2"),
199 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
200 ),
201 );
202
203 assertEquals(
204 url,
205 `https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/cloud/generic_alpine-3.22.2-${Deno.build.arch}-uefi-tiny-r0.qcow2`,
206 );
207});
208
209Deno.test("Test valid Alpine Image Name", () => {
210 const url = Effect.runSync(
211 pipe(
212 constructAlpineImageURL("alpine"),
213 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
214 ),
215 );
216
217 assertEquals(url, ALPINE_ISO_URL);
218});
219
220Deno.test("Test invalid Alpine Image Name", () => {
221 const url = Effect.runSync(
222 pipe(
223 constructAlpineImageURL("alpine-latest"),
224 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
225 ),
226 );
227
228 assertEquals(url, null);
229});
230
231// ubuntu
232Deno.test("Test valid Ubuntu Image Name", () => {
233 const url = Effect.runSync(
234 pipe(
235 constructUbuntuImageURL("ubuntu"),
236 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
237 ),
238 );
239
240 assertEquals(url, UBUNTU_ISO_URL);
241});
242
243Deno.test("Test valid Ubuntu Image Name (Cloud)", () => {
244 const url = Effect.runSync(
245 pipe(
246 constructUbuntuImageURL("ubuntu", true),
247 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
248 ),
249 );
250
251 assertEquals(url, UBUNTU_CLOUD_IMG_URL);
252});
253
254Deno.test("Test valid AlmaLinux Image Name", () => {
255 const url = Effect.runSync(
256 pipe(
257 constructAlmaLinuxImageURL("almalinux"),
258 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
259 ),
260 );
261
262 assertEquals(url, ALMA_LINUX_IMG_URL);
263});
264
265Deno.test("Test valid RockyLinux Image Name", () => {
266 const url = Effect.runSync(
267 pipe(
268 constructRockyLinuxImageURL("rockylinux"),
269 Effect.catchAll((_error) => Effect.succeed(null as string | null)),
270 ),
271 );
272
273 assertEquals(url, ROCKY_LINUX_IMG_URL);
274});