package service import ( "encoding/json" "os" "path/filepath" "testing" ) func TestApplyMetadataPreservesEngagementAndPermissions(t *testing.T) { e := newExecEnv(t) existing := writeItem(t, e.cfg.LibraryDir, "existing", `name = "Old" video_id = "old" `, map[string]string{ "video.mp4": "dummy", "info.json": `{"id":"old","title":"Old","comments":[{"id":"c1","text":"archived"}],"heatmap":[{"start_time":0,"end_time":1,"value":1}],"filesize":123}`, }) source := filepath.Join(e.scratch, "refreshed.info.json") if err := os.WriteFile(source, []byte(`{"id":"new","title":"New","description":"updated","comments":[]}`), 0o644); err != nil { t.Fatal(err) } if err := e.svc.applyMetadata(existing, infoJSON{ID: "new", Title: "New", Description: "updated"}, source); err != nil { t.Fatalf("applyMetadata: %v", err) } data, err := os.ReadFile(filepath.Join(existing, "info.json")) if err != nil { t.Fatal(err) } var got map[string]json.RawMessage if err := json.Unmarshal(data, &got); err != nil { t.Fatalf("parse installed info JSON: %v", err) } if _, ok := got["comments"]; !ok { t.Fatal("refreshed sidecar lost archived comments") } if _, ok := got["heatmap"]; !ok { t.Fatal("refreshed sidecar lost archived heatmap") } if string(got["title"]) != `"New"` { t.Errorf("title = %s, want New", got["title"]) } if mode := fileMode(t, filepath.Join(existing, "info.json")); mode != 0o644 { t.Errorf("info.json mode = %o, want 0644", mode) } } func TestApplyMetadataRollsBackMarkerWhenSidecarInstallFails(t *testing.T) { e := newExecEnv(t) existing := writeItem(t, e.cfg.LibraryDir, "rollback", `name = "Old" video_id = "old" `, map[string]string{"video.mp4": "dummy"}) markerPath := filepath.Join(existing, itemMarkerName) before, err := os.ReadFile(markerPath) if err != nil { t.Fatal(err) } // A directory at the destination makes the final rename fail after the // marker has been written, exercising the rollback path. infoPath := filepath.Join(existing, "info.json") if err := os.Mkdir(infoPath, 0o755); err != nil { t.Fatal(err) } source := filepath.Join(e.scratch, "rollback.info.json") if err := os.WriteFile(source, []byte(`{"id":"new","title":"New"}`), 0o644); err != nil { t.Fatal(err) } if err := e.svc.applyMetadata(existing, infoJSON{ID: "new", Title: "New"}, source); err == nil { t.Fatal("expected sidecar installation to fail") } after, err := os.ReadFile(markerPath) if err != nil { t.Fatal(err) } if string(after) != string(before) { t.Errorf("marker changed after failed sidecar install:\nbefore: %s\nafter: %s", before, after) } } func fileMode(t *testing.T, path string) os.FileMode { t.Helper() info, err := os.Stat(path) if err != nil { t.Fatal(err) } return info.Mode().Perm() }