112 lines
2.1 KiB
Go
112 lines
2.1 KiB
Go
package soap
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
type capturingRoundTripper struct {
|
|
err error
|
|
resp *http.Response
|
|
capturedReq *http.Request
|
|
}
|
|
|
|
func (rt *capturingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
rt.capturedReq = req
|
|
return rt.resp, rt.err
|
|
}
|
|
|
|
func TestActionInputs(t *testing.T) {
|
|
t.Parallel()
|
|
url, err := url.Parse("http://example.com/soap")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
rt := &capturingRoundTripper{
|
|
err: nil,
|
|
resp: &http.Response{
|
|
StatusCode: 200,
|
|
Body: ioutil.NopCloser(bytes.NewBufferString(`
|
|
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
|
|
<s:Body>
|
|
<u:myactionResponse xmlns:u="mynamespace">
|
|
<A>valueA</A>
|
|
<B>valueB</B>
|
|
</u:myactionResponse>
|
|
</s:Body>
|
|
</s:Envelope>
|
|
`)),
|
|
},
|
|
}
|
|
client := SOAPClient{
|
|
EndpointURL: *url,
|
|
HTTPClient: http.Client{
|
|
Transport: rt,
|
|
},
|
|
}
|
|
|
|
type In struct {
|
|
Foo string
|
|
Bar string `soap:"bar"`
|
|
Baz string
|
|
}
|
|
type Out struct {
|
|
A string
|
|
B string
|
|
}
|
|
in := In{"foo", "bar", "quoted=\"baz\""}
|
|
gotOut := Out{}
|
|
err = client.PerformAction("mynamespace", "myaction", &in, &gotOut)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
wantBody := (soapPrefix +
|
|
`<u:myaction xmlns:u="mynamespace">` +
|
|
`<Foo>foo</Foo>` +
|
|
`<bar>bar</bar>` +
|
|
`<Baz>quoted="baz"</Baz>` +
|
|
`</u:myaction>` +
|
|
soapSuffix)
|
|
body, err := ioutil.ReadAll(rt.capturedReq.Body)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
gotBody := string(body)
|
|
if wantBody != gotBody {
|
|
t.Errorf("Bad request body\nwant: %q\n got: %q", wantBody, gotBody)
|
|
}
|
|
|
|
wantOut := Out{"valueA", "valueB"}
|
|
if !reflect.DeepEqual(wantOut, gotOut) {
|
|
t.Errorf("Bad output\nwant: %+v\n got: %+v", wantOut, gotOut)
|
|
}
|
|
}
|
|
|
|
|
|
func TestEscapeXMLText(t *testing.T) {
|
|
t.Parallel()
|
|
tests := []struct {
|
|
input string
|
|
want string
|
|
}{
|
|
{"", ""},
|
|
{"abc123", "abc123"},
|
|
{"<foo>&", "<foo>&"},
|
|
{"\"foo'", "\"foo'"},
|
|
}
|
|
for _, test := range tests {
|
|
test := test
|
|
t.Run(test.input, func(t *testing.T) {
|
|
got := escapeXMLText(test.input)
|
|
if got != test.want {
|
|
t.Errorf("want %q, got %q", test.want, got)
|
|
}
|
|
})
|
|
}
|
|
}
|