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