418 lines
14 KiB
Nim
418 lines
14 KiB
Nim
## tests/test_nippels_cli.nim
|
|
## Comprehensive tests for Nippels CLI commands
|
|
|
|
import std/[unittest, os, strformat, options, tables]
|
|
import ../src/nimpak/[nippels, nippels_cli, nippel_types, profile_manager]
|
|
|
|
# Test setup
|
|
const testRoot = "/tmp/nippels_cli_test"
|
|
|
|
proc setupTest(): NippelManager =
|
|
if dirExists(testRoot):
|
|
removeDir(testRoot)
|
|
createDir(testRoot)
|
|
result = newNippelManager(testRoot)
|
|
|
|
proc teardownTest() =
|
|
if dirExists(testRoot):
|
|
removeDir(testRoot)
|
|
|
|
suite "Nippels CLI Commands":
|
|
|
|
setup:
|
|
var manager {.used.} = setupTest()
|
|
|
|
teardown:
|
|
teardownTest()
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell create
|
|
# ==========================================================================
|
|
|
|
test "cmdCellCreate - basic creation":
|
|
let opts = CreateOptions(
|
|
name: "test-cell",
|
|
profile: SecurityProfile.Homestation,
|
|
isolation: IsolationLevel.Standard,
|
|
overrides: ProfileOverrides(),
|
|
description: "Test cell"
|
|
)
|
|
|
|
let exitCode = cmdCellCreate(manager, opts)
|
|
check exitCode == 0
|
|
|
|
let nippel = manager.getNippel("test-cell")
|
|
check nippel.isSome
|
|
check nippel.get.name == "test-cell"
|
|
check nippel.get.profile == SecurityProfile.Homestation
|
|
|
|
test "cmdCellCreate - with custom profile":
|
|
let opts = CreateOptions(
|
|
name: "workstation-cell",
|
|
profile: SecurityProfile.Workstation,
|
|
isolation: IsolationLevel.Strict,
|
|
overrides: ProfileOverrides(),
|
|
description: "Workstation test"
|
|
)
|
|
|
|
let exitCode = cmdCellCreate(manager, opts)
|
|
check exitCode == 0
|
|
|
|
let nippel = manager.getNippel("workstation-cell")
|
|
check nippel.isSome
|
|
check nippel.get.profile == SecurityProfile.Workstation
|
|
check nippel.get.isolationLevel == IsolationLevel.Strict
|
|
|
|
test "cmdCellCreate - with profile overrides":
|
|
var overrides = ProfileOverrides()
|
|
overrides.isolationLevel = some(IsolationLevel.None)
|
|
overrides.networkAccess = some(NetworkAccessLevel.NoNetwork)
|
|
|
|
let opts = CreateOptions(
|
|
name: "custom-cell",
|
|
profile: SecurityProfile.Homestation,
|
|
isolation: IsolationLevel.Standard,
|
|
overrides: overrides,
|
|
description: "Custom overrides"
|
|
)
|
|
|
|
let exitCode = cmdCellCreate(manager, opts)
|
|
check exitCode == 0
|
|
|
|
let nippel = manager.getNippel("custom-cell")
|
|
check nippel.isSome
|
|
check nippel.get.isolationLevel == IsolationLevel.None
|
|
check nippel.get.profileSettings.networkAccess == NetworkAccessLevel.NoNetwork
|
|
|
|
test "cmdCellCreate - duplicate name fails":
|
|
let opts1 = CreateOptions(
|
|
name: "duplicate",
|
|
profile: SecurityProfile.Homestation,
|
|
isolation: IsolationLevel.Standard,
|
|
overrides: ProfileOverrides(),
|
|
description: "First"
|
|
)
|
|
|
|
check cmdCellCreate(manager, opts1) == 0
|
|
|
|
let opts2 = CreateOptions(
|
|
name: "duplicate",
|
|
profile: SecurityProfile.Homestation,
|
|
isolation: IsolationLevel.Standard,
|
|
overrides: ProfileOverrides(),
|
|
description: "Second"
|
|
)
|
|
|
|
check cmdCellCreate(manager, opts2) != 0
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell list
|
|
# ==========================================================================
|
|
|
|
test "cmdCellList - empty list":
|
|
let exitCode = cmdCellList(manager, verbose = false)
|
|
check exitCode == 0
|
|
|
|
test "cmdCellList - with cells":
|
|
# Create some cells
|
|
discard manager.createNippel("cell1", SecurityProfile.Homestation, ProfileOverrides())
|
|
discard manager.createNippel("cell2", SecurityProfile.Workstation, ProfileOverrides())
|
|
discard manager.createNippel("cell3", SecurityProfile.Server, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellList(manager, verbose = false)
|
|
check exitCode == 0
|
|
|
|
let nippels = manager.listNippels()
|
|
check nippels.len == 3
|
|
|
|
test "cmdCellList - verbose mode":
|
|
discard manager.createNippel("verbose-cell", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellList(manager, verbose = true)
|
|
check exitCode == 0
|
|
|
|
test "cmdCellList - shows active status":
|
|
discard manager.createNippel("active-cell", SecurityProfile.Homestation, ProfileOverrides())
|
|
discard manager.activateNippel("active-cell")
|
|
|
|
let exitCode = cmdCellList(manager, verbose = false)
|
|
check exitCode == 0
|
|
check manager.isNippelActive("active-cell")
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell activate/deactivate
|
|
# ==========================================================================
|
|
|
|
test "cmdCellActivate - successful activation":
|
|
discard manager.createNippel("activate-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellActivate(manager, "activate-test")
|
|
check exitCode == 0
|
|
check manager.isNippelActive("activate-test")
|
|
|
|
test "cmdCellActivate - nonexistent cell fails":
|
|
let exitCode = cmdCellActivate(manager, "nonexistent")
|
|
check exitCode != 0
|
|
|
|
test "cmdCellDeactivate - successful deactivation":
|
|
discard manager.createNippel("deactivate-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
discard manager.activateNippel("deactivate-test")
|
|
|
|
check manager.isNippelActive("deactivate-test")
|
|
|
|
let exitCode = cmdCellDeactivate(manager, "deactivate-test")
|
|
check exitCode == 0
|
|
check not manager.isNippelActive("deactivate-test")
|
|
|
|
test "cmdCellDeactivate - nonexistent cell fails":
|
|
let exitCode = cmdCellDeactivate(manager, "nonexistent")
|
|
check exitCode != 0
|
|
|
|
test "cmdCellDeactivate - inactive cell fails":
|
|
discard manager.createNippel("inactive-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellDeactivate(manager, "inactive-test")
|
|
check exitCode != 0
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell profile list
|
|
# ==========================================================================
|
|
|
|
test "cmdCellProfileList - shows all profiles":
|
|
let exitCode = cmdCellProfileList()
|
|
check exitCode == 0
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell profile show
|
|
# ==========================================================================
|
|
|
|
test "cmdCellProfileShow - shows profile settings":
|
|
discard manager.createNippel("profile-show-test", SecurityProfile.Workstation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellProfileShow(manager, "profile-show-test")
|
|
check exitCode == 0
|
|
|
|
test "cmdCellProfileShow - nonexistent cell fails":
|
|
let exitCode = cmdCellProfileShow(manager, "nonexistent")
|
|
check exitCode != 0
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell profile set
|
|
# ==========================================================================
|
|
|
|
test "cmdCellProfileSet - changes profile":
|
|
discard manager.createNippel("profile-set-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellProfileSet(manager, "profile-set-test", SecurityProfile.Server)
|
|
check exitCode == 0
|
|
|
|
let nippel = manager.getNippel("profile-set-test")
|
|
check nippel.isSome
|
|
check nippel.get.profile == SecurityProfile.Server
|
|
|
|
test "cmdCellProfileSet - nonexistent cell fails":
|
|
let exitCode = cmdCellProfileSet(manager, "nonexistent", SecurityProfile.Server)
|
|
check exitCode != 0
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell verify
|
|
# ==========================================================================
|
|
|
|
test "cmdCellVerify - verifies merkle tree":
|
|
discard manager.createNippel("verify-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellVerify(manager, "verify-test")
|
|
check exitCode == 0
|
|
|
|
test "cmdCellVerify - nonexistent cell fails":
|
|
let exitCode = cmdCellVerify(manager, "nonexistent")
|
|
check exitCode != 0
|
|
|
|
test "cmdCellVerify - no merkle tree warning":
|
|
discard manager.createNippel("no-merkle-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
# Remove merkle tree
|
|
del(manager.merkleTrees, "no-merkle-test")
|
|
|
|
let exitCode = cmdCellVerify(manager, "no-merkle-test")
|
|
check exitCode == 2 # Warning code
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell query
|
|
# ==========================================================================
|
|
|
|
test "cmdCellQuery - queries nippel state":
|
|
discard manager.createNippel("query-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let nippel = manager.getNippel("query-test").get
|
|
let address = formatUTCPAddress(nippel.utcpAddress)
|
|
|
|
let exitCode = cmdCellQuery(manager, address)
|
|
check exitCode == 0
|
|
|
|
test "cmdCellQuery - queries merkle tree":
|
|
discard manager.createNippel("query-merkle-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let nippel = manager.getNippel("query-merkle-test").get
|
|
let address = formatUTCPAddress(nippel.utcpAddress) & "/merkle"
|
|
|
|
let exitCode = cmdCellQuery(manager, address)
|
|
check exitCode == 0
|
|
|
|
test "cmdCellQuery - queries profile":
|
|
discard manager.createNippel("query-profile-test", SecurityProfile.Workstation, ProfileOverrides())
|
|
|
|
let nippel = manager.getNippel("query-profile-test").get
|
|
let address = formatUTCPAddress(nippel.utcpAddress) & "/profile"
|
|
|
|
let exitCode = cmdCellQuery(manager, address)
|
|
check exitCode == 0
|
|
|
|
test "cmdCellQuery - invalid address fails":
|
|
let exitCode = cmdCellQuery(manager, "invalid-address")
|
|
check exitCode != 0
|
|
|
|
test "cmdCellQuery - nonexistent nippel fails":
|
|
let exitCode = cmdCellQuery(manager, "utcp://localhost/nippel/nonexistent")
|
|
check exitCode != 0
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell info
|
|
# ==========================================================================
|
|
|
|
test "cmdCellInfo - shows detailed information":
|
|
discard manager.createNippel("info-test", SecurityProfile.Workstation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellInfo(manager, "info-test")
|
|
check exitCode == 0
|
|
|
|
test "cmdCellInfo - nonexistent cell fails":
|
|
let exitCode = cmdCellInfo(manager, "nonexistent")
|
|
check exitCode != 0
|
|
|
|
test "cmdCellInfo - shows active status":
|
|
discard manager.createNippel("info-active-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
discard manager.activateNippel("info-active-test")
|
|
|
|
let exitCode = cmdCellInfo(manager, "info-active-test")
|
|
check exitCode == 0
|
|
check manager.isNippelActive("info-active-test")
|
|
|
|
# ==========================================================================
|
|
# Test: nip cell delete
|
|
# ==========================================================================
|
|
|
|
test "cmdCellDelete - deletes inactive cell":
|
|
discard manager.createNippel("delete-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
|
|
let exitCode = cmdCellDelete(manager, "delete-test", force = false)
|
|
check exitCode == 0
|
|
|
|
let nippel = manager.getNippel("delete-test")
|
|
check nippel.isNone
|
|
|
|
test "cmdCellDelete - fails on active cell without force":
|
|
discard manager.createNippel("delete-active-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
discard manager.activateNippel("delete-active-test")
|
|
|
|
let exitCode = cmdCellDelete(manager, "delete-active-test", force = false)
|
|
check exitCode != 0
|
|
|
|
# Cell should still exist
|
|
let nippel = manager.getNippel("delete-active-test")
|
|
check nippel.isSome
|
|
|
|
test "cmdCellDelete - force deletes active cell":
|
|
discard manager.createNippel("delete-force-test", SecurityProfile.Homestation, ProfileOverrides())
|
|
discard manager.activateNippel("delete-force-test")
|
|
|
|
let exitCode = cmdCellDelete(manager, "delete-force-test", force = true)
|
|
check exitCode == 0
|
|
|
|
let nippel = manager.getNippel("delete-force-test")
|
|
check nippel.isNone
|
|
|
|
test "cmdCellDelete - nonexistent cell fails":
|
|
let exitCode = cmdCellDelete(manager, "nonexistent", force = false)
|
|
check exitCode != 0
|
|
|
|
# ==========================================================================
|
|
# Test: Integration scenarios
|
|
# ==========================================================================
|
|
|
|
test "Full workflow - create, activate, verify, deactivate, delete":
|
|
# Create
|
|
let createOpts = CreateOptions(
|
|
name: "workflow-test",
|
|
profile: SecurityProfile.Workstation,
|
|
isolation: IsolationLevel.Strict,
|
|
overrides: ProfileOverrides(),
|
|
description: "Full workflow test"
|
|
)
|
|
check cmdCellCreate(manager, createOpts) == 0
|
|
|
|
# Activate
|
|
check cmdCellActivate(manager, "workflow-test") == 0
|
|
check manager.isNippelActive("workflow-test")
|
|
|
|
# Verify
|
|
check cmdCellVerify(manager, "workflow-test") == 0
|
|
|
|
# Query
|
|
let nippel = manager.getNippel("workflow-test").get
|
|
let address = formatUTCPAddress(nippel.utcpAddress)
|
|
check cmdCellQuery(manager, address) == 0
|
|
|
|
# Info
|
|
check cmdCellInfo(manager, "workflow-test") == 0
|
|
|
|
# Deactivate
|
|
check cmdCellDeactivate(manager, "workflow-test") == 0
|
|
check not manager.isNippelActive("workflow-test")
|
|
|
|
# Delete
|
|
check cmdCellDelete(manager, "workflow-test", force = false) == 0
|
|
check manager.getNippel("workflow-test").isNone
|
|
|
|
test "Multiple cells workflow":
|
|
# Create multiple cells with different profiles
|
|
let profiles = [
|
|
("home", SecurityProfile.Homestation),
|
|
("work", SecurityProfile.Workstation),
|
|
("server", SecurityProfile.Server)
|
|
]
|
|
|
|
for (name, profile) in profiles:
|
|
let opts = CreateOptions(
|
|
name: name,
|
|
profile: profile,
|
|
isolation: IsolationLevel.Standard,
|
|
overrides: ProfileOverrides(),
|
|
description: fmt"Test {name}"
|
|
)
|
|
check cmdCellCreate(manager, opts) == 0
|
|
|
|
# List all
|
|
check cmdCellList(manager, verbose = false) == 0
|
|
check manager.listNippels().len == 3
|
|
|
|
# Activate one
|
|
check cmdCellActivate(manager, "work") == 0
|
|
|
|
# Verify all
|
|
for (name, _) in profiles:
|
|
check cmdCellVerify(manager, name) == 0
|
|
|
|
# Change profile
|
|
check cmdCellProfileSet(manager, "home", SecurityProfile.Satellite) == 0
|
|
|
|
# Deactivate
|
|
check cmdCellDeactivate(manager, "work") == 0
|
|
|
|
# Delete all
|
|
for (name, _) in profiles:
|
|
check cmdCellDelete(manager, name, force = false) == 0
|
|
|
|
check manager.listNippels().len == 0
|
|
|
|
echo "✓ All Nippels CLI tests completed"
|