nip/tests/test_recipe_manager.nim

249 lines
5.7 KiB
Nim

## test_recipe_manager.nim
## Unit tests for recipe manager
import std/[unittest, options, os, strutils]
import ../src/nimpak/build/[recipe_manager, recipe_parser, bootstrap]
suite "Recipe Manager Tests":
setup:
# Use a test cache directory
let testCache = getTempDir() / "nip-test-recipes"
let rm = newRecipeManager(cacheDir = testCache)
teardown:
# Clean up test cache
if dirExists(testCache):
removeDir(testCache)
test "Create recipe manager":
check rm != nil
check rm.localCache.len > 0
check rm.repoUrl.len > 0
test "Get recipe path":
let nixPath = rm.getRecipePath(bttNix)
check "nix" in nixPath
check "minimal-nix.kdl" in nixPath
let pkgsrcPath = rm.getRecipePath(bttPkgsrc)
check "pkgsrc" in pkgsrcPath
let gentooPath = rm.getRecipePath(bttGentoo)
check "gentoo" in gentooPath
test "Check if repo is cloned":
check not rm.isRepoCloned()
test "List available recipes (no repo)":
let recipes = rm.listAvailableRecipes()
# Should be empty if repo not cloned
check recipes.len == 0
test "Clear cache":
rm.clearCache()
# Just check it doesn't crash
check true
test "Needs update":
# Should need update if never updated
check rm.needsUpdate()
test "Get cache stats":
let stats = rm.getCacheStats()
check stats.cached == 0
check stats.total == 3
check stats.lastUpdate == "never"
test "Load recipe from local file":
# Create a test recipe file
let testRecipeDir = rm.localCache / "nix"
createDir(testRecipeDir)
let testRecipe = """
recipe "test-nix" {
version "1.0.0"
tool-type "nix"
platform arch="x86_64" os="linux" {
binary "test-binary" {
url "https://example.com/test"
checksum "blake2b-test"
size 1000
}
}
install {
script "install.sh"
}
}
"""
writeFile(rm.getRecipePath(bttNix), testRecipe)
# Create .git directory to simulate cloned repo
createDir(rm.localCache / ".git")
let recipeOpt = rm.loadRecipe(bttNix)
check recipeOpt.isSome
if recipeOpt.isSome:
let recipe = recipeOpt.get()
check recipe.name == "test-nix"
check recipe.version == "1.0.0"
check recipe.toolType == "nix"
test "Get recipe version":
# Create a test recipe
let testRecipeDir = rm.localCache / "pkgsrc"
createDir(testRecipeDir)
let testRecipe = """
recipe "test-pkgsrc" {
version "2.0.0"
tool-type "pkgsrc"
platform arch="x86_64" os="linux" {
binary "test" {
url "https://example.com/test"
checksum "blake2b-test"
size 1000
}
}
install {
script "install.sh"
}
}
"""
writeFile(rm.getRecipePath(bttPkgsrc), testRecipe)
createDir(rm.localCache / ".git")
let versionOpt = rm.getRecipeVersion(bttPkgsrc)
check versionOpt.isSome
if versionOpt.isSome:
check versionOpt.get() == "2.0.0"
test "Get recipe info":
# Create a test recipe
let testRecipeDir = rm.localCache / "gentoo"
createDir(testRecipeDir)
let testRecipe = """
recipe "test-gentoo" {
version "3.0.0"
description "Test Gentoo recipe"
tool-type "gentoo"
platform arch="x86_64" os="linux" {
binary "test" {
url "https://example.com/test"
checksum "blake2b-test"
size 1000
}
}
install {
script "install.sh"
}
}
"""
writeFile(rm.getRecipePath(bttGentoo), testRecipe)
createDir(rm.localCache / ".git")
let infoOpt = rm.getRecipeInfo(bttGentoo)
check infoOpt.isSome
if infoOpt.isSome:
let info = infoOpt.get()
check info.name == "test-gentoo"
check info.version == "3.0.0"
check info.description == "Test Gentoo recipe"
test "Select platform for recipe":
# Create a test recipe with multiple platforms
let testRecipeDir = rm.localCache / "nix"
createDir(testRecipeDir)
let testRecipe = """
recipe "multi-platform" {
version "1.0.0"
tool-type "nix"
platform arch="x86_64" os="linux" {
binary "test-x64" {
url "https://example.com/test-x64"
checksum "blake2b-x64"
size 1000
}
}
platform arch="aarch64" os="linux" {
binary "test-arm" {
url "https://example.com/test-arm"
checksum "blake2b-arm"
size 1000
}
}
install {
script "install.sh"
}
}
"""
writeFile(rm.getRecipePath(bttNix), testRecipe)
createDir(rm.localCache / ".git")
let recipeOpt = rm.loadRecipe(bttNix)
check recipeOpt.isSome
if recipeOpt.isSome:
let recipe = recipeOpt.get()
let platformOpt = rm.selectPlatformForRecipe(recipe)
check platformOpt.isSome
# Should select platform matching current system
if platformOpt.isSome:
let platform = platformOpt.get()
check platform.binaries.len > 0
test "Validate recipe":
# Create a valid recipe
let testRecipeDir = rm.localCache / "nix"
createDir(testRecipeDir)
let testRecipe = """
recipe "valid" {
version "1.0.0"
tool-type "nix"
platform arch="x86_64" os="linux" {
binary "test" {
url "https://example.com/test"
checksum "blake2b-test"
size 1000
}
}
install {
script "install.sh"
}
}
"""
writeFile(rm.getRecipePath(bttNix), testRecipe)
createDir(rm.localCache / ".git")
let recipeOpt = rm.loadRecipe(bttNix)
check recipeOpt.isSome
if recipeOpt.isSome:
let recipe = recipeOpt.get()
let (valid, errors) = rm.validateRecipeWithErrors(recipe)
check valid
check errors.len == 0