nip/tests/test_repo_hierarchy.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"