nip/tests/test_pacman_adapter.nim

173 lines
4.3 KiB
Nim

## Test suite for Pacman Adapter functionality
import unittest
import std/[os, strutils, times, tables, options]
import ../src/nimpak/adapters/pacman
suite "Pacman Adapter Tests":
setup:
# Create a mock pacman database for testing
let testDir = getTempDir() / "nip_test_pacman"
let mockPacmanDb = testDir / "pacman_db"
createDir(mockPacmanDb)
# Create a mock package directory
let mockPkg = mockPacmanDb / "test-package-1.0.0-1"
createDir(mockPkg)
# Create mock desc file
let descContent = """%NAME%
test-package
%VERSION%
1.0.0-1
%DESC%
A test package for NIP pacman integration
%ARCH%
x86_64
%URL%
https://example.com/test-package
%LICENSE%
MIT
%DEPENDS%
glibc
bash
%OPTDEPENDS%
optional-dep: for optional functionality
%INSTALLDATE%
1640995200
%REASON%
1
%SIZE%
1048576
%PACKAGER%
Test Packager <test@example.com>
%BUILDDATE%
1640995100
"""
writeFile(mockPkg / "desc", descContent)
# Create mock files file
let filesContent = """%FILES%
usr/
usr/bin/
usr/bin/test-package
usr/share/
usr/share/doc/
usr/share/doc/test-package/
usr/share/doc/test-package/README
"""
writeFile(mockPkg / "files", filesContent)
teardown:
if dirExists(testDir):
removeDir(testDir)
test "Initialize pacman adapter":
let adapter = initPacmanAdapter(mockPacmanDb)
check adapter.database.dbPath == mockPacmanDb
check len(adapter.database.packages) == 0
test "Load pacman database":
var adapter = initPacmanAdapter(mockPacmanDb)
let result = adapter.loadPacmanDatabase()
check result.isOk
check len(adapter.database.packages) == 1
check "test-package" in adapter.database.packages
test "Parse package information":
var adapter = initPacmanAdapter(mockPacmanDb)
discard adapter.loadPacmanDatabase()
let pkgOpt = adapter.getPackage("test-package")
check pkgOpt.isSome
let pkg = pkgOpt.get()
check pkg.name == "test-package"
check pkg.version == "1.0.0-1"
check pkg.description == "A test package for NIP pacman integration"
check pkg.architecture == "x86_64"
check pkg.url == "https://example.com/test-package"
check pkg.licenses == @["MIT"]
check pkg.depends == @["glibc", "bash"]
check pkg.installSize == 1048576
test "List packages":
var adapter = initPacmanAdapter(mockPacmanDb)
discard adapter.loadPacmanDatabase()
let packages = adapter.listPackages()
check packages.len == 1
check packages[0].name == "test-package"
test "Search packages":
var adapter = initPacmanAdapter(mockPacmanDb)
discard adapter.loadPacmanDatabase()
let results = adapter.searchPackages("test")
check results.len == 1
check results[0].name == "test-package"
let noResults = adapter.searchPackages("nonexistent")
check noResults.len == 0
test "Convert to NIP package format":
var adapter = initPacmanAdapter(mockPacmanDb)
discard adapter.loadPacmanDatabase()
let pkgOpt = adapter.getPackage("test-package")
check pkgOpt.isSome
let pacmanPkg = pkgOpt.get()
let nipPkg = convertToNipPackage(pacmanPkg)
check nipPkg.name == "test-package"
check nipPkg.version == "1.0.0-1"
check nipPkg.description == "A test package for NIP pacman integration"
check nipPkg.dependencies.len == 2
check nipPkg.dependencies[0].name == "glibc"
check nipPkg.dependencies[1].name == "bash"
test "Get package info":
var adapter = initPacmanAdapter(mockPacmanDb)
discard adapter.loadPacmanDatabase()
let info = adapter.getPackageInfo("test-package")
check "test-package 1.0.0-1" in info
check "A test package for NIP pacman integration" in info
check "Dependencies: glibc, bash" in info
test "Get system statistics":
var adapter = initPacmanAdapter(mockPacmanDb)
discard adapter.loadPacmanDatabase()
let stats = adapter.getSystemStats()
check stats.totalPackages == 1
check stats.totalSize == 1048576
suite "Pacman CLI Integration":
test "Pacman list command (mock)":
# This would test against a real pacman database if available
# For now, we test the error handling
let result = nipPacmanList()
# Should either succeed or fail gracefully
check result.isOk or result.isErr
test "Pacman info command (mock)":
let result = nipPacmanInfo("nonexistent-package")
# Should handle non-existent packages gracefully
check result.isOk or result.isErr