import { describe, it, expect } from "vitest"; import { parseCliArgs } from "./args"; describe("parseCliArgs", () => { it("defaults to run with no args", () => { expect(parseCliArgs([])).toEqual({ kind: "run" }); }); it("parses version and help flags", () => { expect(parseCliArgs(["--version"])).toEqual({ kind: "version" }); expect(parseCliArgs(["-v"])).toEqual({ kind: "version" }); expect(parseCliArgs(["--help"])).toEqual({ kind: "help" }); expect(parseCliArgs(["-h"])).toEqual({ kind: "help" }); }); it("launches a magnet", () => { expect(parseCliArgs(["magnet:?xt=urn:btih:abc"])).toEqual({ kind: "run", initialMagnet: "magnet:?xt=urn:btih:abc", }); }); it("launches a .torrent file", () => { expect(parseCliArgs(["./Foo.torrent"])).toEqual({ kind: "run", initialTorrent: "./Foo.torrent", }); }); it("launches a bare infohash as a magnet (DHT)", () => { const hash = "abcdef0123456789abcdef0123456789abcdef01"; expect(parseCliArgs([hash])).toEqual({ kind: "run", initialMagnet: hash }); }); it("rejects unknown arguments", () => { expect(parseCliArgs(["--nope"])).toEqual({ kind: "invalid", arg: "--nope" }); }); it("rejects a non-hash bareword", () => { expect(parseCliArgs(["hello"])).toEqual({ kind: "invalid", arg: "hello" }); }); it("parses attach", () => { expect(parseCliArgs(["attach"])).toEqual({ kind: "attach" }); }); it("parses update, with and without --force", () => { expect(parseCliArgs(["update"])).toEqual({ kind: "update", force: false }); expect(parseCliArgs(["update", "--force"])).toEqual({ kind: "update", force: true }); }); it("parses watch with a directory", () => { expect(parseCliArgs(["watch", "/srv/blackhole"])).toEqual({ kind: "watch", dir: "/srv/blackhole", downloadDir: undefined, seedTimeMs: undefined, deleteFiles: false, daemon: false, }); }); it("parses watch with a --to download dir", () => { expect(parseCliArgs(["watch", "/srv/blackhole", "--to", "/mnt/media"])).toEqual({ kind: "watch", dir: "/srv/blackhole", downloadDir: "/mnt/media", seedTimeMs: undefined, deleteFiles: false, daemon: false, }); expect(parseCliArgs(["watch", "--dir", "/mnt/media", "/srv/blackhole"])).toEqual({ kind: "watch", dir: "/srv/blackhole", downloadDir: "/mnt/media", seedTimeMs: undefined, deleteFiles: false, daemon: false, }); }); it("parses watch --seed-time, --delete-files, and --daemon", () => { expect( parseCliArgs(["watch", "/srv/bh", "--seed-time", "1h", "--delete-files", "--daemon"]), ).toEqual({ kind: "watch", dir: "/srv/bh", downloadDir: undefined, seedTimeMs: 3_600_000, deleteFiles: true, daemon: true, }); }); it("ignores an unparseable --seed-time", () => { expect(parseCliArgs(["watch", "/srv/bh", "--seed-time", "soon"])).toEqual({ kind: "watch", dir: "/srv/bh", downloadDir: undefined, seedTimeMs: undefined, deleteFiles: false, daemon: false, }); }); it("rejects watch with no directory", () => { expect(parseCliArgs(["watch"])).toEqual({ kind: "invalid", arg: "watch (missing directory)", }); }); it("parses serve with defaults", () => { expect(parseCliArgs(["serve"])).toEqual({ kind: "serve", port: undefined, host: undefined, token: undefined, downloadDir: undefined, seedTimeMs: undefined, deleteFiles: false, daemon: false, }); }); it("parses serve flags", () => { expect( parseCliArgs([ "serve", "--port", "9999", "--host", "0.0.0.0", "--token", "s3cret", "--to", "/mnt/media", "--seed-time", "30m", ]), ).toEqual({ kind: "serve", port: 9999, host: "0.0.0.0", token: "s3cret", downloadDir: "/mnt/media", seedTimeMs: 1_800_000, deleteFiles: false, daemon: false, }); }); it("ignores a bad --port", () => { expect(parseCliArgs(["serve", "--port", "abc"]).kind).toBe("serve"); expect((parseCliArgs(["serve", "--port", "abc"]) as { port?: number }).port).toBeUndefined(); }); it("parses files with defaults", () => { expect(parseCliArgs(["files"])).toEqual({ kind: "files", port: undefined, host: undefined, token: undefined, dir: undefined, daemon: false, }); }); it("parses files flags", () => { expect( parseCliArgs([ "files", "--port", "9160", "--host", "0.0.0.0", "--token", "s3cret", "--dir", "/mnt/media", "--daemon", ]), ).toEqual({ kind: "files", port: 9160, host: "0.0.0.0", token: "s3cret", dir: "/mnt/media", daemon: true, }); }); });