]> git.giacomolli.uk - onechat/blob - whatsapp_find_test.go
Reread the rules from disk in the diff review
[onechat] / whatsapp_find_test.go
1 package main
2
3 import (
4 "fmt"
5 "net/http"
6 "strings"
7 "testing"
8
9 "github.com/stretchr/testify/require"
10 "go.mau.fi/whatsmeow/types"
11 )
12
13 func TestWhatsAppFindMatchesNamesWithNoRegardToCaseAndAccents(t *testing.T) {
14 whatsapp, fake := whatsappStartTestLinked(t)
15 fake.groups = []*types.GroupInfo{
16 {
17 JID: whatsappTestFamily,
18 GroupName: types.GroupName{
19 Name: "Família Souza",
20 },
21 },
22 }
23
24 whatsappTestContacts(t, whatsapp)
25 daemonStartTestWithWhatsApp(t, newModelFake(t), nil, whatsapp)
26 whatsappTestConnect(t, fake)
27
28 testCases := []struct {
29 name string
30 query string
31 answer string
32 }{
33 {
34 name: "no accent finds an accent",
35 query: "joao",
36 answer: "15550004444@s.whatsapp.net | João Silva | contact",
37 },
38 {
39 name: "a part of a name finds contacts and groups",
40 query: "SOUZA",
41 answer: "15550002222@s.whatsapp.net | Ana Souza | contact\n120363000000000001@g.us | Família Souza | group",
42 },
43 {
44 name: "a business name",
45 query: "bakery",
46 answer: "15550005555@s.whatsapp.net | Corner Bakery | contact",
47 },
48 {
49 name: "no match",
50 query: "Zed",
51 answer: "No contact or group has a name with \"Zed\".",
52 },
53 }
54
55 for _, tc := range testCases {
56 t.Run(tc.name, func(t *testing.T) {
57 answer, err := whatsapp.Find(t.Context(), tc.query)
58 require.NoError(t, err)
59 require.Equal(t, tc.answer, answer)
60 })
61 }
62 }
63
64 func TestWhatsAppFindGivesAtMostTwentyMatches(t *testing.T) {
65 whatsapp, _ := whatsappStartTestLinked(t)
66 for index := range 25 {
67 jid := types.NewJID(fmt.Sprintf("1555001%04d", index), types.DefaultUserServer)
68 require.NoError(t, whatsapp.device.Contacts.PutContactName(t.Context(), jid, "", fmt.Sprintf("Member %02d", index)))
69 }
70
71 answer, err := whatsapp.Find(t.Context(), "member")
72 require.NoError(t, err)
73
74 lines := strings.Split(answer, "\n")
75 require.Len(t, lines, 22)
76 require.Equal(t, "15550010000@s.whatsapp.net | Member 00 | contact", lines[0])
77 require.Equal(t, "5 more: give a longer part of the name.", lines[20])
78 require.Equal(t, "The groups are not in this answer, because WhatsApp is disconnected.", lines[21])
79 }
80
81 func TestWhatsAppFindBeforeTheNamesArrive(t *testing.T) {
82 whatsapp, fake := whatsappStartTestLinked(t)
83 daemonStartTestWithWhatsApp(t, newModelFake(t), nil, whatsapp)
84 whatsappTestConnect(t, fake)
85
86 answer, err := whatsapp.Find(t.Context(), "ana")
87 require.NoError(t, err)
88 require.Equal(t, whatsappNamesNotReady, answer)
89 }
90
91 func TestWhatsAppFindWithoutALink(t *testing.T) {
92 whatsapp, _, _ := whatsappStartTest(t, t.TempDir(), newTestClock())
93
94 answer, err := whatsapp.Find(t.Context(), "ana")
95 require.NoError(t, err)
96 require.Equal(t, whatsappNotLinked, answer)
97 }
98
99 func TestAgentFindsAWhatsAppContact(t *testing.T) {
100 whatsapp, fake := whatsappStartTestLinked(t)
101 whatsappTestContacts(t, whatsapp)
102 server := newModelFake(t)
103 server.reply = func(w http.ResponseWriter, call ModelFakeCall) {
104 if call.number == 0 {
105 modelWriteEvents(w, modelCompletedEvent([]any{modelFunctionCallItem("fc_1", "call_1", "whatsapp_find", `{"name":"ana"}`)}, 100, 0, 5))
106 return
107 }
108
109 modelWriteEvents(w, modelCompletedEvent([]any{modelMessageItem("Found Ana.")}, 100, 0, 5))
110 }
111
112 socket, _ := daemonStartTestWithWhatsApp(t, server, nil, whatsapp)
113 client := terminalStartTestClient(t, socket)
114 whatsappTestConnect(t, fake)
115
116 client.Type("Find Ana on WhatsApp.")
117 client.WaitFor(t, "[result] 15550002222@s.whatsapp.net | Ana Souza | contact\nFound Ana.\n[done]")
118 }