180 lines
5.1 KiB
Go
180 lines
5.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
const (
|
|
testHostname = "https://example.com"
|
|
)
|
|
|
|
var newAndrewsArnoldProviderTest = []struct {
|
|
descr string
|
|
options []ProviderOption
|
|
err error
|
|
}{
|
|
{
|
|
descr: "empty hostname in report handler",
|
|
options: []ProviderOption{WithReportHandler("")},
|
|
err: fmt.Errorf("cannot use report handler with empty hostname"),
|
|
},
|
|
}
|
|
|
|
func TestNewAndrewsArnoldProvider(t *testing.T) {
|
|
for _, tt := range newAndrewsArnoldProviderTest {
|
|
t.Run(tt.descr, func(t *testing.T) {
|
|
_, err := NewAndrewsArnoldProvider(tt.options...)
|
|
if err != nil && tt.err == nil {
|
|
t.Errorf("NewAndrewsArnoldProvider(): want error 'nil', have '%s'", err)
|
|
} else if err == nil && tt.err != nil {
|
|
t.Errorf("NewAndrewsArnoldProvider(): want error '%s', have 'nil'", tt.err)
|
|
} else if err != nil && tt.err != nil && err.Error() != tt.err.Error() {
|
|
t.Errorf("NewAndrewsArnoldProvider(): want error '%s', have '%s'", tt.err, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
var sendMessageTest = []struct {
|
|
descr string
|
|
user User
|
|
message Message
|
|
transport *mockTransport
|
|
values url.Values
|
|
err error
|
|
}{
|
|
{
|
|
descr: "empty username",
|
|
user: User{},
|
|
err: fmt.Errorf("cannot send message for incomplete user information"),
|
|
},
|
|
{
|
|
descr: "empty password",
|
|
user: User{tel: "+447700900000"},
|
|
err: fmt.Errorf("cannot send message for incomplete user information"),
|
|
},
|
|
{
|
|
descr: "empty destination number",
|
|
user: User{tel: "+447700900000", password: "some secret!"},
|
|
err: fmt.Errorf("cannot send message for empty destination number"),
|
|
},
|
|
{
|
|
descr: "empty body",
|
|
user: User{tel: "+447700900000", password: "some secret!"},
|
|
message: Message{Dest: "+447700900001"},
|
|
},
|
|
{
|
|
descr: "error in HTTP request",
|
|
user: User{tel: "+447700900000", password: "some secret!"},
|
|
message: Message{Dest: "+447700900001", Body: "hello world"},
|
|
transport: &mockTransport{err: fmt.Errorf("some darn error!")},
|
|
err: fmt.Errorf(`failed sending HTTP request for message: Post "%s": some darn error!`, upstreamEndpoint),
|
|
},
|
|
{
|
|
descr: "upstream error message",
|
|
user: User{tel: "+447700900000", password: "some secret!"},
|
|
message: Message{Dest: "+447700900001", Body: "hello world"},
|
|
transport: &mockTransport{body: "ERR:what is the what?"},
|
|
err: fmt.Errorf("failed sending HTTP request for message: what is the what?"),
|
|
},
|
|
{
|
|
descr: "upstream error code",
|
|
user: User{tel: "+447700900000", password: "some secret!"},
|
|
message: Message{Dest: "+447700900001", Body: "hello world"},
|
|
transport: &mockTransport{status: 403},
|
|
err: fmt.Errorf("failed sending HTTP request for message: 403 Forbidden"),
|
|
},
|
|
{
|
|
descr: "valid form body",
|
|
user: User{tel: "+447700900000", password: "some secret!"},
|
|
message: Message{Dest: "+447700900001", Body: "hello world"},
|
|
values: url.Values{
|
|
"username": {"+447700900000"},
|
|
"password": {"some secret!"},
|
|
"da": {"+447700900001"},
|
|
"ud": {"hello world"},
|
|
"limit": {"3"},
|
|
"costcentre": {"sgx-aa"},
|
|
},
|
|
},
|
|
{
|
|
descr: "valid form body with message ID",
|
|
user: User{tel: "+447700900000", password: "some secret!"},
|
|
message: Message{Dest: "+447700900001", Body: "hello world", ID: "foo bar"},
|
|
values: url.Values{
|
|
"username": {"+447700900000"},
|
|
"password": {"some secret!"},
|
|
"da": {"+447700900001"},
|
|
"ud": {"hello world"},
|
|
"limit": {"3"},
|
|
"costcentre": {"sgx-aa"},
|
|
"srr": {"https://example.com/c77f0ea3dcd450b6df09deb5dc8d7a92a1415cc6b4b86b0e62db668361fc1baf/sms/srr?code=%code&da=%da&oa=%oa&stanzaId=foo+bar"},
|
|
},
|
|
},
|
|
}
|
|
|
|
func TestSendMessage(t *testing.T) {
|
|
for _, tt := range sendMessageTest {
|
|
t.Run(tt.descr, func(t *testing.T) {
|
|
p, err := NewAndrewsArnoldProvider(WithReportHandler(testHostname))
|
|
if err != nil {
|
|
t.Fatalf("NewAndrewsArnoldProvider: %s", err)
|
|
}
|
|
|
|
tr := &mockTransport{}
|
|
if tt.transport != nil {
|
|
tr = tt.transport
|
|
}
|
|
p.client = &http.Client{Transport: tr}
|
|
|
|
err = p.SendMessage(tt.user, tt.message)
|
|
if err != nil && tt.err == nil {
|
|
t.Errorf("SendMessage(): want error 'nil', have '%s'", err)
|
|
} else if err == nil && tt.err != nil {
|
|
t.Errorf("SendMessage(): want error '%s', have 'nil'", tt.err)
|
|
} else if err != nil && tt.err != nil && err.Error() != tt.err.Error() {
|
|
t.Errorf("SendMessage(): want error '%s', have '%s'", tt.err, err)
|
|
} else if err != nil && tt.err != nil {
|
|
return
|
|
} else if expect := tt.values.Encode(); expect != tr.body {
|
|
t.Errorf("SendMessage(): want request body '%s', have '%s'", expect, tr.body)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
type mockTransport struct {
|
|
status int
|
|
body string
|
|
err error
|
|
}
|
|
|
|
func (tr *mockTransport) RoundTrip(r *http.Request) (*http.Response, error) {
|
|
if tr.err != nil {
|
|
return nil, tr.err
|
|
}
|
|
|
|
if tr.body == "" {
|
|
if err := r.ParseForm(); err != nil {
|
|
return nil, err
|
|
}
|
|
tr.body = r.Form.Encode()
|
|
}
|
|
|
|
if tr.status == 0 {
|
|
tr.status = http.StatusOK
|
|
}
|
|
|
|
resp := &http.Response{
|
|
StatusCode: tr.status,
|
|
Body: io.NopCloser(strings.NewReader(tr.body)),
|
|
}
|
|
|
|
return resp, nil
|
|
}
|