auth

Paddy 2014-09-18 Parent:bd274615ce72 Child:113ccb15b919

39:690561c6619a Go to Latest

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.

History
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 }