230 lines
5.7 KiB
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"
|