auth

Paddy 2014-10-22 Parent:aff6863e3cb3 Child:e45bfa2abc00

54:0f80a3e391b8 Go to Latest

auth/grant_test.go

Update CheckEndpoints for strict checking, add CountEndpoints. Create a "strict" mode for CheckEndpoints that will only return true on an exact match, and update the memstore implementation accordingly. Add tests to make sure that the strict mode is adhered to. We need this mode because in certain situations (e.g., the client has more than one endpoint registered), the spec demands a full-string comparison. Add a CountEndpoints method to the ClientStore that will return the number of endpoints registered for a specific client. As we just mentioned, the rules for how a redirect URI is validated depend upon the number of endpoints a client has registered, so we need to be able to get at that number.

History
paddy@29 1 package auth
paddy@29 2
paddy@29 3 import (
paddy@29 4 "testing"
paddy@29 5 "time"
paddy@29 6
paddy@45 7 "code.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@36 38 t.Parallel()
paddy@29 39 grant := Grant{
paddy@29 40 Code: "code",
paddy@29 41 Created: time.Now(),
paddy@29 42 ExpiresIn: 180,
paddy@29 43 ClientID: uuid.NewID(),
paddy@29 44 Scope: "scope",
paddy@29 45 RedirectURI: "redirectURI",
paddy@29 46 State: "state",
paddy@29 47 }
paddy@34 48 for _, store := range grantStores {
paddy@29 49 err := store.SaveGrant(grant)
paddy@29 50 if err != nil {
paddy@34 51 t.Errorf("Error saving grant to %T: %s", store, err)
paddy@34 52 }
paddy@34 53 err = store.SaveGrant(grant)
paddy@34 54 if err != ErrGrantAlreadyExists {
paddy@34 55 t.Errorf("Expected ErrGrantAlreadyExists from %T, got %+v", store, err)
paddy@29 56 }
paddy@29 57 retrieved, err := store.GetGrant(grant.Code)
paddy@29 58 if err != nil {
paddy@34 59 t.Errorf("Error retrieving grant from %T: %s", store, err)
paddy@29 60 }
paddy@34 61 match, field, expectation, result := compareGrants(grant, retrieved)
paddy@34 62 if !match {
paddy@34 63 t.Errorf("Expected `%v` in the `%s` field of grant retrieved from %T, got `%v`", expectation, field, store, result)
paddy@34 64 }
paddy@29 65 err = store.DeleteGrant(grant.Code)
paddy@29 66 if err != nil {
paddy@34 67 t.Errorf("Error removing grant from %T: %s", store, err)
paddy@29 68 }
paddy@29 69 retrieved, err = store.GetGrant(grant.Code)
paddy@29 70 if err != ErrGrantNotFound {
paddy@34 71 t.Errorf("Expected ErrGrantNotFound from %T, got %+v and %+v", store, retrieved, err)
paddy@34 72 }
paddy@34 73 err = store.DeleteGrant(grant.Code)
paddy@34 74 if err != ErrGrantNotFound {
paddy@34 75 t.Errorf("Expected ErrGrantNotFound from %T, got %+v", store, err)
paddy@29 76 }
paddy@29 77 }
paddy@29 78 }