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  }