Files
ss/internal/model/subscription_test.go

168 lines
4.8 KiB
Go

package model
import (
"reflect"
"testing"
)
func newTestData(names ...string) *SubscriptionsData {
d := NewSubscriptionsData()
for _, n := range names {
d.AddSubscription(n, "http://example.com/"+n)
}
return d
}
func TestOrderedNames_FollowsAdditionOrder(t *testing.T) {
d := newTestData("c", "a", "b")
want := []string{"c", "a", "b"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestOrderedNames_MissingFromOrderAppendedAlphabetically(t *testing.T) {
d := newTestData("b", "a")
// Simulate a subscriptions.yaml predating the Order field, or a
// subscription added by some other path that didn't touch Order.
d.Order = nil
d.Subscriptions["z"] = NewSubscription("z", "http://example.com/z")
got := d.OrderedNames()
want := []string{"a", "b", "z"}
if !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestOrderedNames_StaleOrderEntryIgnored(t *testing.T) {
d := newTestData("a", "b")
d.Order = []string{"a", "removed", "b"}
got := d.OrderedNames()
want := []string{"a", "b"}
if !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestMoveSubscription_Before(t *testing.T) {
d := newTestData("a", "b", "c")
if !d.MoveSubscription("c", "a", true) {
t.Fatal("MoveSubscription() = false, want true")
}
want := []string{"c", "a", "b"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestMoveSubscription_After(t *testing.T) {
d := newTestData("a", "b", "c")
if !d.MoveSubscription("a", "b", false) {
t.Fatal("MoveSubscription() = false, want true")
}
want := []string{"b", "a", "c"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestMoveSubscription_AfterLast(t *testing.T) {
d := newTestData("a", "b", "c")
if !d.MoveSubscription("a", "c", false) {
t.Fatal("MoveSubscription() = false, want true")
}
want := []string{"b", "c", "a"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestMoveSubscription_BeforeFirst(t *testing.T) {
d := newTestData("a", "b", "c")
if !d.MoveSubscription("c", "a", true) {
t.Fatal("MoveSubscription() = false, want true")
}
want := []string{"c", "a", "b"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestMoveSubscription_NoOpWhenSameName(t *testing.T) {
d := newTestData("a", "b")
if d.MoveSubscription("a", "a", true) {
t.Fatal("MoveSubscription(a, a) = true, want false")
}
}
func TestMoveSubscription_UnknownName(t *testing.T) {
d := newTestData("a", "b")
if d.MoveSubscription("nope", "a", true) {
t.Fatal("MoveSubscription() = true, want false for unknown name")
}
}
func TestMoveSubscription_UnknownTarget(t *testing.T) {
d := newTestData("a", "b")
if d.MoveSubscription("a", "nope", true) {
t.Fatal("MoveSubscription() = true, want false for unknown target")
}
}
func TestMoveSubscription_MaterializesFullOrderFromLegacyData(t *testing.T) {
// A subscriptions.yaml predating the Order field: Subscriptions
// populated directly, Order left nil, as if freshly loaded from an old
// file.
d := &SubscriptionsData{Subscriptions: map[string]*Subscription{
"a": NewSubscription("a", "http://example.com/a"),
"b": NewSubscription("b", "http://example.com/b"),
"c": NewSubscription("c", "http://example.com/c"),
}}
if !d.MoveSubscription("c", "a", true) {
t.Fatal("MoveSubscription() = false, want true")
}
// Legacy fallback order is alphabetical (a, b, c); moving c before a
// should yield c, a, b.
want := []string{"c", "a", "b"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestRenameSubscription_PreservesPosition(t *testing.T) {
d := newTestData("a", "b", "c")
if !d.RenameSubscription("b", "bee") {
t.Fatal("RenameSubscription() = false")
}
want := []string{"a", "bee", "c"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestRemoveSubscription_RemovesFromOrder(t *testing.T) {
d := newTestData("a", "b", "c")
if !d.RemoveSubscription("b") {
t.Fatal("RemoveSubscription() = false")
}
want := []string{"a", "c"}
if got := d.OrderedNames(); !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
}
func TestGetActiveSubscriptions_RespectsOrder(t *testing.T) {
d := newTestData("a", "b", "c")
d.SetInactive("a") // AddSubscription auto-activates the first one added
d.SetActive("b")
d.SetActive("c")
d.MoveSubscription("c", "a", true)
actives := d.GetActiveSubscriptions()
if len(actives) != 2 || actives[0].Name != "c" || actives[1].Name != "b" {
t.Fatalf("unexpected order: %#v", actives)
}
}