nip/tests/test_updates.nim

230 lines
5.7 KiB
Nim

## test_updates.nim
## Tests for automatic update system
import std/[unittest, os, times, json, options, strutils]
import ../src/nimpak/update/[update_checker, update_manager]
suite "Update Configuration":
test "Load default config":
let config = loadConfig("/tmp/nonexistent-update-config.json")
check:
config.enabled == true
config.channel == Stable
config.frequency == Weekly
config.notifyRecipes == true
config.notifyTools == true
config.notifyNip == true
test "Save and load config":
let tempConfig = getTempDir() / "test-update-config.json"
var config = UpdateConfig()
config.enabled = false
config.channel = Beta
config.frequency = Daily
config.lastCheck = getTime()
config.notifyRecipes = false
config.notifyTools = true
config.notifyNip = false
saveConfig(config, tempConfig)
let loaded = loadConfig(tempConfig)
check:
loaded.enabled == false
loaded.channel == Beta
loaded.frequency == Daily
loaded.notifyRecipes == false
loaded.notifyTools == true
loaded.notifyNip == false
removeFile(tempConfig)
test "Config with partial fields":
let tempConfig = getTempDir() / "test-partial-update-config.json"
writeFile(tempConfig, """{"enabled": false, "channel": "nightly"}""")
let config = loadConfig(tempConfig)
check:
config.enabled == false
config.channel == Nightly
config.frequency == Weekly # default
removeFile(tempConfig)
suite "Update Checker":
setup:
var config = UpdateConfig()
config.enabled = true
config.channel = Stable
config.frequency = Weekly
config.lastCheck = fromUnix(0)
let checker = newUpdateChecker(config)
test "Create checker":
check:
checker != nil
checker.config.enabled == true
checker.config.channel == Stable
test "Should check - never checked":
check:
checker.shouldCheck() == true
test "Should check - daily frequency":
checker.config.frequency = Daily
checker.config.lastCheck = getTime() - initDuration(hours = 25)
check:
checker.shouldCheck() == true
test "Should not check - too soon":
checker.config.frequency = Daily
checker.config.lastCheck = getTime() - initDuration(hours = 12)
check:
checker.shouldCheck() == false
test "Should not check - disabled":
checker.config.enabled = false
check:
checker.shouldCheck() == false
test "Should not check - never frequency":
checker.config.frequency = Never
check:
checker.shouldCheck() == false
suite "Update Manager":
setup:
let tempDir = getTempDir() / "test-update-manager"
removeDir(tempDir)
createDir(tempDir)
let manager = newUpdateManager(verbose = false)
teardown:
removeDir(tempDir)
test "Create manager":
check:
manager != nil
dirExists(manager.backupDir)
test "Create backup - directory":
let testDir = tempDir / "test-component"
createDir(testDir)
writeFile(testDir / "file.txt", "test content")
let backupPath = manager.createBackup("test", testDir)
check:
backupPath.len > 0
dirExists(backupPath)
fileExists(backupPath / "file.txt")
test "Create backup - file":
let testFile = tempDir / "test-file.txt"
writeFile(testFile, "test content")
let backupPath = manager.createBackup("test", testFile)
check:
backupPath.len > 0
fileExists(backupPath)
test "Restore backup - directory":
let testDir = tempDir / "test-component"
createDir(testDir)
writeFile(testDir / "file.txt", "original")
let backupPath = manager.createBackup("test", testDir)
# Modify original
writeFile(testDir / "file.txt", "modified")
# Restore
let restored = manager.restoreBackup(backupPath, testDir)
check:
restored == true
readFile(testDir / "file.txt") == "original"
test "List backups":
# Create some test backups
let testFile1 = tempDir / "test1.txt"
writeFile(testFile1, "test1")
discard manager.createBackup("component1", testFile1)
let testFile2 = tempDir / "test2.txt"
writeFile(testFile2, "test2")
discard manager.createBackup("component2", testFile2)
let backups = manager.listBackups()
check:
backups.len >= 2
test "Clean old backups":
# Create old backup
let testFile = tempDir / "old-test.txt"
writeFile(testFile, "old")
let backupPath = manager.createBackup("old-component", testFile)
# Manually set old timestamp
setLastModificationTime(backupPath, getTime() - initDuration(days = 31))
# Clean backups older than 30 days
let removed = manager.cleanOldBackups(keepDays = 30)
check:
removed >= 1
suite "Update Frequency":
test "Daily frequency":
check:
$Daily == "daily"
test "Weekly frequency":
check:
$Weekly == "weekly"
test "Monthly frequency":
check:
$Monthly == "monthly"
test "Never frequency":
check:
$Never == "never"
suite "Update Channel":
test "Stable channel":
check:
$Stable == "stable"
test "Beta channel":
check:
$Beta == "beta"
test "Nightly channel":
check:
$Nightly == "nightly"
suite "Update Info":
test "Format update notification":
var info = UpdateInfo()
info.component = "recipes"
info.currentVersion = "abc123"
info.latestVersion = "def456"
info.updateAvailable = true
info.changelog = "- Added new recipes\n- Fixed bugs"
let notification = formatUpdateNotification(info)
check:
notification.contains("recipes")
notification.contains("abc123")
notification.contains("def456")
notification.toLower().contains("changelog")
echo "✅ All update tests completed"