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, }); });});
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,
});
});
});