This commit introduces test cases for the API, archive, store, and filesystem functionalities, as well as a functional test for a full workflow. It ensures robust testing for snapshot operations, archiving, and blob management, significantly improving reliability.
237 lines
7.2 KiB
Go
237 lines
7.2 KiB
Go
package archive
|
|
|
|
import (
|
|
"bytes"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestCreateArchive(t *testing.T) {
|
|
// Create a temporary directory for tests
|
|
tempDir, err := os.MkdirTemp("", "agate-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp directory: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir) // Clean up after test
|
|
|
|
// Create a source directory with some files
|
|
sourceDir := filepath.Join(tempDir, "source")
|
|
if err := os.MkdirAll(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source directory: %v", err)
|
|
}
|
|
|
|
// Create a subdirectory
|
|
subDir := filepath.Join(sourceDir, "subdir")
|
|
if err := os.MkdirAll(subDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create subdirectory: %v", err)
|
|
}
|
|
|
|
// Create some test files
|
|
testFiles := map[string]string{
|
|
filepath.Join(sourceDir, "file1.txt"): "This is file 1",
|
|
filepath.Join(sourceDir, "file2.txt"): "This is file 2",
|
|
filepath.Join(subDir, "subfile1.txt"): "This is subfile 1",
|
|
filepath.Join(subDir, "subfile2.txt"): "This is subfile 2",
|
|
}
|
|
|
|
for path, content := range testFiles {
|
|
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
|
|
t.Fatalf("Failed to create test file %s: %v", path, err)
|
|
}
|
|
}
|
|
|
|
// Create the archive
|
|
archivePath := filepath.Join(tempDir, "archive.zip")
|
|
err = CreateArchive(sourceDir, archivePath)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create archive: %v", err)
|
|
}
|
|
|
|
// Check that the archive file was created
|
|
if _, err := os.Stat(archivePath); os.IsNotExist(err) {
|
|
t.Fatalf("Archive file was not created")
|
|
}
|
|
|
|
// Test creating archive with non-existent source directory
|
|
err = CreateArchive(filepath.Join(tempDir, "nonexistent"), archivePath)
|
|
if err == nil {
|
|
t.Fatalf("Expected error when creating archive from non-existent directory, got nil")
|
|
}
|
|
|
|
// Test creating archive with a file as source
|
|
fileSourcePath := filepath.Join(tempDir, "file_source.txt")
|
|
if err := os.WriteFile(fileSourcePath, []byte("This is a file"), 0644); err != nil {
|
|
t.Fatalf("Failed to create test file: %v", err)
|
|
}
|
|
err = CreateArchive(fileSourcePath, archivePath)
|
|
if err == nil {
|
|
t.Fatalf("Expected error when creating archive from a file, got nil")
|
|
}
|
|
}
|
|
|
|
func TestListArchiveContents(t *testing.T) {
|
|
// Create a temporary directory for tests
|
|
tempDir, err := os.MkdirTemp("", "agate-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp directory: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir) // Clean up after test
|
|
|
|
// Create a source directory with some files
|
|
sourceDir := filepath.Join(tempDir, "source")
|
|
if err := os.MkdirAll(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source directory: %v", err)
|
|
}
|
|
|
|
// Create a subdirectory
|
|
subDir := filepath.Join(sourceDir, "subdir")
|
|
if err := os.MkdirAll(subDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create subdirectory: %v", err)
|
|
}
|
|
|
|
// Create some test files
|
|
testFiles := map[string]string{
|
|
filepath.Join(sourceDir, "file1.txt"): "This is file 1",
|
|
filepath.Join(sourceDir, "file2.txt"): "This is file 2",
|
|
filepath.Join(subDir, "subfile1.txt"): "This is subfile 1",
|
|
filepath.Join(subDir, "subfile2.txt"): "This is subfile 2",
|
|
}
|
|
|
|
for path, content := range testFiles {
|
|
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
|
|
t.Fatalf("Failed to create test file %s: %v", path, err)
|
|
}
|
|
}
|
|
|
|
// Create the archive
|
|
archivePath := filepath.Join(tempDir, "archive.zip")
|
|
err = CreateArchive(sourceDir, archivePath)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create archive: %v", err)
|
|
}
|
|
|
|
// List the archive contents
|
|
entries, err := ListArchiveContents(archivePath)
|
|
if err != nil {
|
|
t.Fatalf("Failed to list archive contents: %v", err)
|
|
}
|
|
|
|
// Check that all files and directories are listed
|
|
expectedEntries := map[string]bool{
|
|
"file1.txt": false,
|
|
"file2.txt": false,
|
|
"subdir/": true,
|
|
"subdir/subfile1.txt": false,
|
|
"subdir/subfile2.txt": false,
|
|
}
|
|
|
|
if len(entries) != len(expectedEntries) {
|
|
t.Errorf("Wrong number of entries: got %d, want %d", len(entries), len(expectedEntries))
|
|
}
|
|
|
|
for _, entry := range entries {
|
|
isDir, exists := expectedEntries[entry.Path]
|
|
if !exists {
|
|
t.Errorf("Unexpected entry in archive: %s", entry.Path)
|
|
continue
|
|
}
|
|
if entry.IsDir != isDir {
|
|
t.Errorf("Entry %s has wrong IsDir value: got %v, want %v", entry.Path, entry.IsDir, isDir)
|
|
}
|
|
}
|
|
|
|
// Test listing contents of non-existent archive
|
|
_, err = ListArchiveContents(filepath.Join(tempDir, "nonexistent.zip"))
|
|
if err == nil {
|
|
t.Fatalf("Expected error when listing contents of non-existent archive, got nil")
|
|
}
|
|
}
|
|
|
|
func TestExtractFileFromArchive(t *testing.T) {
|
|
// Create a temporary directory for tests
|
|
tempDir, err := os.MkdirTemp("", "agate-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp directory: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir) // Clean up after test
|
|
|
|
// Create a source directory with some files
|
|
sourceDir := filepath.Join(tempDir, "source")
|
|
if err := os.MkdirAll(sourceDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create source directory: %v", err)
|
|
}
|
|
|
|
// Create a subdirectory
|
|
subDir := filepath.Join(sourceDir, "subdir")
|
|
if err := os.MkdirAll(subDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create subdirectory: %v", err)
|
|
}
|
|
|
|
// Create some test files
|
|
testFiles := map[string]string{
|
|
filepath.Join(sourceDir, "file1.txt"): "This is file 1",
|
|
filepath.Join(sourceDir, "file2.txt"): "This is file 2",
|
|
filepath.Join(subDir, "subfile1.txt"): "This is subfile 1",
|
|
filepath.Join(subDir, "subfile2.txt"): "This is subfile 2",
|
|
}
|
|
|
|
for path, content := range testFiles {
|
|
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
|
|
t.Fatalf("Failed to create test file %s: %v", path, err)
|
|
}
|
|
}
|
|
|
|
// Create the archive
|
|
archivePath := filepath.Join(tempDir, "archive.zip")
|
|
err = CreateArchive(sourceDir, archivePath)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create archive: %v", err)
|
|
}
|
|
|
|
// Extract a file from the archive
|
|
var buf bytes.Buffer
|
|
err = ExtractFileFromArchive(archivePath, "file1.txt", &buf)
|
|
if err != nil {
|
|
t.Fatalf("Failed to extract file from archive: %v", err)
|
|
}
|
|
|
|
// Check that the extracted content matches the original
|
|
if buf.String() != "This is file 1" {
|
|
t.Errorf("Extracted content does not match: got %s, want %s", buf.String(), "This is file 1")
|
|
}
|
|
|
|
// Extract a file from a subdirectory
|
|
buf.Reset()
|
|
err = ExtractFileFromArchive(archivePath, "subdir/subfile1.txt", &buf)
|
|
if err != nil {
|
|
t.Fatalf("Failed to extract file from archive: %v", err)
|
|
}
|
|
|
|
// Check that the extracted content matches the original
|
|
if buf.String() != "This is subfile 1" {
|
|
t.Errorf("Extracted content does not match: got %s, want %s", buf.String(), "This is subfile 1")
|
|
}
|
|
|
|
// Try to extract a non-existent file
|
|
buf.Reset()
|
|
err = ExtractFileFromArchive(archivePath, "nonexistent.txt", &buf)
|
|
if err != ErrFileNotFoundInArchive {
|
|
t.Fatalf("Expected ErrFileNotFoundInArchive when extracting non-existent file, got: %v", err)
|
|
}
|
|
|
|
// Try to extract a directory
|
|
buf.Reset()
|
|
err = ExtractFileFromArchive(archivePath, "subdir/", &buf)
|
|
if err == nil {
|
|
t.Fatalf("Expected error when extracting a directory, got nil")
|
|
}
|
|
|
|
// Try to extract from a non-existent archive
|
|
buf.Reset()
|
|
err = ExtractFileFromArchive(filepath.Join(tempDir, "nonexistent.zip"), "file1.txt", &buf)
|
|
if err == nil {
|
|
t.Fatalf("Expected error when extracting from non-existent archive, got nil")
|
|
}
|
|
}
|