Files
keywarden/internal/database/backup_test.go
T
scriptos fd13e67aef
Release Docker Image / Build & Push Docker Image (release) Failing after 1m30s
Release: v0.1.0-alpha
2026-04-05 16:56:16 +02:00

102 lines
2.8 KiB
Go

// Keywarden - Centralized SSH Key Management and Deployment
// Copyright (C) 2026 Patrick Asmus (scriptos)
// SPDX-License-Identifier: AGPL-3.0-or-later
package database
import (
"encoding/json"
"testing"
)
func TestEncryptDecryptBackup(t *testing.T) {
password := "TestP@ssw0rd123!"
original := &BackupData{
Version: "1",
CreatedAt: "2026-04-05T12:00:00Z",
Users: []map[string]interface{}{
{"id": float64(1), "username": "admin", "email": "admin@test.local"},
},
SSHKeys: []map[string]interface{}{},
Servers: []map[string]interface{}{},
ServerGroups: []map[string]interface{}{},
GroupMembers: []map[string]interface{}{},
}
jsonData, err := json.Marshal(original)
if err != nil {
t.Fatalf("Failed to marshal: %v", err)
}
encrypted, err := EncryptBackup(jsonData, password)
if err != nil {
t.Fatalf("Failed to encrypt: %v", err)
}
// Check magic header
if string(encrypted[:6]) != "KWBAK1" {
t.Error("Missing KWBAK1 magic header")
}
// Decrypt with correct password
decrypted, err := DecryptBackup(encrypted, password)
if err != nil {
t.Fatalf("Failed to decrypt: %v", err)
}
// Verify content matches
var restored BackupData
if err := json.Unmarshal(decrypted, &restored); err != nil {
t.Fatalf("Failed to unmarshal decrypted data: %v", err)
}
if restored.Version != original.Version {
t.Errorf("Version mismatch: got %s, want %s", restored.Version, original.Version)
}
if len(restored.Users) != 1 {
t.Errorf("Expected 1 user, got %d", len(restored.Users))
}
// Wrong password should fail
_, err = DecryptBackup(encrypted, "wrong-password")
if err == nil {
t.Error("Expected error with wrong password, got nil")
}
}
func TestDecryptBackupInvalidFile(t *testing.T) {
_, err := DecryptBackup([]byte("invalid data"), "password")
if err == nil {
t.Error("Expected error for invalid file, got nil")
}
_, err = DecryptBackup([]byte("short"), "password")
if err == nil {
t.Error("Expected error for too-short data, got nil")
}
}
func TestParseBackupJSON(t *testing.T) {
valid := `{"version":"1","created_at":"2026-04-05T12:00:00Z","users":[],"ssh_keys":[],"servers":[],"server_groups":[],"server_group_members":[],"key_deployments":[],"audit_log":[],"settings":[],"access_assignments":[],"cron_jobs":[]}`
backup, err := ParseBackupJSON([]byte(valid))
if err != nil {
t.Fatalf("Failed to parse valid JSON: %v", err)
}
if backup.Version != "1" {
t.Errorf("Version mismatch: got %s, want 1", backup.Version)
}
// Missing version
invalid := `{"created_at":"2026-04-05T12:00:00Z"}`
_, err = ParseBackupJSON([]byte(invalid))
if err == nil {
t.Error("Expected error for missing version, got nil")
}
// Invalid JSON
_, err = ParseBackupJSON([]byte("not json"))
if err == nil {
t.Error("Expected error for invalid JSON, got nil")
}
}