2026-07-30 04:55:21 +02:00
|
|
|
package connector
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/purpshell/meowcaller"
|
|
|
|
|
"go.mau.fi/whatsmeow/types"
|
|
|
|
|
"maunium.net/go/mautrix/bridgev2/networkid"
|
|
|
|
|
|
|
|
|
|
"go.mau.fi/mautrix-whatsapp/pkg/connector/wadb"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestSelectActiveCallForLogin(t *testing.T) {
|
|
|
|
|
alice := networkid.UserLoginID("alice")
|
|
|
|
|
bob := networkid.UserLoginID("bob")
|
|
|
|
|
calls := []*wadb.MatrixRTCCall{
|
|
|
|
|
{UserLoginID: bob, WACallID: "bob-call"},
|
|
|
|
|
{UserLoginID: alice, WACallID: "alice-call"},
|
|
|
|
|
}
|
|
|
|
|
call, err := selectActiveCallForLogin(calls, alice)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("selectActiveCallForLogin returned error: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if call.WACallID != "alice-call" {
|
|
|
|
|
t.Fatalf("selected call = %q, want alice-call", call.WACallID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSelectActiveCallForLoginRejectsMissingAndAmbiguousCalls(t *testing.T) {
|
|
|
|
|
loginID := networkid.UserLoginID("alice")
|
|
|
|
|
if _, err := selectActiveCallForLogin(nil, loginID); err == nil {
|
|
|
|
|
t.Fatal("selectActiveCallForLogin accepted an empty call list")
|
|
|
|
|
}
|
|
|
|
|
calls := []*wadb.MatrixRTCCall{
|
|
|
|
|
{UserLoginID: loginID, WACallID: "first"},
|
|
|
|
|
{UserLoginID: loginID, WACallID: "second"},
|
|
|
|
|
}
|
|
|
|
|
if _, err := selectActiveCallForLogin(calls, loginID); err == nil {
|
|
|
|
|
t.Fatal("selectActiveCallForLogin accepted multiple calls for one login")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestFormatGroupCallRoster(t *testing.T) {
|
|
|
|
|
state := meowcaller.GroupCallState{
|
|
|
|
|
TransactionID: 42,
|
|
|
|
|
RekeyRequested: true,
|
|
|
|
|
Participants: []meowcaller.GroupCallParticipant{
|
|
|
|
|
{
|
|
|
|
|
JID: types.NewJID("222", types.HiddenUserServer),
|
|
|
|
|
PN: types.NewJID("15550000002", types.DefaultUserServer),
|
|
|
|
|
State: "connected",
|
|
|
|
|
Devices: []meowcaller.GroupCallDevice{
|
|
|
|
|
{JID: types.NewJID("222", types.HiddenUserServer)},
|
|
|
|
|
},
|
|
|
|
|
HandRaised: true,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
JID: types.NewJID("111", types.HiddenUserServer),
|
|
|
|
|
State: "ringing",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
got := formatGroupCallRoster(state)
|
|
|
|
|
for _, want := range []string{
|
|
|
|
|
"transaction 42",
|
|
|
|
|
"`111@lid`: ringing; 0 device(s)",
|
|
|
|
|
"`15550000002@s.whatsapp.net`: connected; 1 device(s); hand raised",
|
|
|
|
|
"requested a group media rekey",
|
|
|
|
|
} {
|
|
|
|
|
if !strings.Contains(got, want) {
|
|
|
|
|
t.Errorf("formatted roster missing %q:\n%s", want, got)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-07-30 04:59:42 +02:00
|
|
|
|
|
|
|
|
func TestCallLinkArgsInfersMediaFromURL(t *testing.T) {
|
|
|
|
|
token, video, err := callLinkArgs([]string{"https://call.whatsapp.com/video/TOKEN"})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("callLinkArgs returned error: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if token != "https://call.whatsapp.com/video/TOKEN" || !video {
|
|
|
|
|
t.Fatalf("callLinkArgs = (%q, %t), want video URL and true", token, video)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
token, video, err = callLinkArgs([]string{"TOKEN", "video"})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("callLinkArgs with explicit media returned error: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if token != "TOKEN" || !video {
|
|
|
|
|
t.Fatalf("callLinkArgs = (%q, %t), want TOKEN and true", token, video)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestCallMediaArgRejectsUnknownMedia(t *testing.T) {
|
|
|
|
|
if _, err := callMediaArg([]string{"screen"}); err == nil {
|
|
|
|
|
t.Fatal("callMediaArg accepted an unknown media kind")
|
|
|
|
|
}
|
|
|
|
|
if video, err := callMediaArg(nil); err != nil || video {
|
|
|
|
|
t.Fatalf("callMediaArg default = (%t, %v), want audio and nil", video, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestParseCallApproval(t *testing.T) {
|
|
|
|
|
for _, raw := range []string{"on", "true", "enabled"} {
|
|
|
|
|
if enabled, err := parseCallApproval(raw); err != nil || !enabled {
|
|
|
|
|
t.Errorf("parseCallApproval(%q) = (%t, %v), want true and nil", raw, enabled, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for _, raw := range []string{"off", "false", "disabled"} {
|
|
|
|
|
if enabled, err := parseCallApproval(raw); err != nil || enabled {
|
|
|
|
|
t.Errorf("parseCallApproval(%q) = (%t, %v), want false and nil", raw, enabled, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if _, err := parseCallApproval("maybe"); err == nil {
|
|
|
|
|
t.Fatal("parseCallApproval accepted an invalid value")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestFormatWaitingRoomState(t *testing.T) {
|
|
|
|
|
state := meowcaller.WaitingRoomState{
|
|
|
|
|
Enabled: true,
|
|
|
|
|
IsAdmin: true,
|
|
|
|
|
InWaitingRoom: false,
|
|
|
|
|
TransactionID: 7,
|
|
|
|
|
Users: []meowcaller.WaitingRoomUser{
|
|
|
|
|
{
|
|
|
|
|
JID: types.NewJID("222", types.HiddenUserServer),
|
|
|
|
|
PN: types.NewJID("15550000002", types.DefaultUserServer),
|
|
|
|
|
State: "pending",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
got := formatWaitingRoomState(state)
|
|
|
|
|
for _, want := range []string{
|
|
|
|
|
"transaction 7",
|
|
|
|
|
"approval **enabled**",
|
|
|
|
|
"`15550000002@s.whatsapp.net`: pending",
|
|
|
|
|
} {
|
|
|
|
|
if !strings.Contains(got, want) {
|
|
|
|
|
t.Errorf("formatted waiting room missing %q:\n%s", want, got)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|