115 lines
3.6 KiB
Nim
115 lines
3.6 KiB
Nim
import std/[unittest, os, osproc, strutils, strformat, tempfiles, tables, strtabs]
|
|
|
|
const NIP_BIN_REL = "nip/src/nip.out"
|
|
let NIP_BIN = absolutePath(NIP_BIN_REL)
|
|
|
|
suite "NIP CLI Integration Tests":
|
|
|
|
var tempHome: string
|
|
var sourceDir: string
|
|
var outputDir: string
|
|
var env: StringTableRef
|
|
|
|
setup:
|
|
tempHome = createTempDir("nip_cli_test_home_", "")
|
|
sourceDir = tempHome / "source"
|
|
outputDir = tempHome / "output"
|
|
createDir(sourceDir)
|
|
createDir(outputDir)
|
|
|
|
# Mock XDG dirs
|
|
createDir(tempHome / ".local/share/nexus/nips")
|
|
createDir(tempHome / ".local/share/nexus/cas")
|
|
createDir(tempHome / ".local/share/applications")
|
|
createDir(tempHome / ".local/share/icons")
|
|
|
|
env = {"HOME": tempHome, "XDG_DATA_HOME": tempHome / ".local/share"}.newStringTable()
|
|
|
|
teardown:
|
|
removeDir(tempHome)
|
|
|
|
test "Full Lifecycle: Pack -> Install -> Run -> Remove":
|
|
# 1. Create Source Package
|
|
let manifestContent = """
|
|
package "cli-test-app" {
|
|
version "0.1.0"
|
|
license "MIT"
|
|
description "A test application"
|
|
|
|
files {
|
|
file "bin/app" hash="sha256:dummy" permissions="755" size=100
|
|
}
|
|
|
|
desktop {
|
|
display_name "CLI Test App"
|
|
terminal true
|
|
}
|
|
|
|
sandbox {
|
|
level "relaxed"
|
|
}
|
|
}
|
|
"""
|
|
writeFile(sourceDir / "manifest.kdl", manifestContent)
|
|
|
|
createDir(sourceDir / "bin")
|
|
# Create a dummy script as the app
|
|
let scriptContent = """#!/bin/sh
|
|
echo "Hello from CLI Test App"
|
|
echo "Args: $@"
|
|
"""
|
|
writeFile(sourceDir / "bin/app", scriptContent)
|
|
setFilePermissions(sourceDir / "bin/app", {fpUserExec, fpUserRead, fpUserWrite})
|
|
|
|
# 2. Pack
|
|
let nipFile = outputDir / "app.nip"
|
|
let packCmd = fmt"{NIP_BIN} pack {sourceDir} {nipFile}"
|
|
let (packOut, packErr) = execCmdEx(packCmd, env=env)
|
|
if packErr != 0: echo "Pack Output: ", packOut
|
|
check packErr == 0
|
|
check fileExists(nipFile)
|
|
echo "NIP File Size: ", getFileSize(nipFile)
|
|
|
|
let (zstdOut, zstdErr) = execCmdEx("zstd --version")
|
|
echo "ZSTD Version: ", zstdOut
|
|
|
|
# 3. Install
|
|
let installCmd = fmt"{NIP_BIN} install {nipFile}"
|
|
let (instOut, instErr) = execCmdEx(installCmd, env=env)
|
|
if instErr != 0: echo "Install Output: ", instOut
|
|
check instErr == 0
|
|
check "Installed cli-test-app v0.1.0" in instOut
|
|
|
|
# Verify installation
|
|
let installPath = tempHome / ".local/share/nexus/nips/cli-test-app/Current"
|
|
check symlinkExists(installPath) or fileExists(installPath)
|
|
|
|
# 4. Run
|
|
# Note: This might fail due to unshare permissions in CI
|
|
let runCmd = fmt"{NIP_BIN} run cli-test-app -- arg1 arg2"
|
|
let (runOut, runErr) = execCmdEx(runCmd, env=env)
|
|
|
|
if runErr != 0:
|
|
if "Operation not permitted" in runOut:
|
|
echo "SKIPPING RUN: Unshare not permitted"
|
|
else:
|
|
echo "Run failed: ", runOut
|
|
# check runErr == 0 # Don't fail if it's just unshare
|
|
else:
|
|
# If it worked (e.g. no sandbox or permitted), check output
|
|
# But our mock app is a shell script.
|
|
# The launcher executes it.
|
|
# If unshare worked, we should see "Hello from CLI Test App"
|
|
if "Hello from CLI Test App" in runOut:
|
|
check "Args: arg1 arg2" in runOut
|
|
else:
|
|
echo "Run output unexpected: ", runOut
|
|
|
|
# 5. Remove
|
|
let removeCmd = fmt"{NIP_BIN} remove cli-test-app"
|
|
let (remOut, remErr) = execCmdEx(removeCmd, env=env)
|
|
check remErr == 0
|
|
check "Removed NIP cli-test-app" in remOut
|
|
|
|
check not dirExists(tempHome / ".local/share/nexus/nips/cli-test-app")
|