Files
kandev/apps/backend/internal/gateway/websocket/hub_lifecycle_test.go
T
Carlos Florêncio b9eb6ae058 refactor(web): remove legacy settings migration (#1704)
* refactor(web): remove legacy settings migration

* fix(web): hydrate portable settings from boot state

* fix(web): preserve sidebar sync contracts

* fix(web): retain portable settings filters

* fix(web): retry sidebar settings writes

* fix(web): retain sidebar boot settings

* fix(websocket): avoid shutdown teardown leaks

* fix(boot): normalize sidebar task preferences

* fix(settings): preserve saved views during hydration

* fix(jira): avoid duplicate saved-view syncs

* fix(jira): preserve saved views on fetch failure

* fix(jira): retry saved-view hydration failures

* refactor(jira): simplify hydration request cleanup

* fix(websocket): close late clients after hub shutdown
2026-07-16 00:06:41 +01:00

43 lines
863 B
Go

package websocket
import (
"context"
"testing"
"time"
)
func TestHub_ClientLifecycleCallsReturnAfterShutdown(t *testing.T) {
h := newTestHub(t)
ctx, cancel := context.WithCancel(context.Background())
hubDone := make(chan struct{})
go func() {
defer close(hubDone)
h.Run(ctx)
}()
cancel()
<-hubDone
for name, lifecycleCall := range map[string]func(*Client){
"register": h.Register,
"unregister": h.Unregister,
} {
t.Run(name, func(t *testing.T) {
client := newTestClient(name)
returned := make(chan struct{})
go func() {
lifecycleCall(client)
close(returned)
}()
select {
case <-returned:
case <-time.After(100 * time.Millisecond):
t.Fatal("client lifecycle call blocked after hub shutdown")
}
if !client.closed {
t.Fatal("client send channel remained open after hub shutdown")
}
})
}
}