package subdisc import ( "os" "path/filepath" "testing" ) func TestRoundTrip(t *testing.T) { path := filepath.Join(t.TempDir(), "sub.json") s, _ := Open(path) err := s.Add(Entry{ SubChannelID: "ch1", HostAgentID: "alice", HostUserID: "uA", GuestUserIDs: []string{"uB"}, CallbackGuildNodeID: "g1", CallbackChannelID: "pCh", }) if err != nil { t.Fatal(err) } s2, _ := Open(path) e := s2.Lookup("ch1") if e == nil || e.HostAgentID != "alice" || e.CallbackChannelID != "pCh" { t.Errorf("entry = %+v", e) } if e.CreatedAt == "" { t.Errorf("CreatedAt should be auto-set") } } func TestLookupForHost(t *testing.T) { s, _ := Open(filepath.Join(t.TempDir(), "x.json")) s.Add(Entry{SubChannelID: "c", HostAgentID: "alice"}) if s.LookupForHost("c", "alice") == nil { t.Errorf("alice should match") } if s.LookupForHost("c", "bob") != nil { t.Errorf("bob should NOT match") } if s.LookupForHost("missing", "alice") != nil { t.Errorf("missing channel should return nil") } } func TestRemove(t *testing.T) { s, _ := Open(filepath.Join(t.TempDir(), "x.json")) s.Add(Entry{SubChannelID: "c"}) if !s.Remove("c") { t.Errorf("Remove existing should return true") } if s.Remove("c") { t.Errorf("Remove missing should return false") } } func TestAllReturnsCopy(t *testing.T) { s, _ := Open(filepath.Join(t.TempDir(), "x.json")) s.Add(Entry{SubChannelID: "a", HostAgentID: "alice"}) s.Add(Entry{SubChannelID: "b", HostAgentID: "bob"}) all := s.All() if len(all) != 2 { t.Errorf("len = %d", len(all)) } } func TestOpenCorruptStartsEmpty(t *testing.T) { path := filepath.Join(t.TempDir(), "corrupt.json") os.WriteFile(path, []byte("not json"), 0o600) s, err := Open(path) if err != nil { t.Errorf("Open corrupt should tolerate: %v", err) } if len(s.All()) != 0 { t.Errorf("corrupt should start empty") } }