A Docker-like CLI and HTTP API for managing headless VMs
at main 274 lines 6.9 kB view raw
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});