268 lines
6.9 KiB
Nim
268 lines
6.9 KiB
Nim
## test_recipe_parser.nim
|
|
## Unit tests for recipe parser
|
|
|
|
import std/[unittest, os, json]
|
|
import ../src/nimpak/build/recipe_parser
|
|
|
|
suite "Recipe Binary":
|
|
test "Create binary":
|
|
var binary = RecipeBinary()
|
|
binary.name = "test-binary"
|
|
binary.url = "https://example.com/binary"
|
|
binary.checksum = "blake2b-abc123"
|
|
binary.size = 1024
|
|
binary.executable = true
|
|
|
|
check:
|
|
binary.name == "test-binary"
|
|
binary.url == "https://example.com/binary"
|
|
binary.checksum == "blake2b-abc123"
|
|
binary.size == 1024
|
|
binary.executable == true
|
|
|
|
test "Binary to JSON":
|
|
var binary = RecipeBinary()
|
|
binary.name = "test"
|
|
binary.url = "https://example.com/test"
|
|
binary.checksum = "blake2b-123"
|
|
binary.size = 2048
|
|
binary.executable = false
|
|
|
|
let jsonNode = binary.toJson()
|
|
|
|
check:
|
|
jsonNode["name"].getStr() == "test"
|
|
jsonNode["url"].getStr() == "https://example.com/test"
|
|
jsonNode["checksum"].getStr() == "blake2b-123"
|
|
jsonNode["size"].getInt() == 2048
|
|
jsonNode["executable"].getBool() == false
|
|
|
|
test "Binary from JSON":
|
|
let jsonStr = """
|
|
{
|
|
"name": "imported",
|
|
"url": "https://example.com/imported",
|
|
"checksum": "blake2b-456",
|
|
"size": 4096,
|
|
"executable": true
|
|
}
|
|
"""
|
|
|
|
let jsonNode = parseJson(jsonStr)
|
|
let binary = fromJson(jsonNode, RecipeBinary)
|
|
|
|
check:
|
|
binary.name == "imported"
|
|
binary.url == "https://example.com/imported"
|
|
binary.checksum == "blake2b-456"
|
|
binary.size == 4096
|
|
binary.executable == true
|
|
|
|
suite "Recipe Archive":
|
|
test "Create archive":
|
|
var archive = RecipeArchive()
|
|
archive.name = "test-archive"
|
|
archive.url = "https://example.com/archive.tar.gz"
|
|
archive.checksum = "blake2b-xyz"
|
|
archive.size = 10240
|
|
archive.extractTo = "/opt/test"
|
|
|
|
check:
|
|
archive.name == "test-archive"
|
|
archive.url == "https://example.com/archive.tar.gz"
|
|
archive.checksum == "blake2b-xyz"
|
|
archive.size == 10240
|
|
archive.extractTo == "/opt/test"
|
|
|
|
test "Archive to JSON":
|
|
var archive = RecipeArchive()
|
|
archive.name = "archive"
|
|
archive.url = "https://example.com/archive.tar.gz"
|
|
archive.checksum = "blake2b-789"
|
|
archive.size = 20480
|
|
archive.extractTo = "/usr/local"
|
|
|
|
let jsonNode = archive.toJson()
|
|
|
|
check:
|
|
jsonNode["name"].getStr() == "archive"
|
|
jsonNode["url"].getStr() == "https://example.com/archive.tar.gz"
|
|
jsonNode["extractTo"].getStr() == "/usr/local"
|
|
|
|
suite "Recipe Platform":
|
|
test "Create platform":
|
|
var platform = RecipePlatform()
|
|
platform.arch = paX86_64
|
|
platform.os = "linux"
|
|
|
|
check:
|
|
platform.arch == paX86_64
|
|
platform.os == "linux"
|
|
|
|
test "Platform with binaries":
|
|
var platform = RecipePlatform()
|
|
platform.arch = paAarch64
|
|
platform.os = "linux"
|
|
|
|
var binary = RecipeBinary()
|
|
binary.name = "test"
|
|
binary.url = "https://example.com/test"
|
|
binary.checksum = "blake2b-123"
|
|
binary.size = 1024
|
|
binary.executable = true
|
|
|
|
platform.binaries.add(binary)
|
|
|
|
check:
|
|
platform.binaries.len == 1
|
|
platform.binaries[0].name == "test"
|
|
|
|
test "Platform to JSON":
|
|
var platform = RecipePlatform()
|
|
platform.arch = paX86_64
|
|
platform.os = "linux"
|
|
|
|
let jsonNode = platform.toJson()
|
|
|
|
check:
|
|
jsonNode["arch"].getStr() == "x86_64"
|
|
jsonNode["os"].getStr() == "linux"
|
|
jsonNode["binaries"].kind == JArray
|
|
jsonNode["archives"].kind == JArray
|
|
|
|
suite "Recipe Dependency":
|
|
test "Create dependency":
|
|
var dep = RecipeDependency()
|
|
dep.name = "git"
|
|
dep.kind = "system"
|
|
dep.version = ">=2.0"
|
|
dep.required = true
|
|
|
|
check:
|
|
dep.name == "git"
|
|
dep.kind == "system"
|
|
dep.version == ">=2.0"
|
|
dep.required == true
|
|
|
|
test "Dependency to JSON":
|
|
var dep = RecipeDependency()
|
|
dep.name = "curl"
|
|
dep.kind = "system"
|
|
dep.version = ""
|
|
dep.required = false
|
|
|
|
let jsonNode = dep.toJson()
|
|
|
|
check:
|
|
jsonNode["name"].getStr() == "curl"
|
|
jsonNode["kind"].getStr() == "system"
|
|
jsonNode["required"].getBool() == false
|
|
|
|
suite "Recipe Install":
|
|
test "Create install":
|
|
var install = RecipeInstall()
|
|
install.script = "scripts/install.sh"
|
|
install.verifyScript = "scripts/verify.sh"
|
|
install.postInstall = "scripts/post.sh"
|
|
|
|
check:
|
|
install.script == "scripts/install.sh"
|
|
install.verifyScript == "scripts/verify.sh"
|
|
install.postInstall == "scripts/post.sh"
|
|
|
|
test "Install to JSON":
|
|
var install = RecipeInstall()
|
|
install.script = "install.sh"
|
|
install.verifyScript = "verify.sh"
|
|
install.postInstall = ""
|
|
|
|
let jsonNode = install.toJson()
|
|
|
|
check:
|
|
jsonNode["script"].getStr() == "install.sh"
|
|
jsonNode["verifyScript"].getStr() == "verify.sh"
|
|
|
|
suite "Recipe Metadata":
|
|
test "Create metadata":
|
|
var metadata = RecipeMetadata()
|
|
metadata.author = "Test Author"
|
|
metadata.license = "MIT"
|
|
metadata.updated = "2024-11-16"
|
|
metadata.homepage = "https://example.com"
|
|
metadata.issues = "https://example.com/issues"
|
|
|
|
check:
|
|
metadata.author == "Test Author"
|
|
metadata.license == "MIT"
|
|
metadata.updated == "2024-11-16"
|
|
|
|
test "Metadata to JSON":
|
|
var metadata = RecipeMetadata()
|
|
metadata.author = "Author"
|
|
metadata.license = "Apache-2.0"
|
|
metadata.updated = "2024-01-01"
|
|
metadata.homepage = "https://test.com"
|
|
metadata.issues = "https://test.com/issues"
|
|
|
|
let jsonNode = metadata.toJson()
|
|
|
|
check:
|
|
jsonNode["author"].getStr() == "Author"
|
|
jsonNode["license"].getStr() == "Apache-2.0"
|
|
|
|
suite "Full Recipe":
|
|
test "Create recipe":
|
|
var recipe = Recipe()
|
|
recipe.name = "test-tool"
|
|
recipe.version = "1.0.0"
|
|
recipe.description = "Test tool"
|
|
recipe.toolType = "test"
|
|
|
|
check:
|
|
recipe.name == "test-tool"
|
|
recipe.version == "1.0.0"
|
|
recipe.description == "Test tool"
|
|
recipe.toolType == "test"
|
|
|
|
test "Recipe to JSON":
|
|
var recipe = Recipe()
|
|
recipe.name = "toolType"
|
|
recipe.version = "2.0.0"
|
|
recipe.description = "A tool"
|
|
recipe.toolType = "toolType"
|
|
|
|
let jsonNode = recipe.toJson()
|
|
|
|
check:
|
|
jsonNode["name"].getStr() == "toolType"
|
|
jsonNode["version"].getStr() == "2.0.0"
|
|
jsonNode["description"].getStr() == "A tool"
|
|
jsonNode["toolType"].getStr() == "toolType"
|
|
|
|
test "Recipe export and import":
|
|
var recipe = Recipe()
|
|
recipe.name = "export-test"
|
|
recipe.version = "1.0.0"
|
|
recipe.description = "Export test"
|
|
recipe.toolType = "test"
|
|
|
|
let tempFile = getTempDir() / "test-recipe.json"
|
|
|
|
# Export
|
|
let exported = recipe.exportToJson(tempFile)
|
|
check:
|
|
exported == true
|
|
fileExists(tempFile)
|
|
|
|
# Import
|
|
let imported = importFromJson(tempFile)
|
|
check:
|
|
imported.name == "export-test"
|
|
imported.version == "1.0.0"
|
|
imported.description == "Export test"
|
|
imported.toolType == "test"
|
|
|
|
removeFile(tempFile)
|
|
|
|
echo "✅ All recipe parser tests completed"
|