nip/tests/test_database.nim

262 lines
7.0 KiB
Nim

## tests/test_database.nim
## Unit tests for the package database system
##
## Tests package storage, retrieval, dependency resolution,
## and all database functionality.
import std/[unittest, os, times, json, tables]
import ../src/nimpak/database
suite "Package Database Tests":
setup:
# Create temporary test directory
let testDir = getTempDir() / "nip_test_db"
createDir(testDir)
teardown:
# Clean up test directory
let testDir = getTempDir() / "nip_test_db"
if dirExists(testDir):
removeDir(testDir)
test "Database initialization":
let db = newPackageDatabase()
db.initDatabase()
# Check that default packages are loaded
check db.packages.hasKey("htop")
check db.packages.hasKey("vim")
check "htop" in db.packages
check "vim" in db.packages
check "curl" in db.packages
test "Package retrieval":
let db = newPackageDatabase()
db.initDatabase()
let htop = db.getPackage("htop")
check htop.name == "htop"
check htop.version == "3.2.2"
check htop.stream == "stable"
check htop.size > 0
check htop.dependencies.len > 0
test "Package installation tracking":
let installTestDir = getTempDir() / "nip_test_db_install"
# Clean up any existing database files
if dirExists(installTestDir):
removeDir(installTestDir)
createDir(installTestDir)
let db = newPackageDatabase(installTestDir)
db.initDatabase()
# Initially not installed
check db.isInstalled("htop") == false
# Install package
let success = db.installPackage("htop")
check success == true
# Now should be installed
check db.isInstalled("htop") == true
test "Package removal":
let removeTestDir = getTempDir() / "nip_test_db_remove"
let db = newPackageDatabase(removeTestDir)
db.initDatabase()
# Install then remove
discard db.installPackage("vim")
check db.isInstalled("vim") == true
let success = db.removePackage("vim")
check success == true
check db.isInstalled("vim") == false
test "Dependency resolution":
let db = newPackageDatabase()
db.initDatabase()
let htop = db.getPackage("htop")
check "ncurses" in htop.dependencies
# Installing htop should also install dependencies
discard db.installPackage("htop")
check db.isInstalled("htop") == true
check db.isInstalled("ncurses") == true
test "Package listing":
let listingTestDir = getTempDir() / "nip_test_db_listing"
let db = newPackageDatabase(listingTestDir)
db.initDatabase()
# Install some packages
discard db.installPackage("htop")
discard db.installPackage("vim")
let installed = db.listInstalled()
check installed.len >= 2
var foundHtop = false
var foundVim = false
for pkg in installed:
if pkg.name == "htop": foundHtop = true
if pkg.name == "vim": foundVim = true
check foundHtop == true
check foundVim == true
test "Package search":
let db = newPackageDatabase()
db.initDatabase()
let results = db.searchPackages("editor")
check results.len > 0
# Should find vim (which has "editor" in description)
var foundVim = false
for pkg in results:
if pkg.name == "vim": foundVim = true
check foundVim == true
test "Total installed size calculation":
let db = newPackageDatabase()
db.initDatabase()
# Install some packages
discard db.installPackage("htop")
discard db.installPackage("vim")
let totalSize = db.getTotalInstalledSize()
check totalSize > 0
test "Package metadata":
let db = newPackageDatabase()
db.initDatabase()
let curl = db.getPackage("curl")
check curl.name == "curl"
check curl.description.len > 0
check curl.tags.len > 0
check "network" in curl.tags
test "Package streams":
let db = newPackageDatabase()
db.initDatabase()
# Check that packages have stream information
let htop = db.getPackage("htop")
check htop.stream == "stable"
let vim = db.getPackage("vim")
check vim.stream.len > 0 # Should have some stream value
test "Package installation with dependencies":
let db = newPackageDatabase()
db.initDatabase()
# Test complex dependency chain
let firefox = db.getPackage("firefox")
check firefox.dependencies.len > 0
# Installing firefox should install all dependencies
let success = db.installPackage("firefox")
check success == true
# Check that dependencies are installed
for dep in firefox.dependencies:
if dep in db.packages:
check db.isInstalled(dep) == true
suite "Database Performance Tests":
test "Large package database performance":
let db = newPackageDatabase()
db.initDatabase()
# Test that we can handle the full package database
# Test that we can handle the full package database
# Check that we have several packages loaded
check db.packages.hasKey("htop")
check db.packages.hasKey("vim")
check db.packages.hasKey("git")
check db.packages.hasKey("firefox")
# Test search performance
let startTime = cpuTime()
let results = db.searchPackages("test")
let endTime = cpuTime()
# Search should be fast (under 1 second for test database)
check (endTime - startTime) < 1.0
test "Installation performance":
let db = newPackageDatabase()
db.initDatabase()
# Test installation speed
let startTime = cpuTime()
discard db.installPackage("htop")
let endTime = cpuTime()
# Installation should be fast
check (endTime - startTime) < 1.0
test "Database persistence":
let testDbPath = getTempDir() / "nip_test_db" / "test.db"
# Create database and install packages
block:
let db = newPackageDatabase(testDbPath)
db.initDatabase()
discard db.installPackage("htop")
discard db.installPackage("vim")
# Load database again and check persistence
block:
let db2 = newPackageDatabase(testDbPath)
db2.initDatabase()
check db2.isInstalled("htop") == true
check db2.isInstalled("vim") == true
suite "Database Error Handling":
test "Non-existent package handling":
let db = newPackageDatabase()
db.initDatabase()
# Should handle non-existent packages gracefully
expect(KeyError):
discard db.getPackage("nonexistent-package")
let success = db.installPackage("nonexistent-package")
check success == false
test "Double installation handling":
let db = newPackageDatabase()
db.initDatabase()
# Install package twice
let success1 = db.installPackage("htop")
let success2 = db.installPackage("htop")
check success1 == true
check success2 == true # Should handle gracefully
check db.isInstalled("htop") == true
test "Remove non-installed package":
let db = newPackageDatabase()
db.initDatabase()
# Try to remove package that's not installed
let success = db.removePackage("definitely-not-installed-package")
check success == false
when isMainModule:
echo "🧪 Running Database Tests..."
echo "Testing package database with dependency resolution..."
# This will run all the test suites
discard