1package integration 2 3import ( 4 "context" 5 "testing" 6 7 "github.com/linode/linodego" 8 . "github.com/linode/linodego" 9) 10 11const usernamePrefix = "linodegotest-" 12 13type userModifier func(*linodego.UserCreateOptions) 14 15func TestGetUser_missing(t *testing.T) { 16 client, teardown := createTestClient(t, "fixtures/TestGetUser_missing") 17 defer teardown() 18 19 i, err := client.GetUser(context.Background(), "does-not-exist") 20 if err == nil { 21 t.Errorf("should have received an error requesting a missing user, got %v", i) 22 } 23 e, ok := err.(*Error) 24 if !ok { 25 t.Errorf("should have received an Error requesting a missing user, got %v", e) 26 } 27 28 if e.Code != 404 { 29 t.Errorf("should have received a 404 Code requesting a missing user, got %v", e.Code) 30 } 31} 32 33func TestGetUser(t *testing.T) { 34 username := usernamePrefix + "getuser" 35 email := usernamePrefix + "getuser@example.com" 36 restricted := true 37 38 client, _, teardown := setupUser(t, []userModifier{ 39 func(createOpts *linodego.UserCreateOptions) { 40 createOpts.Username = username 41 createOpts.Email = email 42 createOpts.Restricted = restricted 43 }, 44 }, "fixtures/TestGetUser") 45 defer teardown() 46 47 user, err := client.GetUser(context.TODO(), username) 48 if err != nil { 49 t.Fatalf("failed to get user (%s): %s", username, err) 50 } 51 52 if user.Email != email { 53 t.Errorf("expected user email to be %s; got %s", email, user.Email) 54 } 55 if len(user.SSHKeys) != 0 { 56 t.Error("expected user to have no SSH keys") 57 } 58 if !user.Restricted { 59 t.Error("expected user to be restricted") 60 } 61} 62 63func TestUpdateUser(t *testing.T) { 64 username := usernamePrefix + "updateuser" 65 email := usernamePrefix + "updateuser@example.com" 66 restricted := false 67 68 client, user, teardown := setupUser(t, []userModifier{ 69 func(createOpts *linodego.UserCreateOptions) { 70 createOpts.Username = username 71 createOpts.Email = email 72 createOpts.Restricted = restricted 73 }, 74 }, "fixtures/TestUpdateUser") 75 defer teardown() 76 77 updatedUsername := username + "-updated" 78 restricted = true 79 updateOpts := UserUpdateOptions{ 80 Username: updatedUsername, 81 Restricted: &restricted, 82 } 83 84 updated, err := client.UpdateUser(context.TODO(), username, updateOpts) 85 if err != nil { 86 t.Fatalf("failed to update user (%s): %s", username, err) 87 } 88 // update username to be deleted in teardown 89 user.Username = updatedUsername 90 91 if updated.Username != updatedUsername { 92 t.Errorf("expected username to be %s; got %s", updatedUsername, updated.Username) 93 } 94 if !updated.Restricted { 95 t.Error("expected user to be restricted") 96 } 97} 98 99func TestListUsers(t *testing.T) { 100 username := usernamePrefix + "listuser" 101 email := usernamePrefix + "listuser@example.com" 102 restricted := false 103 104 client, _, teardown := setupUser(t, []userModifier{ 105 func(createOpts *linodego.UserCreateOptions) { 106 createOpts.Username = username 107 createOpts.Email = email 108 createOpts.Restricted = restricted 109 }, 110 }, "fixtures/TestListUsers") 111 defer teardown() 112 113 users, err := client.ListUsers(context.TODO(), nil) 114 if err != nil { 115 t.Fatalf("failed to get users: %s", err) 116 } 117 118 if len(users) == 0 { 119 t.Fatalf("expected at least one user to be returned") 120 } 121 122 var newUser User 123 for _, user := range users { 124 if user.Username == username { 125 newUser = user 126 } 127 } 128 129 if newUser.Email != email { 130 t.Errorf("expected user email to be %s; got %s", email, newUser.Email) 131 } 132 if len(newUser.SSHKeys) != 0 { 133 t.Error("expected user to have no SSH keys") 134 } 135 if newUser.Restricted { 136 t.Error("expected user to not be restricted") 137 } 138} 139 140func createUser(t *testing.T, client *linodego.Client, userModifiers ...userModifier) (*User, func()) { 141 t.Helper() 142 143 var createOpts UserCreateOptions 144 for _, modifier := range userModifiers { 145 modifier(&createOpts) 146 } 147 148 user, err := client.CreateUser(context.TODO(), createOpts) 149 if err != nil { 150 t.Fatalf("failed to create test user: %s", err) 151 } 152 153 return user, func() { 154 if err := client.DeleteUser(context.TODO(), user.Username); err != nil { 155 t.Errorf("failed to delete test user (%s): %s", user.Username, err) 156 } 157 } 158} 159 160func setupUser(t *testing.T, userModifiers []userModifier, fixturesYaml string) (*Client, *User, func()) { 161 t.Helper() 162 client, fixtureTeardown := createTestClient(t, fixturesYaml) 163 164 user, teardown := createUser(t, client, userModifiers...) 165 return client, user, func() { 166 teardown() 167 fixtureTeardown() 168 } 169} 170