package slack_test import ( "context" "testing" "atlas9.dev/c/core" "atlas9.dev/c/core/assert" "atlas9.dev/c/demo/lib/slack" ) // fakeStore returns a fixed set of endpoints for ListActiveForEvent; the other // Store methods are unused by Fanout and panic if called. type fakeStore struct { eps []slack.Endpoint } func (f fakeStore) ListActiveForEvent(ctx context.Context, tenant core.ID, eventType string) ([]slack.Endpoint, error) { return f.eps, nil } func (fakeStore) CreateEndpoint(context.Context, *slack.Endpoint) error { panic("unused") } func (fakeStore) UpdateEndpoint(context.Context, *slack.Endpoint) error { panic("unused") } func (fakeStore) GetEndpoint(context.Context, core.ID, core.ID, *slack.Endpoint) error { panic("unused") } func (fakeStore) ListEndpoints(context.Context, core.ID, core.PageReq, *core.Page[slack.Endpoint]) error { panic("unused") } func (fakeStore) DeleteEndpoint(context.Context, core.ID, core.ID) error { panic("unused") } type fakeQueue struct { deliveries []slack.Delivery } func (q *fakeQueue) Create(ctx context.Context, d slack.Delivery) error { q.deliveries = append(q.deliveries, d) return nil } func TestFanout_Emit_WrapsTextAndEnqueuesPerEndpoint(t *testing.T) { tenant := core.NewID("t") eps := []slack.Endpoint{ {ID: core.NewID("slk"), Tenant: tenant, Name: "a"}, {ID: core.NewID("slk"), Tenant: tenant, Name: "b"}, } q := &fakeQueue{} f := slack.Fanout{Endpoints: fakeStore{eps: eps}, Deliveries: q} err := f.Emit(context.Background(), tenant, "Todos_ItemCreated", slack.Message{Text: "hello world"}) assert.Ok(t, err) // One delivery per subscribed endpoint, each carrying the Slack envelope. assert.Eq(t, len(q.deliveries), 2) assert.Eq(t, string(q.deliveries[0].Body), `{"text":"hello world"}`) assert.Eq(t, q.deliveries[0].Endpoint, eps[0].ID) assert.Eq(t, q.deliveries[1].Endpoint, eps[1].ID) assert.Eq(t, q.deliveries[0].Type, "Todos_ItemCreated") } // With no subscribers there is nothing to marshal or enqueue. func TestFanout_Emit_NoSubscribers(t *testing.T) { q := &fakeQueue{} f := slack.Fanout{Endpoints: fakeStore{eps: nil}, Deliveries: q} err := f.Emit(context.Background(), core.NewID("t"), "Todos_ItemCreated", slack.Message{Text: "hello"}) assert.Ok(t, err) assert.Eq(t, len(q.deliveries), 0) }