package vault import "testing" func TestUpsertEntryPreservesPreviousVersionInHistory(t *testing.T) { t.Parallel() model := Model{ Entries: []Entry{ { ID: "git-server", Title: "Git Server", Username: "joejulian", Password: "old-token", URL: "https://git.julianfamily.org", Notes: "Original note", Path: []string{"Root", "Internet"}, }, }, } model.UpsertEntry(Entry{ ID: "git-server", Title: "Git Server", Username: "joejulian", Password: "new-token", URL: "https://git.julianfamily.org", Notes: "Updated note", Path: []string{"Root", "Internet"}, }) got := model.EntriesInPath([]string{"Root", "Internet"}) if len(got) != 1 { t.Fatalf("len(EntriesInPath()) = %d, want 1", len(got)) } if got[0].Password != "new-token" { t.Fatalf("Entry.Password = %q, want %q", got[0].Password, "new-token") } if len(got[0].History) != 1 { t.Fatalf("len(Entry.History) = %d, want 1", len(got[0].History)) } if got[0].History[0].Password != "old-token" || got[0].History[0].Notes != "Original note" { t.Fatalf("Entry.History[0] = %#v, want prior entry version", got[0].History[0]) } } func TestDeleteEntryMovesItToRecycleBin(t *testing.T) { t.Parallel() model := Model{ Entries: []Entry{ { ID: "ha-codex", Title: "Home Assistant (Codex)", Username: "codex", Password: "token-2", URL: "https://lights.julianfamily.org", Path: []string{"Root", "Home Assistant"}, }, }, } if err := model.DeleteEntry("ha-codex"); err != nil { t.Fatalf("DeleteEntry() error = %v", err) } if got := model.EntriesInPath([]string{"Root", "Home Assistant"}); len(got) != 0 { t.Fatalf("EntriesInPath() = %#v, want empty after delete", got) } if len(model.RecycleBin) != 1 { t.Fatalf("len(RecycleBin) = %d, want 1", len(model.RecycleBin)) } if model.RecycleBin[0].Title != "Home Assistant (Codex)" { t.Fatalf("RecycleBin[0].Title = %q, want %q", model.RecycleBin[0].Title, "Home Assistant (Codex)") } } func TestRestoreEntryMovesItBackFromRecycleBin(t *testing.T) { t.Parallel() model := Model{ RecycleBin: []Entry{ { ID: "dynadot", Title: "Dynadot", Username: "jjulian", Password: "token-3", URL: "https://www.dynadot.com", Path: []string{"Root", "Internet"}, }, }, } if err := model.RestoreEntry("dynadot"); err != nil { t.Fatalf("RestoreEntry() error = %v", err) } got := model.EntriesInPath([]string{"Root", "Internet"}) if len(got) != 1 { t.Fatalf("len(EntriesInPath()) = %d, want 1", len(got)) } if got[0].Title != "Dynadot" { t.Fatalf("EntriesInPath()[0].Title = %q, want %q", got[0].Title, "Dynadot") } if len(model.RecycleBin) != 0 { t.Fatalf("len(RecycleBin) = %d, want 0", len(model.RecycleBin)) } } func TestRestoreEntryVersionPromotesHistoricalVersionAndRetainsCurrentInHistory(t *testing.T) { t.Parallel() model := Model{ Entries: []Entry{ { ID: "git-server", Title: "Git Server", Username: "joejulian", Password: "new-token", Notes: "Current note", Path: []string{"Root", "Internet"}, History: []Entry{ { ID: "git-server-history-1", Title: "Git Server", Username: "joejulian", Password: "old-token", Notes: "Previous note", Path: []string{"Root", "Internet"}, }, }, }, }, } if err := model.RestoreEntryVersion("git-server", 0); err != nil { t.Fatalf("RestoreEntryVersion() error = %v", err) } got := model.EntriesInPath([]string{"Root", "Internet"}) if len(got) != 1 { t.Fatalf("len(EntriesInPath()) = %d, want 1", len(got)) } if got[0].Password != "old-token" || got[0].Notes != "Previous note" { t.Fatalf("restored entry = %#v, want old-token/Previous note current version", got[0]) } if len(got[0].History) != 1 { t.Fatalf("len(History) = %d, want 1", len(got[0].History)) } if got[0].History[0].Password != "new-token" || got[0].History[0].Notes != "Current note" { t.Fatalf("History[0] = %#v, want prior current version retained", got[0].History[0]) } }