package chat import ( "context" "sync" ) // fakeChannel — тестовый канал: захватывает исходящие и умеет эмулировать // входящие события. Не запускает реальный цикл. type fakeChannel struct { mu sync.Mutex handler Handler sent []SendCall addr Address runErr error } type SendCall struct { To Address Msg Message } func newFakeChannel(addr Address) *fakeChannel { return &fakeChannel{addr: addr} } func (f *fakeChannel) OnMessage(h Handler) { f.mu.Lock() defer f.mu.Unlock() f.handler = h } func (f *fakeChannel) Run(ctx context.Context) error { return f.runErr } func (f *fakeChannel) Send(_ context.Context, to Address, m Message) error { f.mu.Lock() defer f.mu.Unlock() f.sent = append(f.sent, SendCall{To: to, Msg: m}) return nil } func (f *fakeChannel) Ask(_ context.Context, to Address, m Message) error { f.mu.Lock() defer f.mu.Unlock() f.sent = append(f.sent, SendCall{To: to, Msg: m}) return nil } func (f *fakeChannel) Close() error { return nil } // emit доставляет входящее через зарегистрированный handler. func (f *fakeChannel) emit(uid UserID, addr Address, text string) { f.mu.Lock() h := f.handler f.mu.Unlock() if h != nil { h(Incoming{UserID: uid, Address: addr, Msg: Message{Text: text}, Channel: f}) } } func (f *fakeChannel) sentCount() int { f.mu.Lock() defer f.mu.Unlock() return len(f.sent) }