249 lines
5.7 KiB
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
|