package scanner import ( "os" "path/filepath" "testing" "time" "donniemarko/internal/note" ) func TestScanner_DetectsNewFile(t *testing.T) { tmpDir := t.TempDir() scanner := NewScanner(tmpDir) scanner.Scan() // Initial scan os.WriteFile(filepath.Join(tmpDir, "new.md"), []byte("# New"), 0644) changes, _ := scanner.Scan() if len(changes) != 1 || changes[0].Type != Created { t.Error("should detect new file") } } func TestScanner_DetectChanges(t *testing.T) { tmpDir := t.TempDir() filePath := filepath.Join(tmpDir, "test.md") // Initial state os.WriteFile(filePath, []byte("# Original"), 0644) scanner := NewScanner(tmpDir) changes, _ := scanner.Scan() originalModTime := changes[0].ModTime // Wait and modify time.Sleep(10 * time.Millisecond) os.WriteFile(filePath, []byte("# Modified"), 0644) changes, _ = scanner.Scan() newModTime := changes[0].ModTime if !newModTime.After(originalModTime) { t.Error("should detect file modification") } if changes[0].Type != Modified { t.Errorf("Last state should be modified, got '%v'\n", changes[0].Type) } newPath := filepath.Join(tmpDir, "test_renamed.md") os.Rename(filePath, newPath) changes, _ = scanner.Scan() if changes[0].Path != newPath { t.Errorf("Should find renamed file '%s'. Got '%s'\n", newPath, changes[0].Path) } } func TestScanner_SeedExisting_PrunesMissing(t *testing.T) { tmpDir := t.TempDir() sc := NewScanner(tmpDir) n := note.NewNote() n.Path = "missing.md" n.UpdatedAt = time.Now() sc.SeedExisting([]*note.Note{n}) changes, err := sc.Scan() if err != nil { t.Fatalf("scan error: %v", err) } if len(changes) != 1 { t.Fatalf("expected 1 change, got %d", len(changes)) } if changes[0].Type != Deleted { t.Fatalf("expected Deleted change, got %v", changes[0].Type) } } func TestScanner_SeedExisting_KeepsExisting(t *testing.T) { tmpDir := t.TempDir() filePath := filepath.Join(tmpDir, "kept.md") os.WriteFile(filePath, []byte("# Kept"), 0644) sc := NewScanner(tmpDir) n := note.NewNote() n.Path = "kept.md" n.UpdatedAt = time.Now() sc.SeedExisting([]*note.Note{n}) changes, err := sc.Scan() if err != nil { t.Fatalf("scan error: %v", err) } if len(changes) != 0 { t.Fatalf("expected 0 changes, got %d", len(changes)) } }