62 lines
2.0 KiB
Go
62 lines
2.0 KiB
Go
package videochat
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
)
|
|
|
|
func TestBroadcastSessionLifecycle(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// 1. Log OPEN
|
|
err := logBroadcastSession(ctx, "test-owner", "test-sid-1", "test-room", "OPEN")
|
|
if err != nil {
|
|
t.Fatalf("failed to log OPEN: %v", err)
|
|
}
|
|
|
|
// 2. Duplicate OPEN should be ignored (idempotent)
|
|
err = logBroadcastSession(ctx, "test-owner", "test-sid-1", "test-room", "OPEN")
|
|
if err != nil {
|
|
t.Fatalf("failed on duplicate OPEN: %v", err)
|
|
}
|
|
|
|
var openCount int
|
|
err = db.QueryRow(ctx, "SELECT count(*) FROM broadcast_sessions WHERE sid = $1 AND action = 'OPEN'", "test-sid-1").Scan(&openCount)
|
|
if err != nil || openCount != 1 {
|
|
t.Fatalf("expected exactly 1 OPEN record, got %d (err: %v)", openCount, err)
|
|
}
|
|
|
|
// 3. Log CLOSE
|
|
err = logBroadcastSession(ctx, "test-owner", "test-sid-1", "test-room", "CLOSE")
|
|
if err != nil {
|
|
t.Fatalf("failed to log CLOSE: %v", err)
|
|
}
|
|
|
|
// 4. Duplicate CLOSE should be ignored
|
|
err = logBroadcastSession(ctx, "test-owner", "test-sid-1", "test-room", "CLOSE")
|
|
if err != nil {
|
|
t.Fatalf("failed on duplicate CLOSE: %v", err)
|
|
}
|
|
|
|
var closeCount int
|
|
err = db.QueryRow(ctx, "SELECT count(*) FROM broadcast_sessions WHERE sid = $1 AND action = 'CLOSE'", "test-sid-1").Scan(&closeCount)
|
|
if err != nil || closeCount != 1 {
|
|
t.Fatalf("expected exactly 1 CLOSE record, got %d (err: %v)", closeCount, err)
|
|
}
|
|
|
|
// 5. Test syncClosedSessions
|
|
err = logBroadcastSession(ctx, "test-owner-2", "test-sid-orphan", "test-room-2", "OPEN")
|
|
if err != nil {
|
|
t.Fatalf("failed to log orphan OPEN: %v", err)
|
|
}
|
|
|
|
// Active SIDs does not contain test-sid-orphan -> should be automatically closed
|
|
syncClosedSessions(ctx, map[string]bool{"other-sid": true})
|
|
|
|
var orphanCloseCount int
|
|
err = db.QueryRow(ctx, "SELECT count(*) FROM broadcast_sessions WHERE sid = $1 AND action = 'CLOSE'", "test-sid-orphan").Scan(&orphanCloseCount)
|
|
if err != nil || orphanCloseCount != 1 {
|
|
t.Fatalf("expected syncClosedSessions to create CLOSE record, got %d (err: %v)", orphanCloseCount, err)
|
|
}
|
|
}
|