X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/a85d214071706753f358f0af23cfd525c28dbfe0..a606686934b4028c29dca8e9dae6b2e188cee9c5:/whatsapp_fake_helper_test.go diff --git a/whatsapp_fake_helper_test.go b/whatsapp_fake_helper_test.go index c9bc835..7aa558b 100644 --- a/whatsapp_fake_helper_test.go +++ b/whatsapp_fake_helper_test.go @@ -69,29 +69,32 @@ var ( // daemon gives it, and Emit gives events to the handler, as the library does. // Each connection keeps its context and sends to connects, and each pairing // sends its channel to pairings, so that the test gives the items of the -// pairing. A connection fails with connectErr, a logout with logoutErr, and a -// send with sendErr. groups are the groups of the account. A send that does not -// fail gets the time whatsappTestSendTime. +// pairing. A connection takes its error from connectErrors, then connectErr. A +// logout fails with logoutErr, and a send with sendErr. groups are the groups +// of the account. A send that does not fail gets the time whatsappTestSendTime. type WhatsAppFake struct { connects chan struct{} pairings chan chan whatsmeow.QRChannelItem - mutex sync.Mutex - handle func(event any) bool - connectErr error - logoutErr error - groups []*types.GroupInfo - sendErr error - phones []string - logouts int - sent []WhatsAppFakeSend - connections []context.Context + mutex sync.Mutex + handle func(event any) bool + connectErr error + connectErrors []error + connectTimes []time.Time + logoutErr error + groups []*types.GroupInfo + sendErr error + phones []string + logouts int + sent []WhatsAppFakeSend + connections []context.Context } // ConnectContext keeps ctx and tells the test that the daemon connected. func (f *WhatsAppFake) ConnectContext(ctx context.Context) error { f.mutex.Lock() f.connections = append(f.connections, ctx) + f.connectTimes = append(f.connectTimes, time.Now()) f.mutex.Unlock() f.connects <- struct{}{} @@ -99,6 +102,12 @@ func (f *WhatsAppFake) ConnectContext(ctx context.Context) error { f.mutex.Lock() defer f.mutex.Unlock() + if len(f.connectErrors) > 0 { + err := f.connectErrors[0] + f.connectErrors = f.connectErrors[1:] + return err + } + return f.connectErr } @@ -110,6 +119,14 @@ func (f *WhatsAppFake) Connections() []context.Context { return slices.Clone(f.connections) } +// ConnectionTimes returns the time of each connection call, in order. +func (f *WhatsAppFake) ConnectionTimes() []time.Time { + f.mutex.Lock() + defer f.mutex.Unlock() + + return slices.Clone(f.connectTimes) +} + // Disconnect does nothing. func (f *WhatsAppFake) Disconnect() { } @@ -309,3 +326,59 @@ func whatsappTestMessage(chat, sender types.JID, id, text string, at time.Time) }, } } + +// whatsappTestLogTexts returns the texts of the messages in the log of memory, +// after the log holds at least one message. +func whatsappTestLogTexts(t *testing.T, memory *Memory) []string { + t.Helper() + + require.Eventually(t, func() bool { + return memory.Len() > 0 + }, 10*time.Second, time.Millisecond) + + var texts []string + for id := range memory.Len() { + message, err := memory.Message(id) + require.NoError(t, err) + + texts = append(texts, message.Text) + } + + return texts +} + +// whatsappStartTestLinked opens a WhatsApp with a linked device in a temporary +// directory, with a quiet time of 50 ms for its batches. +func whatsappStartTestLinked(t *testing.T) (*WhatsApp, *WhatsAppFake) { + t.Helper() + + dir := t.TempDir() + whatsappTestSession(t, dir, true) + whatsapp, fake, _ := whatsappStartTest(t, dir, newTestClock()) + whatsapp.state.quiet = 50 * time.Millisecond + + return whatsapp, fake +} + +// whatsappTestConnect waits for the connection of the daemon and gives it the +// events of a connection with an empty catch-up. +func whatsappTestConnect(t *testing.T, fake *WhatsAppFake) { + t.Helper() + + <-fake.connects + require.True(t, fake.Emit(&events.Connected{})) + require.True(t, fake.Emit(&events.OfflineSyncCompleted{})) +} + +// whatsappTestContacts puts the contacts of the tests into the session of +// whatsapp: Ana Souza, Joao Silva with an accent, a business, and the user. +func whatsappTestContacts(t *testing.T, whatsapp *WhatsApp) { + t.Helper() + + contacts := whatsapp.device.Contacts + require.NoError(t, contacts.PutContactName(t.Context(), whatsappTestAna, "Ana", "Ana Souza")) + require.NoError(t, contacts.PutContactName(t.Context(), types.NewJID("15550004444", types.DefaultUserServer), "João", "João Silva")) + _, _, err := contacts.PutBusinessName(t.Context(), types.NewJID("15550005555", types.DefaultUserServer), "Corner Bakery") + require.NoError(t, err) + require.NoError(t, contacts.PutContactName(t.Context(), whatsappTestOwn, "Me", "Me Souza")) +}