auth
auth/grant_test.go
Further grant testing. Use the %T format to return the name of the GrantStore that failed the test, rather than just returning the position of the store. Test that storing a grant twice yields an ErrGrantAlreadyExists. Test that retrieving a grant that doesn't exist yields an ErrGrantNotFound. Compare returned grants against expectations.
| paddy@29 | 1 package auth |
| paddy@29 | 2 |
| paddy@29 | 3 import ( |
| paddy@29 | 4 "testing" |
| paddy@29 | 5 "time" |
| paddy@29 | 6 |
| paddy@29 | 7 "secondbit.org/uuid" |
| paddy@29 | 8 ) |
| paddy@29 | 9 |
| paddy@29 | 10 var grantStores = []GrantStore{NewMemstore()} |
| paddy@29 | 11 |
| paddy@34 | 12 func compareGrants(grant1, grant2 Grant) (success bool, field string, grant1val, grant2val interface{}) { |
| paddy@34 | 13 if grant1.Code != grant2.Code { |
| paddy@34 | 14 return false, "code", grant1.Code, grant2.Code |
| paddy@34 | 15 } |
| paddy@34 | 16 if !grant1.Created.Equal(grant2.Created) { |
| paddy@34 | 17 return false, "created", grant1.Created, grant2.Created |
| paddy@34 | 18 } |
| paddy@34 | 19 if grant1.ExpiresIn != grant2.ExpiresIn { |
| paddy@34 | 20 return false, "expires in", grant1.ExpiresIn, grant2.ExpiresIn |
| paddy@34 | 21 } |
| paddy@34 | 22 if !grant1.ClientID.Equal(grant2.ClientID) { |
| paddy@34 | 23 return false, "client ID", grant1.ClientID, grant2.ClientID |
| paddy@34 | 24 } |
| paddy@34 | 25 if grant1.Scope != grant2.Scope { |
| paddy@34 | 26 return false, "scope", grant1.Scope, grant2.Scope |
| paddy@34 | 27 } |
| paddy@34 | 28 if grant1.RedirectURI != grant2.RedirectURI { |
| paddy@34 | 29 return false, "redirect URI", grant1.RedirectURI, grant2.RedirectURI |
| paddy@34 | 30 } |
| paddy@34 | 31 if grant1.State != grant2.State { |
| paddy@34 | 32 return false, "state", grant1.State, grant2.State |
| paddy@34 | 33 } |
| paddy@34 | 34 return true, "", nil, nil |
| paddy@34 | 35 } |
| paddy@34 | 36 |
| paddy@29 | 37 func TestGrantStoreSuccess(t *testing.T) { |
| paddy@29 | 38 grant := Grant{ |
| paddy@29 | 39 Code: "code", |
| paddy@29 | 40 Created: time.Now(), |
| paddy@29 | 41 ExpiresIn: 180, |
| paddy@29 | 42 ClientID: uuid.NewID(), |
| paddy@29 | 43 Scope: "scope", |
| paddy@29 | 44 RedirectURI: "redirectURI", |
| paddy@29 | 45 State: "state", |
| paddy@29 | 46 } |
| paddy@34 | 47 for _, store := range grantStores { |
| paddy@29 | 48 err := store.SaveGrant(grant) |
| paddy@29 | 49 if err != nil { |
| paddy@34 | 50 t.Errorf("Error saving grant to %T: %s", store, err) |
| paddy@34 | 51 } |
| paddy@34 | 52 err = store.SaveGrant(grant) |
| paddy@34 | 53 if err != ErrGrantAlreadyExists { |
| paddy@34 | 54 t.Errorf("Expected ErrGrantAlreadyExists from %T, got %+v", store, err) |
| paddy@29 | 55 } |
| paddy@29 | 56 retrieved, err := store.GetGrant(grant.Code) |
| paddy@29 | 57 if err != nil { |
| paddy@34 | 58 t.Errorf("Error retrieving grant from %T: %s", store, err) |
| paddy@29 | 59 } |
| paddy@34 | 60 match, field, expectation, result := compareGrants(grant, retrieved) |
| paddy@34 | 61 if !match { |
| paddy@34 | 62 t.Errorf("Expected `%v` in the `%s` field of grant retrieved from %T, got `%v`", expectation, field, store, result) |
| paddy@34 | 63 } |
| paddy@29 | 64 err = store.DeleteGrant(grant.Code) |
| paddy@29 | 65 if err != nil { |
| paddy@34 | 66 t.Errorf("Error removing grant from %T: %s", store, err) |
| paddy@29 | 67 } |
| paddy@29 | 68 retrieved, err = store.GetGrant(grant.Code) |
| paddy@29 | 69 if err != ErrGrantNotFound { |
| paddy@34 | 70 t.Errorf("Expected ErrGrantNotFound from %T, got %+v and %+v", store, retrieved, err) |
| paddy@34 | 71 } |
| paddy@34 | 72 err = store.DeleteGrant(grant.Code) |
| paddy@34 | 73 if err != ErrGrantNotFound { |
| paddy@34 | 74 t.Errorf("Expected ErrGrantNotFound from %T, got %+v", store, err) |
| paddy@29 | 75 } |
| paddy@29 | 76 } |
| paddy@29 | 77 } |