The great documentation and exported interface cleanup.
Modify all our *Store interfaces to be unexported, as there's no real good
reason they need to be exported, especially as they can be implemented without
being exported. The interfaces shouldn't matter to 99% of users of the package,
so let's not pollute our package API.
Further, all methods of the interfaces are now unexported, for pretty much the
same reasoning.
Add a doc.go file with documentation explaining the choices the package is
making and what it provides.
Implement documentation on all our exported types and methods and functions,
which makes golint happy. The only remaining golint warning is about
NewMemstore, which will stay the way it is. The memstore type is useful outside
tests for things like standing up a server quickly when we don't care about the
storage, and because the type is unexported, we _need_ a New function to create
an instance that can be passed to the Context.
7 "code.secondbit.org/uuid"
10 var grantStores = []grantStore{NewMemstore()}
12 func compareGrants(grant1, grant2 Grant) (success bool, field string, grant1val, grant2val interface{}) {
13 if grant1.Code != grant2.Code {
14 return false, "code", grant1.Code, grant2.Code
16 if !grant1.Created.Equal(grant2.Created) {
17 return false, "created", grant1.Created, grant2.Created
19 if grant1.ExpiresIn != grant2.ExpiresIn {
20 return false, "expires in", grant1.ExpiresIn, grant2.ExpiresIn
22 if !grant1.ClientID.Equal(grant2.ClientID) {
23 return false, "client ID", grant1.ClientID, grant2.ClientID
25 if grant1.Scope != grant2.Scope {
26 return false, "scope", grant1.Scope, grant2.Scope
28 if grant1.RedirectURI != grant2.RedirectURI {
29 return false, "redirect URI", grant1.RedirectURI, grant2.RedirectURI
31 if grant1.State != grant2.State {
32 return false, "state", grant1.State, grant2.State
34 return true, "", nil, nil
37 func TestGrantStoreSuccess(t *testing.T) {
43 ClientID: uuid.NewID(),
45 RedirectURI: "redirectURI",
48 for _, store := range grantStores {
49 err := store.saveGrant(grant)
51 t.Errorf("Error saving grant to %T: %s", store, err)
53 err = store.saveGrant(grant)
54 if err != ErrGrantAlreadyExists {
55 t.Errorf("Expected ErrGrantAlreadyExists from %T, got %+v", store, err)
57 retrieved, err := store.getGrant(grant.Code)
59 t.Errorf("Error retrieving grant from %T: %s", store, err)
61 match, field, expectation, result := compareGrants(grant, retrieved)
63 t.Errorf("Expected `%v` in the `%s` field of grant retrieved from %T, got `%v`", expectation, field, store, result)
65 err = store.deleteGrant(grant.Code)
67 t.Errorf("Error removing grant from %T: %s", store, err)
69 retrieved, err = store.getGrant(grant.Code)
70 if err != ErrGrantNotFound {
71 t.Errorf("Expected ErrGrantNotFound from %T, got %+v and %+v", store, retrieved, err)
73 err = store.deleteGrant(grant.Code)
74 if err != ErrGrantNotFound {
75 t.Errorf("Expected ErrGrantNotFound from %T, got %+v", store, err)