import { test } from "node:test" import assert from "node:assert" import lib from "../tailscalectl/lib.js" const { parsePeers, makeExitNodeCommand, findActiveExitNode, errorMessage } = lib test("parsePeers extracts exitNode from ExitNodeOption", () => { const peerMap = { "peer-1": { HostName: "router", TailscaleIPs: ["100.64.0.1"], Online: true, ExitNodeOption: true }, "peer-2": { HostName: "laptop", TailscaleIPs: ["100.64.0.2"], Online: true, ExitNodeOption: false } } const peers = parsePeers(peerMap) assert.strictEqual(peers[0].exitNode, true) assert.strictEqual(peers[1].exitNode, false) }) test("makeExitNodeCommand returns tailscale set command for hostname", () => { const cmd = makeExitNodeCommand("router") assert.deepStrictEqual(cmd, ["tailscale", "set", "--exit-node=router"]) }) test("makeExitNodeCommand with empty string clears exit node", () => { const cmd = makeExitNodeCommand("") assert.deepStrictEqual(cmd, ["tailscale", "set", "--exit-node="]) }) test("findActiveExitNode returns hostname of peer with ExitNode=true", () => { const peerMap = { "peer-1": { HostName: "gluetun-sjc", ExitNode: true, ExitNodeOption: true }, "peer-2": { HostName: "gluetun-den", ExitNode: false, ExitNodeOption: true } } assert.strictEqual(findActiveExitNode(peerMap), "gluetun-sjc") }) test("findActiveExitNode returns empty string when no exit node", () => { const peerMap = { "peer-1": { HostName: "laptop", ExitNode: false, ExitNodeOption: false } } assert.strictEqual(findActiveExitNode(peerMap), "") }) test("errorMessage returns user-friendly message for tailscale up failure", () => { const msg = errorMessage("up", 1) assert.strictEqual(msg, "Failed to connect to Tailscale") }) test("errorMessage returns user-friendly message for tailscale down failure", () => { const msg = errorMessage("down", 1) assert.strictEqual(msg, "Failed to disconnect from Tailscale") }) test("errorMessage returns user-friendly message for tailscale set failure", () => { const msg = errorMessage("set", 1) assert.strictEqual(msg, "Failed to set exit node") }) test("errorMessage returns user-friendly message for tailscale status failure", () => { const msg = errorMessage("status", 1) assert.strictEqual(msg, "Failed to read Tailscale status") }) test("errorMessage returns generic message for unknown command", () => { const msg = errorMessage("unknown", 1) assert.strictEqual(msg, "Tailscale command failed") })