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