@@ -19,23 +19,30 @@ import (
1919 "net/http/httptest"
2020 "reflect"
2121 "strconv"
22+ "strings"
2223 "testing"
2324
2425 "github.com/coreos/fleet/client"
2526 "github.com/coreos/fleet/machine"
2627 "github.com/coreos/fleet/registry"
2728)
2829
29- func TestMachinesList ( t * testing. T ) {
30+ func fakeMachinesSetup () ( * machinesResource , * httptest. ResponseRecorder ) {
3031 fr := registry .NewFakeRegistry ()
3132 fr .SetMachines ([]machine.MachineState {
32- {ID : "XXX" , PublicIP : "" , Metadata : nil },
33+ {ID : "XXX" , PublicIP : "" , Metadata : map [ string ] string {} },
3334 {ID : "YYY" , PublicIP : "1.2.3.4" , Metadata : map [string ]string {"ping" : "pong" }},
3435 })
3536 fAPI := & client.RegistryClient {Registry : fr }
3637 resource := & machinesResource {cAPI : fAPI }
3738 rw := httptest .NewRecorder ()
38- req , err := http .NewRequest ("GET" , "http://example.com" , nil )
39+
40+ return resource , rw
41+ }
42+
43+ func TestMachinesList (t * testing.T ) {
44+ resource , rw := fakeMachinesSetup ()
45+ req , err := http .NewRequest ("GET" , "http://example.com/machines" , nil )
3946 if err != nil {
4047 t .Fatalf ("Failed creating http.Request: %v" , err )
4148 }
@@ -63,11 +70,23 @@ func TestMachinesList(t *testing.T) {
6370 }
6471}
6572
73+ func TestMachinesListBadMethod (t * testing.T ) {
74+ resource , rw := fakeMachinesSetup ()
75+ req , err := http .NewRequest ("POST" , "http://example.com/machines" , nil )
76+ if err != nil {
77+ t .Fatalf ("Failed creating http.Request: %v" , err )
78+ }
79+
80+ resource .ServeHTTP (rw , req )
81+
82+ err = assertErrorResponse (rw , http .StatusMethodNotAllowed )
83+ if err != nil {
84+ t .Error (err .Error ())
85+ }
86+ }
87+
6688func TestMachinesListBadNextPageToken (t * testing.T ) {
67- fr := registry .NewFakeRegistry ()
68- fAPI := & client.RegistryClient {Registry : fr }
69- resource := & machinesResource {fAPI }
70- rw := httptest .NewRecorder ()
89+ resource , rw := fakeMachinesSetup ()
7190 req , err := http .NewRequest ("GET" , "http://example.com/machines?nextPageToken=EwBMLg==" , nil )
7291 if err != nil {
7392 t .Fatalf ("Failed creating http.Request: %v" , err )
@@ -136,3 +155,126 @@ func TestExtractMachinePage(t *testing.T) {
136155 }
137156 }
138157}
158+
159+ func TestMachinesPatchAddModify (t * testing.T ) {
160+ reqBody := `
161+ [{"op": "add", "path": "/XXX/metadata/foo", "value": "bar"},
162+ {"op": "replace", "path": "/YYY/metadata/ping", "value": "splat"}]
163+ `
164+
165+ resource , rw := fakeMachinesSetup ()
166+ req , err := http .NewRequest ("PATCH" , "http://example.com/machines" , strings .NewReader (reqBody ))
167+ if err != nil {
168+ t .Fatalf ("Failed creating http.Request: %v" , err )
169+ }
170+
171+ resource .ServeHTTP (rw , req )
172+ if rw .Code != http .StatusNoContent {
173+ t .Errorf ("Expected 204, got %d" , rw .Code )
174+ }
175+
176+ // fetch machine to make sure data has been added
177+ req , err = http .NewRequest ("GET" , "http://example.com/machines" , nil )
178+ if err != nil {
179+ t .Fatalf ("Failed creating http.Request: %v" , err )
180+ }
181+ rw .Body .Reset ()
182+ resource .ServeHTTP (rw , req )
183+
184+ if rw .Body == nil {
185+ t .Error ("Received nil response body" )
186+ } else {
187+ body := rw .Body .String ()
188+ expected := `{"machines":[{"id":"XXX","metadata":{"foo":"bar"}},{"id":"YYY","metadata":{"ping":"splat"},"primaryIP":"1.2.3.4"}]}`
189+ if body != expected {
190+ t .Errorf ("Expected body:\n %s\n \n Received body:\n %s\n " , expected , body )
191+ }
192+ }
193+ }
194+
195+ func TestMachinesPatchDelete (t * testing.T ) {
196+ reqBody := `
197+ [{"op": "remove", "path": "/XXX/metadata/foo"},
198+ {"op": "remove", "path": "/YYY/metadata/ping"}]
199+ `
200+
201+ resource , rw := fakeMachinesSetup ()
202+ req , err := http .NewRequest ("PATCH" , "http://example.com/machines" , strings .NewReader (reqBody ))
203+ if err != nil {
204+ t .Fatalf ("Failed creating http.Request: %v" , err )
205+ }
206+
207+ resource .ServeHTTP (rw , req )
208+ if rw .Code != http .StatusNoContent {
209+ t .Errorf ("Expected 204, got %d" , rw .Code )
210+ }
211+
212+ // fetch machine to make sure data has been added
213+ req , err = http .NewRequest ("GET" , "http://example.com/machines" , nil )
214+ if err != nil {
215+ t .Fatalf ("Failed creating http.Request: %v" , err )
216+ }
217+ rw .Body .Reset ()
218+ resource .ServeHTTP (rw , req )
219+
220+ if rw .Body == nil {
221+ t .Error ("Received nil response body" )
222+ } else {
223+ body := rw .Body .String ()
224+ expected := `{"machines":[{"id":"XXX"},{"id":"YYY","primaryIP":"1.2.3.4"}]}`
225+ if body != expected {
226+ t .Errorf ("Expected body:\n %s\n \n Received body:\n %s\n " , expected , body )
227+ }
228+ }
229+ }
230+
231+ func TestMachinesPatchBadOp (t * testing.T ) {
232+ reqBody := `
233+ [{"op": "noop", "path": "/XXX/metadata/foo", "value": "bar"}]
234+ `
235+
236+ resource , rw := fakeMachinesSetup ()
237+ req , err := http .NewRequest ("PATCH" , "http://example.com/machines" , strings .NewReader (reqBody ))
238+ if err != nil {
239+ t .Fatalf ("Failed creating http.Request: %v" , err )
240+ }
241+
242+ resource .ServeHTTP (rw , req )
243+ if rw .Code != http .StatusBadRequest {
244+ t .Errorf ("Expected 400, got %d" , rw .Code )
245+ }
246+ }
247+
248+ func TestMachinesPatchBadPath (t * testing.T ) {
249+ reqBody := `
250+ [{"op": "add", "path": "/XXX/foo", "value": "bar"}]
251+ `
252+
253+ resource , rw := fakeMachinesSetup ()
254+ req , err := http .NewRequest ("PATCH" , "http://example.com/machines" , strings .NewReader (reqBody ))
255+ if err != nil {
256+ t .Fatalf ("Failed creating http.Request: %v" , err )
257+ }
258+
259+ resource .ServeHTTP (rw , req )
260+ if rw .Code != http .StatusBadRequest {
261+ t .Errorf ("Expected 400, got %d" , rw .Code )
262+ }
263+ }
264+
265+ func TestMachinesPatchBadValue (t * testing.T ) {
266+ reqBody := `
267+ [{"op": "add", "path": "/XXX/foo"}]
268+ `
269+
270+ resource , rw := fakeMachinesSetup ()
271+ req , err := http .NewRequest ("PATCH" , "http://example.com/machines" , strings .NewReader (reqBody ))
272+ if err != nil {
273+ t .Fatalf ("Failed creating http.Request: %v" , err )
274+ }
275+
276+ resource .ServeHTTP (rw , req )
277+ if rw .Code != http .StatusBadRequest {
278+ t .Errorf ("Expected 400, got %d" , rw .Code )
279+ }
280+ }
0 commit comments