auth
auth/client_test.go
Include client updates and tests. Flesh out updating clients, and include unit tests to ensure that clientstores actually update appropriately. Add TODO comments where functionality is planned but stubbed out.
1 package auth
3 import (
4 "fmt"
5 "testing"
7 "secondbit.org/uuid"
8 )
10 const (
11 clientChangeSecret = 1 << iota
12 clientChangeRedirectURI
13 clientChangeOwnerID
14 clientChangeName
15 clientChangeLogo
16 clientChangeWebsite
17 )
19 var clientStores = []ClientStore{NewMemstore()}
21 func compareClients(client1, client2 Client) (success bool, field string, val1, val2 interface{}) {
22 if !client1.ID.Equal(client2.ID) {
23 return false, "ID", client1.ID, client2.ID
24 }
25 if client1.Secret != client2.Secret {
26 return false, "secret", client1.Secret, client2.Secret
27 }
28 if client1.RedirectURI != client2.RedirectURI {
29 return false, "redirect URI", client1.RedirectURI, client2.RedirectURI
30 }
31 if !client1.OwnerID.Equal(client2.OwnerID) {
32 return false, "owner ID", client1.OwnerID, client2.OwnerID
33 }
34 if client1.Name != client2.Name {
35 return false, "name", client1.Name, client2.Name
36 }
37 if client1.Logo != client2.Logo {
38 return false, "logo", client1.Logo, client2.Logo
39 }
40 if client1.Website != client2.Website {
41 return false, "website", client1.Website, client2.Website
42 }
43 return true, "", nil, nil
44 }
46 func TestClientStoreSuccess(t *testing.T) {
47 t.Parallel()
48 client := Client{
49 ID: uuid.NewID(),
50 Secret: "secret",
51 RedirectURI: "redirectURI",
52 OwnerID: uuid.NewID(),
53 Name: "name",
54 Logo: "logo",
55 Website: "website",
56 }
57 for _, store := range clientStores {
58 err := store.SaveClient(client)
59 if err != nil {
60 t.Errorf("Error saving client to %T: %s", store, err)
61 }
62 err = store.SaveClient(client)
63 if err != ErrClientAlreadyExists {
64 t.Errorf("Expected ErrClientAlreadyExists, got %v from %T", err, store)
65 }
66 retrieved, err := store.GetClient(client.ID)
67 if err != nil {
68 t.Errorf("Error retrieving client from %T: %s", store, err)
69 }
70 success, field, expectation, result := compareClients(client, retrieved)
71 if !success {
72 t.Errorf("Expected field %s to be %v, but %T returned %v", field, expectation, store, result)
73 }
74 clients, err := store.ListClientsByOwner(client.OwnerID, 25, 0)
75 if err != nil {
76 t.Errorf("Error retrieving clients by owner from %T: %s", store, err)
77 }
78 if len(clients) != 1 {
79 t.Errorf("Expected 1 client in response from %T, got %+v", store, clients)
80 }
81 success, field, expectation, result = compareClients(client, clients[0])
82 if !success {
83 t.Errorf("Expected field %s to be %v, but %T returned %v", field, expectation, store, result)
84 }
85 err = store.DeleteClient(client.ID)
86 if err != nil {
87 t.Errorf("Error deleting client from %T: %s", store, err)
88 }
89 err = store.DeleteClient(client.ID)
90 if err != ErrClientNotFound {
91 t.Errorf("Expected ErrClientNotFound, got %s from %T", err, store)
92 }
93 retrieved, err = store.GetClient(client.ID)
94 if err != ErrClientNotFound {
95 t.Errorf("Expected ErrClientNotFound from %T, got %+v and %s", store, retrieved, err)
96 }
97 clients, err = store.ListClientsByOwner(client.OwnerID, 25, 0)
98 if err != nil {
99 t.Errorf("Error listing clients by owner from %T: %s", store, err)
100 }
101 if len(clients) != 0 {
102 t.Errorf("Expected 0 clients in response from %T, got %+v", store, clients)
103 }
104 }
105 }
107 func TestClientUpdates(t *testing.T) {
108 t.Parallel()
109 variations := 1 << 10
110 client := Client{
111 ID: uuid.NewID(),
112 Secret: "secret",
113 RedirectURI: "redirectURI",
114 OwnerID: uuid.NewID(),
115 Name: "name",
116 Logo: "logo",
117 Website: "website",
118 }
119 for i := 0; i < variations; i++ {
120 var secret, redirectURI, name, logo, website string
121 change := ClientChange{}
122 expectation := client
123 result := client
124 if i&clientChangeSecret != 0 {
125 secret = fmt.Sprintf("secret-%d", i)
126 change.Secret = &secret
127 expectation.Secret = secret
128 }
129 if i&clientChangeRedirectURI != 0 {
130 redirectURI = fmt.Sprintf("redirect-uri-%d", i)
131 change.RedirectURI = &redirectURI
132 expectation.RedirectURI = redirectURI
133 }
134 if i&clientChangeOwnerID != 0 {
135 change.OwnerID = uuid.NewID()
136 expectation.OwnerID = change.OwnerID
137 }
138 if i&clientChangeName != 0 {
139 name = fmt.Sprintf("name-%d", i)
140 change.Name = &name
141 expectation.Name = name
142 }
143 if i&clientChangeLogo != 0 {
144 logo = fmt.Sprintf("logo-%d", i)
145 change.Logo = &logo
146 expectation.Logo = logo
147 }
148 if i&clientChangeWebsite != 0 {
149 website = fmt.Sprintf("website-%d", i)
150 change.Website = &website
151 expectation.Website = website
152 }
153 result.ApplyChange(change)
154 match, field, expected, got := compareClients(expectation, result)
155 if !match {
156 t.Errorf("Expected field `%s` to be `%v`, got `%v`", field, expected, got)
157 }
158 for _, store := range clientStores {
159 err := store.SaveClient(client)
160 if err != nil {
161 t.Errorf("Error saving client in %T: %s", store, err)
162 }
163 err = store.UpdateClient(client.ID, change)
164 if err != nil {
165 t.Errorf("Error updating client in %T: %s", store, err)
166 }
167 retrieved, err := store.GetClient(client.ID)
168 if err != nil {
169 t.Errorf("Error getting profile from %T: %s", store, err)
170 }
171 match, field, expected, got = compareClients(expectation, retrieved)
172 if !match {
173 t.Errorf("Expected field `%s` to be `%v`, got `%v` from %T", field, expected, got, store)
174 }
175 err = store.DeleteClient(client.ID)
176 if err != nil {
177 t.Errorf("Error deleting client from %T: %s", store, err)
178 }
179 err = store.UpdateClient(client.ID, change)
180 if err != ErrClientNotFound {
181 t.Errorf("Expected ErrClientNotFound, got %v from %T", err, store)
182 }
183 }
184 }
185 }