88 lines
3.1 KiB
Go
88 lines
3.1 KiB
Go
package ari
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"ai-operator/internal/config"
|
|
)
|
|
|
|
func TestActions(t *testing.T) {
|
|
var methods []string
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
methods = append(methods, r.Method+" "+r.URL.Path)
|
|
switch {
|
|
case r.Method == http.MethodPost && strings.HasSuffix(r.URL.Path, "/answer"):
|
|
w.WriteHeader(http.StatusNoContent)
|
|
case r.Method == http.MethodDelete:
|
|
w.WriteHeader(http.StatusNoContent)
|
|
case r.Method == http.MethodGet:
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write([]byte(`{"id":"c1","state":"Up"}`))
|
|
}
|
|
}))
|
|
defer server.Close()
|
|
client := NewClient(config.AsteriskConfig{ARIURL: server.URL, ARIUser: "u", ARIPassword: "p"})
|
|
if err := client.AnswerChannel(context.Background(), "c1"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := client.HangupChannel(context.Background(), "c1"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ch, err := client.GetChannel(context.Background(), "c1")
|
|
if err != nil || ch.ID != "c1" {
|
|
t.Fatalf("get %v %v", ch, err)
|
|
}
|
|
}
|
|
|
|
func TestHangup404NonFatalAndBadStatus(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) }))
|
|
defer server.Close()
|
|
client := NewClient(config.AsteriskConfig{ARIURL: server.URL, ARIUser: "u", ARIPassword: "secret"})
|
|
if err := client.HangupChannel(context.Background(), "gone"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := client.AnswerChannel(context.Background(), "gone"); err == nil || strings.Contains(err.Error(), "secret") {
|
|
t.Fatalf("bad err: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestHandoffActions(t *testing.T) {
|
|
var seen []string
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
seen = append(seen, r.Method+" "+r.URL.Path+"?"+r.URL.RawQuery)
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}))
|
|
defer server.Close()
|
|
client := NewClient(config.AsteriskConfig{ARIURL: server.URL, ARIUser: "u", ARIPassword: "secret"})
|
|
if err := client.RedirectChannel(context.Background(), "c 1", "PJSIP/operator"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := client.ContinueInDialplan(context.Background(), "c 1", "handoff", "100", 1); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got := strings.Join(seen, "\n")
|
|
if !strings.Contains(got, "/channels/c 1/redirect?endpoint=PJSIP%2Foperator") {
|
|
t.Fatalf("redirect not encoded: %s", got)
|
|
}
|
|
if !strings.Contains(got, "/channels/c 1/continue?context=handoff&extension=100&priority=1") {
|
|
t.Fatalf("continue not encoded: %s", got)
|
|
}
|
|
}
|
|
|
|
func TestHandoffActionErrorNoSecret(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusForbidden) }))
|
|
defer server.Close()
|
|
client := NewClient(config.AsteriskConfig{ARIURL: server.URL, ARIUser: "u", ARIPassword: "secret-password"})
|
|
err := client.RedirectChannel(context.Background(), "c1", "PJSIP/user:pass@example")
|
|
if err == nil {
|
|
t.Fatal("expected error")
|
|
}
|
|
if strings.Contains(err.Error(), "secret-password") {
|
|
t.Fatalf("error leaked password: %v", err)
|
|
}
|
|
}
|