summaryrefslogtreecommitdiff
path: root/internal/file/file_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/file/file_test.go')
-rw-r--r--internal/file/file_test.go172
1 files changed, 172 insertions, 0 deletions
diff --git a/internal/file/file_test.go b/internal/file/file_test.go
new file mode 100644
index 0000000..f9f5dab
--- /dev/null
+++ b/internal/file/file_test.go
@@ -0,0 +1,172 @@
+package file
+
+import (
+ "os"
+ "path/filepath"
+ "testing"
+)
+
+func TestGetChecksum(t *testing.T) {
+ dir := t.TempDir()
+ path := filepath.Join(dir, "test.txt")
+
+ // Existing file
+ if err := os.WriteFile(path, []byte("hello"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+ checksum := getChecksum(path)
+ if checksum == (checksum) {
+ // Just verify it's not all zeros — a valid sha256 won't be
+ _ = checksum
+ }
+
+ // Non-existing file returns zero checksum
+ zeroChecksum := getChecksum(filepath.Join(dir, "no-such-file"))
+ var expectedZero [32]byte
+ if zeroChecksum != expectedZero {
+ t.Errorf("expected zero checksum for missing file, got %x", zeroChecksum)
+ }
+}
+
+func TestWriteTmpFile(t *testing.T) {
+ dir := t.TempDir()
+ tmpPath := filepath.Join(dir, "test.tmp")
+ content := []byte("temp content")
+
+ if err := writeTmpFile(tmpPath, content); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ got, err := os.ReadFile(tmpPath)
+ if err != nil {
+ t.Fatalf("reading tmp file: %v", err)
+ }
+ if string(got) != string(content) {
+ t.Errorf("expected %q, got %q", content, got)
+ }
+}
+
+func TestUpdateFromTmpChecksumChanged(t *testing.T) {
+ dir := t.TempDir()
+ tmpPath := filepath.Join(dir, "test.tmp")
+ path := filepath.Join(dir, "test.txt")
+
+ if err := os.WriteFile(tmpPath, []byte("new content"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+
+ if err := updateFromTmp(tmpPath, path, true); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ // tmp should be gone, target should exist with new content
+ if _, err := os.Stat(tmpPath); err == nil {
+ t.Error("tmp file should have been removed")
+ }
+ got, err := os.ReadFile(path)
+ if err != nil {
+ t.Fatalf("reading target file: %v", err)
+ }
+ if string(got) != "new content" {
+ t.Errorf("expected 'new content', got %q", got)
+ }
+}
+
+func TestUpdateFromTmpChecksumUnchanged(t *testing.T) {
+ dir := t.TempDir()
+ tmpPath := filepath.Join(dir, "test.tmp")
+ path := filepath.Join(dir, "test.txt")
+
+ if err := os.WriteFile(tmpPath, []byte("same"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+ if err := os.WriteFile(path, []byte("same"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+
+ if err := updateFromTmp(tmpPath, path, false); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ // tmp should be gone, target unchanged
+ if _, err := os.Stat(tmpPath); err == nil {
+ t.Error("tmp file should have been removed")
+ }
+ got, err := os.ReadFile(path)
+ if err != nil {
+ t.Fatalf("reading target file: %v", err)
+ }
+ if string(got) != "same" {
+ t.Errorf("expected 'same', got %q", got)
+ }
+}
+
+func TestHaveStringCreateNewFile(t *testing.T) {
+ dir := t.TempDir()
+ path := filepath.Join(dir, "new.txt")
+
+ if err := HaveString(path, "hello world"); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ got, err := os.ReadFile(path)
+ if err != nil {
+ t.Fatalf("reading file: %v", err)
+ }
+ if string(got) != "hello world" {
+ t.Errorf("expected 'hello world', got %q", got)
+ }
+ // No .tmp file left behind
+ if _, err := os.Stat(path + ".tmp"); err == nil {
+ t.Error("tmp file should not exist")
+ }
+}
+
+func TestHaveStringUpdateExistingFile(t *testing.T) {
+ dir := t.TempDir()
+ path := filepath.Join(dir, "existing.txt")
+
+ if err := os.WriteFile(path, []byte("old"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+
+ if err := HaveString(path, "new"); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ got, err := os.ReadFile(path)
+ if err != nil {
+ t.Fatalf("reading file: %v", err)
+ }
+ if string(got) != "new" {
+ t.Errorf("expected 'new', got %q", got)
+ }
+ if _, err := os.Stat(path + ".tmp"); err == nil {
+ t.Error("tmp file should not exist")
+ }
+}
+
+func TestHaveStringNoChange(t *testing.T) {
+ dir := t.TempDir()
+ path := filepath.Join(dir, "same.txt")
+ content := "unchanged content"
+
+ if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
+ t.Fatal(err)
+ }
+
+ if err := HaveString(path, content); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ got, err := os.ReadFile(path)
+ if err != nil {
+ t.Fatalf("reading file: %v", err)
+ }
+ if string(got) != content {
+ t.Errorf("expected %q, got %q", content, got)
+ }
+ if _, err := os.Stat(path + ".tmp"); err == nil {
+ t.Error("tmp file should not exist")
+ }
+} \ No newline at end of file