2026-05-18 18:27:41 +00:00
|
|
|
import { test } from "node:test"
|
|
|
|
|
import assert from "node:assert"
|
2026-05-18 18:39:39 +00:00
|
|
|
import lib from "../tailscalectl/lib.js"
|
2026-05-18 20:53:32 +00:00
|
|
|
const { parsePeers, makeExitNodeCommand, errorMessage } = lib
|
2026-05-18 18:27:41 +00:00
|
|
|
|
|
|
|
|
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="])
|
|
|
|
|
})
|
2026-05-18 20:53:32 +00:00
|
|
|
|
|
|
|
|
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")
|
|
|
|
|
})
|