Files
HostKeeper/test/storage/export_import_test.go
swanadiva 30b57f6084 feat: implement export and import commands
- Add export command with JSON file output and size summary
- Add import command with replace/merge strategies and dry-run preview
- Add integration test for export/import round-trip via storage layer
- Update project state documentation
2026-06-23 13:58:51 +07:00

84 lines
2.0 KiB
Go

package storage_test
import (
"context"
"encoding/json"
"testing"
"time"
"git.tukangketik.id/swanadiva/hostkeeper/internal/models"
"git.tukangketik.id/swanadiva/hostkeeper/pkg/storage"
)
func TestExportImport(t *testing.T) {
tempDir := t.TempDir()
store, err := storage.NewJSONStorage(tempDir)
if err != nil {
t.Fatalf("Failed to create storage: %v", err)
}
ctx := context.Background()
testHost := &models.Host{
ID: "test-host-1",
Name: "Test Server",
Hostname: "192.168.1.100",
Port: 22,
Username: "admin",
Auth: models.AuthConfig{Type: "password"},
CreatedAt: time.Now(),
}
if err := store.SaveHost(ctx, testHost); err != nil {
t.Fatalf("Failed to save host: %v", err)
}
exportedData, err := store.ExportData(ctx)
if err != nil {
t.Fatalf("Failed to export data: %v", err)
}
if exportedData == nil {
t.Fatal("Exported data is nil")
}
if len(exportedData.Hosts) != 1 {
t.Fatalf("Expected 1 host, got %d", len(exportedData.Hosts))
}
// Simulate writing to file and reading back
jsonBytes, err := json.Marshal(exportedData)
if err != nil {
t.Fatalf("Failed to marshal export data: %v", err)
}
var importedData storage.ExportData
if err := json.Unmarshal(jsonBytes, &importedData); err != nil {
t.Fatalf("Failed to unmarshal export data: %v", err)
}
importDir := t.TempDir()
importStore, err := storage.NewJSONStorage(importDir)
if err != nil {
t.Fatalf("Failed to create import storage: %v", err)
}
if err := importStore.ImportData(ctx, &importedData, storage.MergeStrategyReplace); err != nil {
t.Fatalf("Failed to import data: %v", err)
}
importedHosts, err := importStore.ListHosts(ctx)
if err != nil {
t.Fatalf("Failed to list imported hosts: %v", err)
}
if len(importedHosts) != 1 {
t.Errorf("Expected 1 imported host, got %d", len(importedHosts))
}
if importedHosts[0].Name != testHost.Name {
t.Errorf("Expected host name '%s', got '%s'", testHost.Name, importedHosts[0].Name)
}
}