github.com/go-chef/chef@v0.30.1/user_test.go (about) 1 package chef 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "log" 8 "net/http" 9 "os" 10 "reflect" 11 "testing" 12 13 "github.com/r3labs/diff" 14 ) 15 16 var ( 17 testUserJSON = "test/user.json" 18 testVerboseUserJSON = "test/verbose_user.json" 19 ) 20 21 func TestUserFromJSONDecoder(t *testing.T) { 22 if file, err := os.Open(testUserJSON); err != nil { 23 t.Error("Unexpected error '", err, "' during os.Open on", testUserJSON) 24 } else { 25 dec := json.NewDecoder(file) 26 var g User 27 if err := dec.Decode(&g); err == io.EOF { 28 log.Fatal(g) 29 } else if err != nil { 30 log.Fatal(err) 31 } 32 } 33 } 34 35 func TestVerboseUserFromJSONDecoder(t *testing.T) { 36 if file, err := os.Open(testVerboseUserJSON); err != nil { 37 t.Error("Unexpected error '", err, "' during os.Open on", testVerboseUserJSON) 38 } else { 39 dec := json.NewDecoder(file) 40 var g User 41 if err := dec.Decode(&g); err == io.EOF { 42 log.Fatal(g) 43 } else if err != nil { 44 log.Fatal(err) 45 } 46 } 47 } 48 49 func TestUserslist(t *testing.T) { 50 setup() 51 defer teardown() 52 53 mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { 54 switch { 55 case r.Method == "GET": 56 fmt.Fprintf(w, `{ "user_name1": "https://url/for/user_name1", "user_name2": "https://url/for/user_name2"}`) 57 } 58 }) 59 60 // Test list 61 users, err := client.Users.List() 62 if err != nil { 63 t.Errorf("Users.List returned error: %v", err) 64 } 65 listWant := map[string]string{"user_name1": "https://url/for/user_name1", "user_name2": "https://url/for/user_name2"} 66 if !reflect.DeepEqual(users, listWant) { 67 t.Errorf("Users.List returned %+v, want %+v", users, listWant) 68 } 69 } 70 71 func TestVerboseUserslist(t *testing.T) { 72 setup() 73 defer teardown() 74 75 mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { 76 switch { 77 case r.Method == "GET": 78 fmt.Fprintf(w, `{ 79 "janechef": { "email": "jane.chef@user.com", "first_name": "jane", "last_name": "chef_user" }, 80 "yaelsmith": { "email": "yael.chef@user.com", "first_name": "yael", "last_name": "smith" } 81 }`) 82 83 } 84 }) 85 86 // Test list 87 users, err := client.Users.VerboseList() 88 if err != nil { 89 t.Errorf("Verbose Users.List returned error: %v", err) 90 } 91 jane := UserVerboseResult{Email: "jane.chef@user.com", FirstName: "jane", LastName: "chef_user"} 92 yael := UserVerboseResult{Email: "yael.chef@user.com", FirstName: "yael", LastName: "smith"} 93 listWant := map[string]UserVerboseResult{"janechef": jane, "yaelsmith": yael} 94 if !reflect.DeepEqual(users, listWant) { 95 t.Errorf("Verbose Users.List returned %+v, want %+v", users, listWant) 96 } 97 } 98 99 func TestUserCreate(t *testing.T) { 100 setup() 101 defer teardown() 102 103 mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { 104 switch { 105 case r.Method == "POST": 106 fmt.Fprintf(w, `{ 107 "uri": "https://chefserver/users/user_name1", 108 "chef_key": { 109 "name": "default", 110 "public_key": "-----BEGIN RSA PUBLIC KEY-----", 111 "expiration_date": "infinity", 112 "uri": "https://chefserver/users/user_name1/keys/default", 113 "private_key": "-----BEGIN RSA PRIVATE KEY-----" 114 } 115 }`) 116 } 117 }) 118 119 // Create User 120 user := User{UserName: "user_name1", Email: "user_name1@mail.com", Password: "dummypass"} 121 userresult, err := client.Users.Create(user) 122 if err != nil { 123 t.Errorf("Users.Create returned error: %v", err) 124 } 125 Want := UserResult{Uri: "https://chefserver/users/user_name1", 126 ChefKey: ChefKey{ 127 Name: "default", 128 PublicKey: "-----BEGIN RSA PUBLIC KEY-----", 129 ExpirationDate: "infinity", 130 Uri: "https://chefserver/users/user_name1/keys/default", 131 PrivateKey: "-----BEGIN RSA PRIVATE KEY-----", 132 }, 133 } 134 if !reflect.DeepEqual(userresult, Want) { 135 t.Errorf("Users.Create returned %+v, want %+v", userresult, Want) 136 } 137 } 138 139 func TestUserGet(t *testing.T) { 140 setup() 141 defer teardown() 142 143 mux.HandleFunc("/users/user1", func(w http.ResponseWriter, r *http.Request) { 144 switch { 145 case r.Method == "GET": 146 fmt.Fprintf(w, `{ 147 "username": "user1", 148 "display_name": "User Name", 149 "email": "user1@mail.com", 150 "external_authentication_uid": "user1", 151 "first_name": "User", 152 "last_name": "Name", 153 "middle_name": "S", 154 "public_key": "-----BEGIN RSA PUBLIC KEY-----", 155 "recovery_authentication_enabled": true 156 }`) 157 } 158 }) 159 160 // Get User 161 user, err := client.Users.Get("user1") 162 if err != nil { 163 t.Errorf("User.Get returned error: %v", err) 164 } 165 Want := User{UserName: "user1", DisplayName: "User Name", Email: "user1@mail.com", ExternalAuthenticationUid: "user1", FirstName: "User", LastName: "Name", MiddleName: "S", PublicKey: "-----BEGIN RSA PUBLIC KEY-----", RecoveryAuthenticationEnabled: true} 166 if !reflect.DeepEqual(user, Want) { 167 t.Errorf("Users.Get returned %+v, want %+v", user, Want) 168 } 169 } 170 171 func TestUserDelete(t *testing.T) { 172 setup() 173 defer teardown() 174 175 mux.HandleFunc("/users/user1", func(w http.ResponseWriter, r *http.Request) { 176 switch { 177 case r.Method == "DELETE": 178 w.WriteHeader(http.StatusOK) 179 fmt.Fprintf(w, `{ 180 }`) 181 } 182 }) 183 184 // DELETE User 185 err := client.Users.Delete("user1") 186 if err != nil { 187 t.Errorf("User.Get returned error: %v", err) 188 } 189 } 190 191 func TestUserUpdate(t *testing.T) { 192 setup() 193 defer teardown() 194 195 mux.HandleFunc("/users/user_name1", func(w http.ResponseWriter, r *http.Request) { 196 switch { 197 case r.Method == "PUT": 198 fmt.Fprintf(w, `{ 199 "uri": "https://chefserver/users/user_name1" 200 }`) 201 } 202 }) 203 204 // Update User 205 user := User{UserName: "user_name1", Email: "user_name1@mail.com", Password: "dummypass"} 206 userresult, err := client.Users.Update("user_name1", user) 207 if err != nil { 208 t.Errorf("Users.Update returned error: %v", err) 209 } 210 Want := UserResult{Uri: "https://chefserver/users/user_name1"} 211 if !reflect.DeepEqual(userresult, Want) { 212 t.Errorf("Users.Update returned %+v, want %+v", userresult, Want) 213 } 214 } 215 216 func TestListKeys(t *testing.T) { 217 setup() 218 defer teardown() 219 220 mux.HandleFunc("/users/user1/keys", func(w http.ResponseWriter, r *http.Request) { 221 switch { 222 case r.Method == "GET": 223 fmt.Fprintf(w, `[ 224 { 225 "name": "default", 226 "uri": "https://chefserver/users/user1/keys/default", 227 "expired": false 228 } 229 ]`) 230 } 231 }) 232 233 keyresult, err := client.Users.ListKeys("user1") 234 if err != nil { 235 t.Errorf("Users.ListKeys returned error: %v", err) 236 } 237 defaultItem := KeyItem{ 238 Name: "default", 239 Uri: "https://chefserver/users/user1/keys/default", 240 Expired: false, 241 } 242 Want := []KeyItem{defaultItem} 243 if !reflect.DeepEqual(keyresult, Want) { 244 t.Errorf("Users.ListKeys returned %+v, want %+v", keyresult, Want) 245 } 246 } 247 248 func TestAddKey(t *testing.T) { 249 setup() 250 defer teardown() 251 252 mux.HandleFunc("/users/user1/keys", func(w http.ResponseWriter, r *http.Request) { 253 switch { 254 case r.Method == "POST": 255 fmt.Fprintf(w, `{ 256 "name": "newkey", 257 "uri": "https://chefserver/users/user1/keys/newkey", 258 "expired": false 259 }`) 260 } 261 }) 262 263 keyadd := AccessKey{ 264 Name: "newkey", 265 PublicKey: "RSA KEY", 266 ExpirationDate: "infinity", 267 } 268 keyresult, err := client.Users.AddKey("user1", keyadd) 269 if err != nil { 270 t.Errorf("Users.AddKey returned error: %v", err) 271 } 272 Want := KeyItem{ 273 Name: "newkey", 274 Uri: "https://chefserver/users/user1/keys/newkey", 275 Expired: false, 276 } 277 if !reflect.DeepEqual(keyresult, Want) { 278 t.Errorf("Users.AddKey returned %+v, want %+v", keyresult, Want) 279 } 280 } 281 282 func TestDeleteKey(t *testing.T) { 283 setup() 284 defer teardown() 285 286 mux.HandleFunc("/users/user1/keys/newkey", func(w http.ResponseWriter, r *http.Request) { 287 switch { 288 case r.Method == "DELETE": 289 fmt.Fprintf(w, `{ 290 "name": "newkey", 291 "public_key": "RSA KEY", 292 "expiration_date": "infinity" 293 }`) 294 } 295 }) 296 297 keyresult, err := client.Users.DeleteKey("user1", "newkey") 298 if err != nil { 299 t.Errorf("Users.DeleteKey returned error: %v", err) 300 } 301 Want := AccessKey{ 302 Name: "newkey", 303 PublicKey: "RSA KEY", 304 ExpirationDate: "infinity", 305 } 306 if !reflect.DeepEqual(keyresult, Want) { 307 diff, _ := diff.Diff(keyresult, Want) 308 t.Errorf("Users.DeleteKey returned %+v, want %+v, differences %+v", keyresult, Want, diff) 309 } 310 } 311 312 func TestGetKey(t *testing.T) { 313 setup() 314 defer teardown() 315 316 mux.HandleFunc("/users/user1/keys/newkey", func(w http.ResponseWriter, r *http.Request) { 317 switch { 318 case r.Method == "GET": 319 fmt.Fprintf(w, `{ 320 "name": "newkey", 321 "public_key": "RSA KEY", 322 "expiration_date": "infinity" 323 }`) 324 } 325 }) 326 327 keyresult, err := client.Users.GetKey("user1", "newkey") 328 if err != nil { 329 t.Errorf("Users.GetKey returned error: %v", err) 330 } 331 Want := AccessKey{ 332 Name: "newkey", 333 PublicKey: "RSA KEY", 334 ExpirationDate: "infinity", 335 } 336 if !reflect.DeepEqual(keyresult, Want) { 337 diff, _ := diff.Diff(keyresult, Want) 338 t.Errorf("Users.GetKey returned %+v, want %+v, differences %+v", keyresult, Want, diff) 339 } 340 } 341 342 func TestUpdateKey(t *testing.T) { 343 setup() 344 defer teardown() 345 346 mux.HandleFunc("/users/user1/keys/newkey", func(w http.ResponseWriter, r *http.Request) { 347 switch { 348 case r.Method == "PUT": 349 fmt.Fprintf(w, `{ 350 "name": "newkey", 351 "public_key": "RSA NEW KEY", 352 "expiration_date": "infinity" 353 }`) 354 } 355 }) 356 357 updKey := AccessKey{ 358 Name: "newkey", 359 PublicKey: "RSA NEW KEY", 360 ExpirationDate: "infinity", 361 } 362 keyresult, err := client.Users.UpdateKey("user1", "newkey", updKey) 363 if err != nil { 364 t.Errorf("Users.UpdateKey returned error: %v", err) 365 } 366 Want := AccessKey{ 367 Name: "newkey", 368 PublicKey: "RSA NEW KEY", 369 ExpirationDate: "infinity", 370 } 371 if !reflect.DeepEqual(keyresult, Want) { 372 diff, _ := diff.Diff(keyresult, Want) 373 t.Errorf("Users.UpdateKey returned %+v, want %+v, differences %+v", keyresult, Want, diff) 374 } 375 }