Release: v0.1.0-alpha
Release Docker Image / Build & Push Docker Image (release) Failing after 1m30s
Release Docker Image / Build & Push Docker Image (release) Failing after 1m30s
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
// 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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user