Files
arthur-os/test/shell.d/tailscale-test.sh
T

125 lines
4.1 KiB
Bash

#!/bin/bash
set -euo pipefail
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
run_node_test <<'JS'
const tailscale = requireFromRoot('shell/plugins/panels/tailscale/Model.js')
assertDeepEqual(
tailscale.filterIPv4(['100.64.0.1', 'fd7a:115c:a1e0::1', '192.168.1.2']),
['100.64.0.1'],
'tailscale keeps only Tailscale IPv4 addresses'
)
assertDeepEqual(
tailscale.filterIPv6(['100.64.0.1', 'fd7a:115c:a1e0::1', 'fe80::1']),
['fd7a:115c:a1e0::1'],
'tailscale keeps only Tailscale IPv6 addresses'
)
assertEqual(tailscale.cleanDnsName('work.tailnet.ts.net.'), 'work.tailnet.ts.net', 'tailscale strips trailing DNS dot')
assertEqual(tailscale.displayHostName('localhost', 'work.tailnet.ts.net.'), 'work', 'tailscale falls back from localhost to short DNS name')
const status = tailscale.parseStatus(JSON.stringify({
BackendState: 'Running',
AuthURL: '',
TailscaleIPs: ['100.74.97.73', 'fd7a:115c:a1e0::ff32:6149'],
Self: {
HostName: 'dhh-fd',
DNSName: 'dhh-fd.tail32f559.ts.net.',
TailscaleIPs: ['100.74.97.73']
},
Peer: {
onlineB: {
HostName: 'zed',
DNSName: 'zed.tail32f559.ts.net.',
TailscaleIPs: ['100.1.1.2'],
Online: true,
OS: 'linux',
ExitNodeOption: true,
ExitNode: true
},
offline: {
HostName: 'offline',
DNSName: 'offline.tail32f559.ts.net.',
TailscaleIPs: ['100.1.1.3'],
Online: false,
OS: 'linux'
},
offlineExit: {
HostName: 'mbu-ser9',
DNSName: 'mbu-ser9.tail32f559.ts.net.',
TailscaleIPs: ['100.125.28.77', 'fd7a:115c:a1e0::1037:1c4d'],
Online: false,
OS: 'linux',
ExitNodeOption: true,
ExitNode: false
},
onlineA: {
HostName: 'alpha',
DNSName: 'alpha.tail32f559.ts.net.',
TailscaleIPs: ['100.1.1.1', 'fd7a:115c:a1e0::1901:334b'],
Online: true,
OS: 'macos'
}
}
}))
assert(status.ok && status.running, 'tailscale parses running status')
assertEqual(status.selfIp, '100.74.97.73', 'tailscale parses self IP')
assertDeepEqual(status.peers.map(peer => peer.HostName), ['alpha', 'zed'], 'tailscale filters offline peers and sorts online peers')
assertDeepEqual(status.peers[0].TailscaleIPv6, ['fd7a:115c:a1e0::1901:334b'], 'tailscale preserves peer IPv6 addresses for copy menu')
assert(status.peers[1].ExitNodeOption && status.peers[1].ExitNode, 'tailscale preserves exit node flags')
assertDeepEqual(status.exitNodes.map(peer => peer.HostName), ['zed'], 'tailscale lists only online exit nodes')
const stopped = tailscale.parseStatus(JSON.stringify({
BackendState: 'Stopped',
Peer: {
online: {
HostName: 'alpha',
DNSName: 'alpha.tail32f559.ts.net.',
TailscaleIPs: ['100.1.1.1'],
Online: true,
OS: 'macos'
}
}
}))
assert(stopped.ok && !stopped.running, 'tailscale parses stopped status')
const accounts = tailscale.parseAccounts(JSON.stringify([
{
id: 'db1b',
nickname: 'Home',
tailnet: 'dhh.github',
account: 'dhh@github',
selected: true
},
{
id: '1785',
nickname: 'Work',
tailnet: '37signals.com',
account: 'david@37signals.com',
selected: false
}
]))
assertEqual(accounts.accounts.length, 2, 'tailscale parses multiple connections')
assertEqual(accounts.selectedAccountId, 'db1b', 'tailscale records selected connection id')
assertEqual(accounts.selectedAccountLabel, 'Home', 'tailscale labels connections by nickname')
assertDeepEqual(
accounts.accounts.map(account => account.nickname),
['Home', 'Work'],
'tailscale preserves connection nicknames'
)
assertEqual(
tailscale.accountLabel({ nickname: '', tailnet: 'tailnet.example', account: 'user@example', id: 'abcd' }),
'tailnet.example',
'tailscale labels connections by tailnet when nickname is missing'
)
assertDeepEqual(tailscale.parseStatus('{'), { ok: false, unavailable: true, message: 'Status error', error: 'Failed to parse tailscale status' }, 'tailscale reports invalid status JSON')
assertDeepEqual(tailscale.parseAccounts('{'), { accounts: [], selectedAccountId: '', selectedAccountLabel: '' }, 'tailscale handles invalid account JSON')
JS