161 lines
4.8 KiB
Nim
161 lines
4.8 KiB
Nim
## Tests for Repository Hierarchy & Configuration
|
|
## Task 1: Config Schema (Sub-Feature 1, Milestone m1)
|
|
|
|
import std/[unittest, os, strutils, tables]
|
|
import ../src/nimpak/repo/config
|
|
import ../src/nimpak/repo/resolver
|
|
import ../src/nimpak/repo/overrides
|
|
import ../src/nip/types
|
|
|
|
suite "Repository Configuration Parsing":
|
|
|
|
test "Parse repos.kdl with Native, Git, and Graft repos":
|
|
let repoConfigPath = getAppDir() / "fixtures" / "repos.kdl"
|
|
|
|
let repos = parseRepoConfig(repoConfigPath)
|
|
|
|
# Should have 3 repos
|
|
check repos.len == 3
|
|
|
|
# Check Native repo
|
|
let nativeRepo = repos[0]
|
|
check nativeRepo.name == "nexus-core"
|
|
check nativeRepo.kind == Native
|
|
check nativeRepo.url == "https://repo.nexus.nexus/v1"
|
|
check nativeRepo.key == "ed25519-test-key-abc123"
|
|
check nativeRepo.priority == 100
|
|
|
|
# Check Git repo
|
|
let gitRepo = repos[1]
|
|
check gitRepo.name == "nexus-toolkit"
|
|
check gitRepo.kind == Git
|
|
check gitRepo.url == "https://git.maiwald.work/Nexus/NexusToolKit.git"
|
|
check gitRepo.branch == "main"
|
|
check gitRepo.priority == 90
|
|
|
|
# Check Graft repo
|
|
let graftRepo = repos[2]
|
|
check graftRepo.name == "nix-unstable"
|
|
check graftRepo.kind == Graft
|
|
check graftRepo.backend == Nix
|
|
check graftRepo.url == "https://nixos.org/channels/nixpkgs-unstable"
|
|
check graftRepo.priority == 10
|
|
|
|
test "Parse empty repos.kdl":
|
|
let tempFile = getTempDir() / "empty_repos.kdl"
|
|
writeFile(tempFile, "")
|
|
|
|
let repos = parseRepoConfig(tempFile)
|
|
check repos.len == 0
|
|
|
|
removeFile(tempFile)
|
|
|
|
test "Invalid repo type raises error":
|
|
let tempFile = getTempDir() / "invalid_repos.kdl"
|
|
writeFile(tempFile, """
|
|
repo "bad" {
|
|
type "invalid"
|
|
url "http://example.com"
|
|
}
|
|
""")
|
|
|
|
expect ValueError:
|
|
discard parseRepoConfig(tempFile)
|
|
|
|
removeFile(tempFile)
|
|
|
|
suite "Resolution Engine":
|
|
|
|
test "Sort repos by priority (highest first)":
|
|
let repos = @[
|
|
RepoConfig(name: "low", priority: 10),
|
|
RepoConfig(name: "high", priority: 100),
|
|
RepoConfig(name: "medium", priority: 50)
|
|
]
|
|
|
|
let sorted = sortReposByPriority(repos)
|
|
|
|
check sorted[0].name == "high"
|
|
check sorted[1].name == "medium"
|
|
check sorted[2].name == "low"
|
|
|
|
test "User override takes precedence":
|
|
let repos = @[
|
|
RepoConfig(name: "native", kind: Native, priority: 100)
|
|
]
|
|
|
|
var ctx = initResolutionContext("nginx", repos)
|
|
|
|
# Add user override
|
|
let userFragment = Fragment(
|
|
id: PackageId(name: "nginx", version: "1.25.0-custom", stream: Dev),
|
|
source: Source(hash: "user-override-hash")
|
|
)
|
|
ctx.addUserOverride("nginx", userFragment)
|
|
|
|
# Resolve should return user override
|
|
let result = ctx.resolvePackage()
|
|
|
|
check result.found == true
|
|
check result.source.name == "user-override"
|
|
check result.version == "1.25.0-custom"
|
|
check result.cid == "user-override-hash"
|
|
|
|
test "Resolution trace formatting":
|
|
let repos = @[
|
|
RepoConfig(name: "core", kind: Native, priority: 100),
|
|
RepoConfig(name: "git", kind: Git, priority: 50)
|
|
]
|
|
|
|
let ctx = initResolutionContext("htop", repos)
|
|
let result = ResolutionResult(found: false, packageName: "htop")
|
|
|
|
let trace = formatResolutionTrace(ctx, result)
|
|
|
|
check trace.contains("NOT FOUND")
|
|
check trace.contains("core")
|
|
check trace.contains("git")
|
|
|
|
suite "User Override Hooks":
|
|
|
|
test "Load user overrides from directory":
|
|
let overrideDir = getAppDir() / "fixtures" / "overrides"
|
|
let overrides = loadUserOverrides(overrideDir)
|
|
|
|
check len(overrides) == 1
|
|
check overrides.hasKey("nginx")
|
|
|
|
let nginxOverride = overrides["nginx"]
|
|
check nginxOverride.id.name == "nginx"
|
|
check nginxOverride.id.version == "1.25.0-custom"
|
|
check nginxOverride.id.stream == Dev
|
|
check nginxOverride.source.hash == "xxh3-user-override-nginx-abc123"
|
|
check nginxOverride.source.url == "file:///home/user/nginx-custom-build"
|
|
check nginxOverride.source.sourceMethod == Local
|
|
|
|
test "User override takes absolute precedence in resolution":
|
|
let repos = @[
|
|
RepoConfig(name: "native", kind: Native, priority: 100),
|
|
RepoConfig(name: "git", kind: Git, priority: 50)
|
|
]
|
|
|
|
var ctx = initResolutionContext("nginx", repos)
|
|
|
|
# Load overrides
|
|
let overrideDir = getAppDir() / "fixtures" / "overrides"
|
|
let overrides = loadUserOverrides(overrideDir)
|
|
|
|
for pkg, fragment in overrides:
|
|
ctx.addUserOverride(pkg, fragment)
|
|
|
|
# Resolve should return user override
|
|
let result = ctx.resolvePackage()
|
|
|
|
check result.found == true
|
|
check result.source.name == "user-override"
|
|
check result.version == "1.25.0-custom"
|
|
check result.cid == "xxh3-user-override-nginx-abc123"
|
|
|
|
when isMainModule:
|
|
echo "Repository Hierarchy Tests"
|