From 9027ab359b89d0522d11f5c608ddf6b00820e036 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Tue, 2 Dec 2025 02:34:20 +0000 Subject: [PATCH] test: Add StageFile transaction tests Cover success path, already committed error, replacing existing staged file, and empty basename edge case. --- internal/config/import_transaction_test.go | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/internal/config/import_transaction_test.go b/internal/config/import_transaction_test.go index 80306b9..7a43bb6 100644 --- a/internal/config/import_transaction_test.go +++ b/internal/config/import_transaction_test.go @@ -665,3 +665,97 @@ func TestImportTransaction_CommitRestoreOnFailure(t *testing.T) { } }) } + +func TestStageFile_Success(t *testing.T) { + tmpDir := t.TempDir() + tx, err := newImportTransaction(tmpDir) + if err != nil { + t.Fatalf("newImportTransaction: %v", err) + } + defer tx.Cleanup() + + target := filepath.Join(tmpDir, "test.txt") + data := []byte("test content") + + err = tx.StageFile(target, data, 0600) + if err != nil { + t.Fatalf("StageFile: %v", err) + } + + // Verify file was staged + if _, ok := tx.staged[target]; !ok { + t.Error("target should be in staged map") + } +} + +func TestStageFile_AlreadyCommitted(t *testing.T) { + tmpDir := t.TempDir() + tx, err := newImportTransaction(tmpDir) + if err != nil { + t.Fatalf("newImportTransaction: %v", err) + } + defer tx.Cleanup() + + // Mark as committed + tx.committed = true + + target := filepath.Join(tmpDir, "test.txt") + err = tx.StageFile(target, []byte("data"), 0600) + if err == nil { + t.Error("expected error for already committed transaction") + } + if err != nil && err.Error() != "transaction already committed" { + t.Errorf("expected 'transaction already committed' error, got: %v", err) + } +} + +func TestStageFile_ReplacesExistingStaged(t *testing.T) { + tmpDir := t.TempDir() + tx, err := newImportTransaction(tmpDir) + if err != nil { + t.Fatalf("newImportTransaction: %v", err) + } + defer tx.Cleanup() + + target := filepath.Join(tmpDir, "test.txt") + + // Stage first version + err = tx.StageFile(target, []byte("first"), 0600) + if err != nil { + t.Fatalf("first StageFile: %v", err) + } + firstStaged := tx.staged[target] + + // Stage second version (should replace) + err = tx.StageFile(target, []byte("second"), 0600) + if err != nil { + t.Fatalf("second StageFile: %v", err) + } + secondStaged := tx.staged[target] + + // Verify different file was staged + if firstStaged == secondStaged { + t.Error("second staging should create new file") + } + + // Verify first staged file was removed + if _, err := os.Stat(firstStaged); !os.IsNotExist(err) { + t.Error("first staged file should have been removed") + } +} + +func TestStageFile_EmptyBasename(t *testing.T) { + tmpDir := t.TempDir() + tx, err := newImportTransaction(tmpDir) + if err != nil { + t.Fatalf("newImportTransaction: %v", err) + } + defer tx.Cleanup() + + // Target with trailing slash gets empty basename + target := tmpDir + string(os.PathSeparator) + err = tx.StageFile(target, []byte("data"), 0600) + if err != nil { + t.Fatalf("StageFile with empty basename: %v", err) + } +}