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