nip/tests/test_grafting.nim

129 lines
3.9 KiB
Nim

# tests/test_grafting.nim
# Unit tests for grafting engine
import unittest, os, json
import ../src/nimpak/grafting
import ../src/nimpak/adapters/pacman
import ../src/nip/types
suite "Grafting Engine Tests":
setup:
let tempDir = getTempDir() / "nimpak_test_grafting"
if dirExists(tempDir):
removeDir(tempDir)
createDir(tempDir)
teardown:
let tempDir = getTempDir() / "nimpak_test_grafting"
if dirExists(tempDir):
removeDir(tempDir)
test "Grafting engine initialization":
let engineResult = initGraftingEngine()
check engineResult.isOk
let engine = engineResult.get()
check engine.config.enabled == true
check engine.adapters.len == 0
check engine.transactions.len == 0
test "Pacman adapter registration":
var engineResult = initGraftingEngine()
check engineResult.isOk
var engine = engineResult.get()
let adapter = newPacmanAdapter()
let registerResult = engine.registerAdapter(adapter)
check registerResult.isOk
check engine.adapters.len == 1
check "pacman" in engine.adapters
test "Pacman adapter configuration":
let config = %*{
"mirror_url": "https://custom.mirror.org",
"cache_dir": "/custom/cache",
"aur_enabled": false
}
let adapter = newPacmanAdapter(config)
check adapter.mirrorUrl == "https://custom.mirror.org"
check adapter.cacheDir == "/custom/cache"
check adapter.aurEnabled == false
test "Grafting status reporting":
let engineResult = initGraftingEngine()
check engineResult.isOk
let engine = engineResult.get()
let status = engine.getGraftingStatus()
check status.hasKey("enabled")
check status.hasKey("adapters")
check status.hasKey("cache")
check status.hasKey("transactions")
test "Graft hash calculation":
let hash1 = calculateGraftHash("test-package", "pacman", now())
let hash2 = calculateGraftHash("test-package", "pacman", now())
check hash1.startsWith("graft-")
check hash1 != hash2 # Different timestamps should produce different hashes
test "Grafted package listing":
let engineResult = initGraftingEngine()
check engineResult.isOk
let engine = engineResult.get()
let packages = engine.listGraftedPackages()
check packages.len == 0 # No packages grafted yet
test "Cache cleanup":
var engineResult = initGraftingEngine()
check engineResult.isOk
var engine = engineResult.get()
# Add some test metadata
let oldMetadata = GraftedPackageMetadata(
packageName: "old-package",
version: "1.0",
source: "test",
graftedAt: now() - initDuration(days = 10),
originalHash: "test-hash",
graftHash: "graft-test",
buildLog: "test log",
provenance: ProvenanceInfo()
)
engine.cache.metadata["old-package"] = oldMetadata
let cleanupResult = engine.cleanupGraftCache(initDuration(days = 5))
check cleanupResult.isOk
check cleanupResult.get() == 1 # Should have cleaned up 1 entry
suite "Pacman Adapter Tests":
test "Pacman adapter creation":
let adapter = newPacmanAdapter()
check adapter.name == "pacman"
check adapter.enabled == true
check adapter.priority == 30
check adapter.aurEnabled == true
test "Package validation (mock)":
let adapter = newPacmanAdapter()
# This test would normally require pacman to be installed
# For now, just test the method exists and returns a result
let validationResult = adapter.validatePackage("nonexistent-package")
check validationResult.isOk or validationResult.isErr # Either is fine for mock
test "Package info retrieval (mock)":
let adapter = newPacmanAdapter()
# This test would normally require pacman to be installed
# For now, just test the method exists and returns a result
let infoResult = adapter.getPackageInfo("nonexistent-package")
check infoResult.isOk or infoResult.isErr # Either is fine for mock