Skip to content

Commit 73a1902

Browse files
author
Mooli Tayer
committed
Add HTTP Recording tests
1 parent f5bcf7b commit 73a1902

5 files changed

+1017
-6
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ go_import_path: github.com/moolitayer/awx-client-go
99
install:
1010
- go get github.com/golang/glog
1111
- go get golang.org/x/tools/cmd/goimports
12+
- go get github.com/seborama/govcr
1213

1314
script:
1415
- make verify
1516
- go build ./awx
1617
- for i in examples/*.go; do go build "${i}"; done
1718
- go test ./awx
18-

README.md

+12-5
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@ Install awx-client-go using the "go-get" command:
1010
go get github.com/golang/glog # Dependency
1111
go get github.com/moolitayer/awx-client-go/awx
1212
```
13-
For development also install goimports, needed for "make verify"
14-
```
15-
go get golang.org/x/tools/cmd/goimports
16-
```
1713

1814
## Usage
1915
### import
@@ -32,7 +28,7 @@ connection, err := awx.NewConnectionBuilder().
3228
Bearer("BEARER").
3329
CAFile("/etc/pki/tls/cert.pem").
3430
Insecure(insecure).
35-
Proxy(http://myproxy.example.com).
31+
Proxy("http://myproxy.example.com").
3632
Build() // Create the client
3733
if err != nil {
3834
panic(err)
@@ -122,3 +118,14 @@ See [Job Template](http://docs.ansible.com/ansible-tower/latest/html/userguide/j
122118
## Examples
123119

124120
See [examples](examples).
121+
122+
## Development
123+
124+
### Running Tests
125+
Install development dependencies:
126+
```
127+
go get github.com/seborama/govcr
128+
go get golang.org/x/tools/cmd/goimports
129+
130+
make
131+
```

awx/connection_test.go

+85
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package awx
1818

1919
import (
2020
"testing"
21+
22+
"github.com/seborama/govcr"
2123
)
2224

2325
func TestFilterHeader(t *testing.T) {
@@ -62,5 +64,88 @@ func TestFilterJsonBytes(t *testing.T) {
6264
if string(result) != string(expected) {
6365
t.Errorf("Expected %s, got %s", expected, result)
6466
}
67+
}
68+
69+
// When the api/o endpoint is not available, the server should accquire a token
70+
// through api/v2/users/<name>/personal_tokens
71+
func TestOAUTH2Token(t *testing.T) {
72+
connection, err := NewConnectionBuilder().
73+
Url("http://localhost:9100/api").
74+
Username("admin").
75+
Password("password").
76+
Build()
77+
if err != nil {
78+
t.Error(err)
79+
}
80+
defer connection.Close()
81+
vcr := govcr.NewVCR("connection_oauth2",
82+
&govcr.VCRConfig{
83+
Client: connection.client,
84+
DisableRecording: true,
85+
})
86+
// Replace our HTTPClient with a vcr client wrapping it
87+
connection.client = vcr.Client
88+
projectsResource := connection.Projects()
89+
90+
// Trigger the auth flow.
91+
getProjectsRequest := projectsResource.Get()
92+
if len(connection.token) != 0 || len(connection.bearer) != 0 {
93+
t.Errorf("Connection should have no tokens. token: '%s', bearer: '%s'",
94+
connection.token,
95+
connection.bearer)
96+
}
97+
_, err = getProjectsRequest.Send()
98+
if err != nil {
99+
panic(err)
100+
}
101+
if len(connection.token) != 0 || len(connection.bearer) == 0 {
102+
t.Errorf("Connection should have only a bearer token. token: '%s', bearer: '%s'",
103+
connection.token,
104+
connection.bearer)
105+
}
106+
}
107+
108+
//
109+
// When the api/o endpoint is not available, the server should accquire a token
110+
// through api/v2/authtoken/
111+
func TestPreOAUTH2(t *testing.T) {
112+
//
113+
// Password manuall edited in cassete:
114+
// Basic = printf "admin:PASSWORD"| base64
115+
// Body = printf '{"username":"admin","password":"PASSWORD"}'|base64
116+
connection, err := NewConnectionBuilder().
117+
Url("https://tower.private/api").
118+
Username("admin").
119+
Password("PASSWORD").
120+
Insecure(true).
121+
Build()
122+
if err != nil {
123+
t.Errorf("Error creating connection: %s", err)
124+
}
125+
defer connection.Close()
126+
vcr := govcr.NewVCR("connection_pre_oauth2",
127+
&govcr.VCRConfig{
128+
Client: connection.client,
129+
DisableRecording: true,
130+
})
131+
// Replace our HTTPClient with a vcr client wrapping it
132+
connection.client = vcr.Client
133+
projectsResource := connection.Projects()
65134

135+
// Trigger the auth flow.
136+
getProjectsRequest := projectsResource.Get()
137+
if len(connection.token) != 0 || len(connection.bearer) != 0 {
138+
t.Errorf("Connection should have no tokens. token: '%s', bearer: '%s'",
139+
connection.token,
140+
connection.bearer)
141+
}
142+
_, err = getProjectsRequest.Send()
143+
if err != nil {
144+
t.Errorf("Error sending project request: %s", err)
145+
}
146+
if len(connection.token) == 0 || len(connection.bearer) != 0 {
147+
t.Errorf("Connection should have only an auth token. token: '%s', bearer: '%s'",
148+
connection.token,
149+
connection.bearer)
150+
}
66151
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
{
2+
"Name": "connection_proxy",
3+
"Path": "",
4+
"Tracks": [
5+
{
6+
"Request": {
7+
"Method": "HEAD",
8+
"URL": {
9+
"Scheme": "http",
10+
"Opaque": "",
11+
"User": null,
12+
"Host": "localhost:9100",
13+
"Path": "/api/o/",
14+
"RawPath": "",
15+
"ForceQuery": false,
16+
"RawQuery": "",
17+
"Fragment": ""
18+
},
19+
"Header": {
20+
"Accept": [
21+
"application/json"
22+
],
23+
"Authorization": [
24+
"Basic YWRtaW46cGFzc3dvcmQ="
25+
],
26+
"User-Agent": [
27+
""
28+
]
29+
},
30+
"Body": ""
31+
},
32+
"Response": {
33+
"Status": "200 OK",
34+
"StatusCode": 200,
35+
"Proto": "HTTP/1.1",
36+
"ProtoMajor": 1,
37+
"ProtoMinor": 1,
38+
"Header": {
39+
"Allow": [
40+
"GET, HEAD, OPTIONS"
41+
],
42+
"Connection": [
43+
"keep-alive"
44+
],
45+
"Content-Language": [
46+
"en"
47+
],
48+
"Content-Length": [
49+
"95"
50+
],
51+
"Content-Type": [
52+
"application/json"
53+
],
54+
"Date": [
55+
"Wed, 09 May 2018 10:04:35 GMT"
56+
],
57+
"Server": [
58+
"nginx/1.12.2"
59+
],
60+
"Strict-Transport-Security": [
61+
"max-age=15768000"
62+
],
63+
"Vary": [
64+
"Accept, Accept-Language, Cookie"
65+
],
66+
"X-Api-Node": [
67+
"awx"
68+
],
69+
"X-Api-Time": [
70+
"0.151s"
71+
],
72+
"X-Api-Total-Time": [
73+
"0.153s"
74+
]
75+
},
76+
"Body": null,
77+
"ContentLength": 95,
78+
"TransferEncoding": null,
79+
"Trailer": null,
80+
"TLS": null
81+
},
82+
"ErrType": "",
83+
"ErrMsg": ""
84+
},
85+
{
86+
"Request": {
87+
"Method": "POST",
88+
"URL": {
89+
"Scheme": "http",
90+
"Opaque": "",
91+
"User": null,
92+
"Host": "localhost:9100",
93+
"Path": "/api/v2/users/admin/personal_tokens/",
94+
"RawPath": "",
95+
"ForceQuery": false,
96+
"RawQuery": "",
97+
"Fragment": ""
98+
},
99+
"Header": {
100+
"Accept": [
101+
"application/json"
102+
],
103+
"Authorization": [
104+
"Basic YWRtaW46cGFzc3dvcmQ="
105+
],
106+
"Content-Type": [
107+
"application/json"
108+
],
109+
"User-Agent": [
110+
""
111+
]
112+
},
113+
"Body": "eyJkZXNjcmlwdGlvbiI6IkFXWCBHbyBDbGllbnQiLCJhcHBsaWNhdGlvbiI6bnVsbCwic2NvcGUiOiJ3cml0ZSJ9"
114+
},
115+
"Response": {
116+
"Status": "201 Created",
117+
"StatusCode": 201,
118+
"Proto": "HTTP/1.1",
119+
"ProtoMajor": 1,
120+
"ProtoMinor": 1,
121+
"Header": {
122+
"Allow": [
123+
"GET, POST, HEAD, OPTIONS"
124+
],
125+
"Connection": [
126+
"keep-alive"
127+
],
128+
"Content-Language": [
129+
"en"
130+
],
131+
"Content-Length": [
132+
"498"
133+
],
134+
"Content-Type": [
135+
"application/json"
136+
],
137+
"Date": [
138+
"Wed, 09 May 2018 10:04:35 GMT"
139+
],
140+
"Location": [
141+
"/api/v2/tokens/2/"
142+
],
143+
"Server": [
144+
"nginx/1.12.2"
145+
],
146+
"Strict-Transport-Security": [
147+
"max-age=15768000"
148+
],
149+
"Vary": [
150+
"Accept, Accept-Language, Cookie"
151+
],
152+
"X-Api-Node": [
153+
"awx"
154+
],
155+
"X-Api-Time": [
156+
"0.046s"
157+
],
158+
"X-Api-Total-Time": [
159+
"0.051s"
160+
]
161+
},
162+
"Body": "eyJpZCI6MiwidHlwZSI6Im9fYXV0aDJfYWNjZXNzX3Rva2VuIiwidXJsIjoiL2FwaS92Mi90b2tlbnMvMi8iLCJyZWxhdGVkIjp7InVzZXIiOiIvYXBpL3YyL3VzZXJzLzEvIiwiYWN0aXZpdHlfc3RyZWFtIjoiL2FwaS92Mi90b2tlbnMvMi9hY3Rpdml0eV9zdHJlYW0vIn0sInN1bW1hcnlfZmllbGRzIjp7InVzZXIiOnsiaWQiOjEsInVzZXJuYW1lIjoiYWRtaW4iLCJmaXJzdF9uYW1lIjoiIiwibGFzdF9uYW1lIjoiIn19LCJjcmVhdGVkIjoiMjAxOC0wNS0wOVQxMDowNDozNS41MDIwMDFaIiwibW9kaWZpZWQiOiIyMDE4LTA1LTA5VDEwOjA0OjM1LjUwODU3MFoiLCJkZXNjcmlwdGlvbiI6IkFXWCBHbyBDbGllbnQiLCJ1c2VyIjoxLCJ0b2tlbiI6IlY5QnFsTTVkTlhmYW5CaTVyUXVGVk9DYndSdUREViIsInJlZnJlc2hfdG9rZW4iOm51bGwsImFwcGxpY2F0aW9uIjpudWxsLCJleHBpcmVzIjoiMzAxNy0wOS0wOVQxMDowNDozNS41MDE1MThaIiwic2NvcGUiOiJ3cml0ZSJ9",
163+
"ContentLength": 498,
164+
"TransferEncoding": null,
165+
"Trailer": null,
166+
"TLS": null
167+
},
168+
"ErrType": "",
169+
"ErrMsg": ""
170+
},
171+
{
172+
"Request": {
173+
"Method": "GET",
174+
"URL": {
175+
"Scheme": "http",
176+
"Opaque": "",
177+
"User": null,
178+
"Host": "localhost:9100",
179+
"Path": "/api/v2/projects/",
180+
"RawPath": "",
181+
"ForceQuery": false,
182+
"RawQuery": "",
183+
"Fragment": ""
184+
},
185+
"Header": {
186+
"Accept": [
187+
"application/json"
188+
],
189+
"Authorization": [
190+
"Bearer V9BqlM5dNXfanBi5rQuFVOCbwRuDDV"
191+
],
192+
"User-Agent": [
193+
""
194+
]
195+
},
196+
"Body": ""
197+
},
198+
"Response": {
199+
"Status": "200 OK",
200+
"StatusCode": 200,
201+
"Proto": "HTTP/1.1",
202+
"ProtoMajor": 1,
203+
"ProtoMinor": 1,
204+
"Header": {
205+
"Allow": [
206+
"GET, POST, HEAD, OPTIONS"
207+
],
208+
"Connection": [
209+
"keep-alive"
210+
],
211+
"Content-Language": [
212+
"en"
213+
],
214+
"Content-Length": [
215+
"2339"
216+
],
217+
"Content-Type": [
218+
"application/json"
219+
],
220+
"Date": [
221+
"Wed, 09 May 2018 10:04:35 GMT"
222+
],
223+
"Server": [
224+
"nginx/1.12.2"
225+
],
226+
"Strict-Transport-Security": [
227+
"max-age=15768000"
228+
],
229+
"Vary": [
230+
"Accept, Accept-Language, Cookie"
231+
],
232+
"X-Api-Node": [
233+
"awx"
234+
],
235+
"X-Api-Time": [
236+
"0.122s"
237+
],
238+
"X-Api-Total-Time": [
239+
"0.127s"
240+
]
241+
},
242+
"Body": "eyJjb3VudCI6MSwibmV4dCI6bnVsbCwicHJldmlvdXMiOm51bGwsInJlc3VsdHMiOlt7ImlkIjo0LCJ0eXBlIjoicHJvamVjdCIsInVybCI6Ii9hcGkvdjIvcHJvamVjdHMvNC8iLCJyZWxhdGVkIjp7ImNyZWF0ZWRfYnkiOiIvYXBpL3YyL3VzZXJzLzEvIiwibW9kaWZpZWRfYnkiOiIvYXBpL3YyL3VzZXJzLzEvIiwibm90aWZpY2F0aW9uX3RlbXBsYXRlc19lcnJvciI6Ii9hcGkvdjIvcHJvamVjdHMvNC9ub3RpZmljYXRpb25fdGVtcGxhdGVzX2Vycm9yLyIsIm5vdGlmaWNhdGlvbl90ZW1wbGF0ZXNfc3VjY2VzcyI6Ii9hcGkvdjIvcHJvamVjdHMvNC9ub3RpZmljYXRpb25fdGVtcGxhdGVzX3N1Y2Nlc3MvIiwib2JqZWN0X3JvbGVzIjoiL2FwaS92Mi9wcm9qZWN0cy80L29iamVjdF9yb2xlcy8iLCJub3RpZmljYXRpb25fdGVtcGxhdGVzX2FueSI6Ii9hcGkvdjIvcHJvamVjdHMvNC9ub3RpZmljYXRpb25fdGVtcGxhdGVzX2FueS8iLCJjb3B5IjoiL2FwaS92Mi9wcm9qZWN0cy80L2NvcHkvIiwicHJvamVjdF91cGRhdGVzIjoiL2FwaS92Mi9wcm9qZWN0cy80L3Byb2plY3RfdXBkYXRlcy8iLCJ1cGRhdGUiOiIvYXBpL3YyL3Byb2plY3RzLzQvdXBkYXRlLyIsImFjY2Vzc19saXN0IjoiL2FwaS92Mi9wcm9qZWN0cy80L2FjY2Vzc19saXN0LyIsInRlYW1zIjoiL2FwaS92Mi9wcm9qZWN0cy80L3RlYW1zLyIsInNjbV9pbnZlbnRvcnlfc291cmNlcyI6Ii9hcGkvdjIvcHJvamVjdHMvNC9zY21faW52ZW50b3J5X3NvdXJjZXMvIiwiaW52ZW50b3J5X2ZpbGVzIjoiL2FwaS92Mi9wcm9qZWN0cy80L2ludmVudG9yaWVzLyIsInNjaGVkdWxlcyI6Ii9hcGkvdjIvcHJvamVjdHMvNC9zY2hlZHVsZXMvIiwicGxheWJvb2tzIjoiL2FwaS92Mi9wcm9qZWN0cy80L3BsYXlib29rcy8iLCJhY3Rpdml0eV9zdHJlYW0iOiIvYXBpL3YyL3Byb2plY3RzLzQvYWN0aXZpdHlfc3RyZWFtLyIsIm9yZ2FuaXphdGlvbiI6Ii9hcGkvdjIvb3JnYW5pemF0aW9ucy8xLyJ9LCJzdW1tYXJ5X2ZpZWxkcyI6eyJvcmdhbml6YXRpb24iOnsiaWQiOjEsIm5hbWUiOiJEZWZhdWx0IiwiZGVzY3JpcHRpb24iOiIifSwiY3JlYXRlZF9ieSI6eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImZpcnN0X25hbWUiOiIiLCJsYXN0X25hbWUiOiIifSwibW9kaWZpZWRfYnkiOnsiaWQiOjEsInVzZXJuYW1lIjoiYWRtaW4iLCJmaXJzdF9uYW1lIjoiIiwibGFzdF9uYW1lIjoiIn0sIm9iamVjdF9yb2xlcyI6eyJhZG1pbl9yb2xlIjp7ImlkIjoxNCwiZGVzY3JpcHRpb24iOiJDYW4gbWFuYWdlIGFsbCBhc3BlY3RzIG9mIHRoZSBwcm9qZWN0IiwibmFtZSI6IkFkbWluIn0sInVzZV9yb2xlIjp7ImlkIjoxNiwiZGVzY3JpcHRpb24iOiJDYW4gdXNlIHRoZSBwcm9qZWN0IGluIGEgam9iIHRlbXBsYXRlIiwibmFtZSI6IlVzZSJ9LCJ1cGRhdGVfcm9sZSI6eyJpZCI6MTcsImRlc2NyaXB0aW9uIjoiTWF5IHVwZGF0ZSBwcm9qZWN0IG9yIGludmVudG9yeSBvciBncm91cCB1c2luZyB0aGUgY29uZmlndXJlZCBzb3VyY2UgdXBkYXRlIHN5c3RlbSIsIm5hbWUiOiJVcGRhdGUifSwicmVhZF9yb2xlIjp7ImlkIjoxNSwiZGVzY3JpcHRpb24iOiJNYXkgdmlldyBzZXR0aW5ncyBmb3IgdGhlIHByb2plY3QiLCJuYW1lIjoiUmVhZCJ9fSwidXNlcl9jYXBhYmlsaXRpZXMiOnsiZWRpdCI6dHJ1ZSwic3RhcnQiOnRydWUsImNvcHkiOnRydWUsInNjaGVkdWxlIjp0cnVlLCJkZWxldGUiOnRydWV9fSwiY3JlYXRlZCI6IjIwMTgtMDUtMDlUMTA6MDE6NTYuNDc5MDI4WiIsIm1vZGlmaWVkIjoiMjAxOC0wNS0wOVQxMDowMTo1Ni41MzEyNDhaIiwibmFtZSI6IkRlbW8gUHJvamVjdCIsImRlc2NyaXB0aW9uIjoiIiwibG9jYWxfcGF0aCI6Il80X19kZW1vX3Byb2plY3QiLCJzY21fdHlwZSI6ImdpdCIsInNjbV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYW5zaWJsZS9hbnNpYmxlLXRvd2VyLXNhbXBsZXMiLCJzY21fYnJhbmNoIjoiIiwic2NtX2NsZWFuIjpmYWxzZSwic2NtX2RlbGV0ZV9vbl91cGRhdGUiOmZhbHNlLCJjcmVkZW50aWFsIjpudWxsLCJ0aW1lb3V0IjowLCJsYXN0X2pvYl9ydW4iOm51bGwsImxhc3Rfam9iX2ZhaWxlZCI6ZmFsc2UsIm5leHRfam9iX3J1biI6bnVsbCwic3RhdHVzIjoibmV2ZXIgdXBkYXRlZCIsIm9yZ2FuaXphdGlvbiI6MSwic2NtX2RlbGV0ZV9vbl9uZXh0X3VwZGF0ZSI6ZmFsc2UsInNjbV91cGRhdGVfb25fbGF1bmNoIjp0cnVlLCJzY21fdXBkYXRlX2NhY2hlX3RpbWVvdXQiOjAsInNjbV9yZXZpc2lvbiI6IiIsImN1c3RvbV92aXJ0dWFsZW52IjpudWxsLCJsYXN0X3VwZGF0ZV9mYWlsZWQiOmZhbHNlLCJsYXN0X3VwZGF0ZWQiOm51bGx9XX0=",
243+
"ContentLength": 2339,
244+
"TransferEncoding": null,
245+
"Trailer": null,
246+
"TLS": null
247+
},
248+
"ErrType": "",
249+
"ErrMsg": ""
250+
}
251+
]
252+
}

0 commit comments

Comments
 (0)