package browser import ( "sync" "testing" ) // TestCdpHandleDialog_nilConn cubre la precondición sin Chrome. func TestCdpHandleDialog_nilConn(t *testing.T) { _, _, err := CdpHandleDialog(nil, true, "") if err == nil { t.Fatal("esperaba error con conexion nula") } } // TestDialogLog cubre el núcleo puro del registro de diálogos: contar, recordar // el último, y la seguridad concurrente del mutex. No requiere Chrome. func TestDialogLog(t *testing.T) { t.Run("golden: cuenta y recuerda el ultimo", func(t *testing.T) { l := &DialogLog{} l.record("alert", "hola") l.record("confirm", "¿seguro?") count, lastType, lastMsg := l.Snapshot() if count != 2 { t.Errorf("count = %d, esperaba 2", count) } if lastType != "confirm" || lastMsg != "¿seguro?" { t.Errorf("last = (%q,%q), esperaba (confirm, ¿seguro?)", lastType, lastMsg) } }) t.Run("edge: log vacio", func(t *testing.T) { l := &DialogLog{} count, lastType, lastMsg := l.Snapshot() if count != 0 || lastType != "" || lastMsg != "" { t.Errorf("log vacio = (%d,%q,%q), esperaba (0,\"\",\"\")", count, lastType, lastMsg) } }) t.Run("concurrencia: 100 records desde N goroutines no pierde cuentas", func(t *testing.T) { l := &DialogLog{} var wg sync.WaitGroup for i := 0; i < 100; i++ { wg.Add(1) go func() { defer wg.Done() l.record("alert", "x") }() } wg.Wait() if count, _, _ := l.Snapshot(); count != 100 { t.Errorf("count = %d, esperaba 100 (sin perder por race)", count) } }) }