]> git.giacomolli.uk - onechat/blobdiff - whatsapp_fake_helper_test.go
Receive images in WhatsApp batches
[onechat] / whatsapp_fake_helper_test.go
index 1625fe3b8729b9c3f9240e161797903229462c24..e936f45c4af856545e13849b0adcf6d78ad57b97 100644 (file)
@@ -3,8 +3,7 @@ package main
 import (
        "context"
        "fmt"
-       "io"
-       "log"
+       "log/slog"
        "os"
        "path/filepath"
        "slices"
@@ -84,6 +83,10 @@ type WhatsAppFake struct {
        logoutErr     error
        groups        []*types.GroupInfo
        sendErr       error
+       downloadData  []byte
+       downloadErr   error
+       downloadWait  time.Duration
+       downloads     []whatsmeow.DownloadableMessage
        phones        []string
        logouts       int
        sent          []WhatsAppFakeSend
@@ -169,6 +172,36 @@ func (f *WhatsAppFake) GetJoinedGroups(_ context.Context) ([]*types.GroupInfo, e
        return f.groups, nil
 }
 
+// Download waits for downloadWait, records the request, and returns the made-up
+// image or downloadErr. A canceled context ends the wait.
+func (f *WhatsAppFake) Download(ctx context.Context, message whatsmeow.DownloadableMessage) ([]byte, error) {
+       if f.downloadWait > 0 {
+               timer := time.NewTimer(f.downloadWait)
+               defer timer.Stop()
+
+               select {
+               case <-ctx.Done():
+                       return nil, ctx.Err()
+               case <-timer.C:
+               }
+       }
+
+       f.mutex.Lock()
+       defer f.mutex.Unlock()
+
+       f.downloads = append(f.downloads, message)
+
+       return slices.Clone(f.downloadData), f.downloadErr
+}
+
+// Downloads returns the media requested from the fake.
+func (f *WhatsAppFake) Downloads() []whatsmeow.DownloadableMessage {
+       f.mutex.Lock()
+       defer f.mutex.Unlock()
+
+       return slices.Clone(f.downloads)
+}
+
 // GenerateMessageID returns a new message ID.
 func (f *WhatsAppFake) GenerateMessageID() types.MessageID {
        f.mutex.Lock()
@@ -261,7 +294,7 @@ func whatsappStartTest(t *testing.T, dir string, clock *TestClock) (*WhatsApp, *
        }
 
        logs := &SyncBuffer{}
-       whatsapp, err := openWhatsApp(t.Context(), dir, clock.Now, log.New(logs, "", 0), fake.newClient)
+       whatsapp, err := openWhatsApp(t.Context(), dir, clock.Now, daemonTestLogger(logs), fake.newClient)
        require.NoError(t, err)
 
        t.Cleanup(func() {
@@ -306,8 +339,8 @@ func whatsappTestSession(t *testing.T, dir string, linked bool) {
 }
 
 // whatsappDiscardLog is a logger for a WhatsApp whose log a test does not read.
-func whatsappDiscardLog() *log.Logger {
-       return log.New(io.Discard, "", 0)
+func whatsappDiscardLog() *slog.Logger {
+       return slog.New(slog.DiscardHandler)
 }
 
 // whatsappTestMessage returns the event of the text message id of sender in