Files
guestbook/broker_test.go
Akili 3a68f64eb6 feat: add emoji reactions, light/dark themes and rollout observability
Add a set of guest-facing and operator-facing features that make the
deployment-strategy demos (recreate, rolling, canary) more visual:

- Emoji reactions (heart/tada/thumbsup/smile): visitors react without an
  account, a first-party cookie keeps counts honest, the tally streams
  live to every tab over SSE. Backed by a new reactions table with an
  idempotent upsert; whitelisted emoji so the endpoint can't be abused.
- Light & dark themes: the wall follows the OS preference, visitors can
  toggle it (persisted locally), and a moderator can force a theme for
  everyone from the admin console, pushed live over SSE.
- Per-replica request counter: a middleware tallies requests answered by
  each replica; surfaced in /healthz, /api/info and the admin replica
  table. Under load-balancing the counts diverge, and a rolling update
  resets them one container at a time — the rollout made visible.
- Rolling-update wave in the Chaos lab: bounces replicas one at a time
  (via the crash endpoint) while polling the replica table, so a training
  session can watch each replica reset and rejoin — what a rolling update
  looks like from the inside.
- Admin console: reactions tile, per-replica Requests column, reaction
  tallies in moderation, and a wall-theme setting.
- Favicon + /favicon.ico redirect.

Tests cover reactions (idempotency, tallies, whitelist) and the theme
setting round-trip.

Akili-Task: tsk_xgg6sfuzkzymyc6gstr4
Akili-Agent: goldfish
2026-10-05 21:36:23 +02:00

34 lines
714 B
Go

package main
import (
"testing"
"time"
)
func TestLocalBroker(t *testing.T) {
b := NewBroker("host-a", "1.0.0", nil)
ch := b.Subscribe()
defer b.Unsubscribe(ch)
if ev := <-ch; ev.Type != "presence" || ev.Online != 1 {
t.Fatalf("want presence=1 on subscribe, got %+v", ev)
}
b.Publish(Event{Type: "deleted", ID: 7})
select {
case ev := <-ch:
if ev.Type != "deleted" || ev.ID != 7 {
t.Fatalf("unexpected event %+v", ev)
}
case <-time.After(time.Second):
t.Fatal("published event not delivered")
}
if r := b.Replicas(); len(r) != 1 || r[0].Host != "host-a" || r[0].Online != 1 {
t.Fatalf("unexpected replicas %+v", r)
}
if b.Mode() != "local" {
t.Fatalf("mode = %s", b.Mode())
}
}