package server import ( "context" "testing" "vocat/internal/modem" "vocat/internal/vowifi" ) func TestParseCLCC(t *testing.T) { calls := parseCLCC(modem.Response{Lines: []string{ `+CLCC: 1,1,4,0,0,"+447700900000",145`, `+CLCC: 2,0,0,0,0,"12345",129`, }}) if len(calls) != 2 || calls[0]["number"] != "+447700900000" || calls[1]["state"] != 0 { t.Fatalf("parseCLCC = %#v", calls) } } func TestValidDialNumber(t *testing.T) { for _, value := range []string{"+447700900000", "12345", "*100#"} { if !validDialNumber(value) { t.Errorf("validDialNumber(%q) = false", value) } } for _, value := range []string{"", "+", "12;ATH", "12 34", "abc"} { if validDialNumber(value) { t.Errorf("validDialNumber(%q) = true", value) } } } func TestCallTransportRequiresIMSReady(t *testing.T) { controller := &fakeVoWiFiController{state: vowifi.State{Enabled: true}} server := &Server{vowifi: controller} if got := server.callTransport("ec20"); got != "cellular" { t.Fatalf("callTransport before IMS registration = %q, want cellular", got) } controller.state.IMSReady = true if got := server.callTransport("ec20"); got != "vowifi" { t.Fatalf("callTransport with IMS ready = %q, want vowifi", got) } } func TestResolveVoWiFiCallIDIgnoresTerminalCalls(t *testing.T) { controller := &fakeCallController{calls: []vowifi.Call{ {ID: "failed", State: "failed"}, {ID: "active", State: "active"}, }} got, err := resolveVoWiFiCallID(controller, "ec20", "", "") if err != nil || got != "active" { t.Fatalf("resolveVoWiFiCallID() = %q, %v; want active", got, err) } } type fakeCallController struct { calls []vowifi.Call } func (controller *fakeCallController) Calls(string) ([]vowifi.Call, error) { return controller.calls, nil } func (*fakeCallController) DialCall(context.Context, string, string) (vowifi.Call, error) { return vowifi.Call{}, nil } func (*fakeCallController) AnswerCall(context.Context, string, string) (vowifi.Call, error) { return vowifi.Call{}, nil } func (*fakeCallController) HangupCall(context.Context, string, string) error { return nil }