From c598d076f6e09242aa7675d744a0ec5e715caf95 Mon Sep 17 00:00:00 2001
From: Niall Sheridan <nsheridan@gmail.com>
Date: Mon, 16 Jan 2017 22:57:26 +0000
Subject: [PATCH] Update authprovider tests

---
 server/auth/github/github.go             |  4 ++-
 server/auth/github/github_test.go        | 46 +++++++++++++++++-------
 server/auth/google/google.go             |  4 ++-
 server/auth/google/google_test.go        | 45 +++++++++++++++--------
 server/auth/testprovider/testprovider.go |  4 ++-
 5 files changed, 73 insertions(+), 30 deletions(-)

diff --git a/server/auth/github/github.go b/server/auth/github/github.go
index 76285265..46cf76a9 100644
--- a/server/auth/github/github.go
+++ b/server/auth/github/github.go
@@ -25,8 +25,10 @@ type Config struct {
 	whitelist    map[string]bool
 }
 
+var _ auth.Provider = (*Config)(nil)
+
 // New creates a new Github provider from a configuration.
-func New(c *config.Auth) (auth.Provider, error) {
+func New(c *config.Auth) (*Config, error) {
 	uw := make(map[string]bool)
 	for _, u := range c.UsersWhitelist {
 		uw[u] = true
diff --git a/server/auth/github/github_test.go b/server/auth/github/github_test.go
index b0c97d28..8c51f4f8 100644
--- a/server/auth/github/github_test.go
+++ b/server/auth/github/github_test.go
@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/nsheridan/cashier/server/auth"
 	"github.com/nsheridan/cashier/server/config"
 	"github.com/stretchr/testify/assert"
 )
@@ -14,25 +13,48 @@ var (
 	oauthClientSecret = "secret"
 	oauthCallbackURL  = "url"
 	organization      = "exampleorg"
+	users             = []string{"user"}
 )
 
 func TestNew(t *testing.T) {
 	a := assert.New(t)
 
-	p, _ := newGithub()
-	g := p.(*Config)
-	a.Equal(g.config.ClientID, oauthClientID)
-	a.Equal(g.config.ClientSecret, oauthClientSecret)
-	a.Equal(g.config.RedirectURL, oauthCallbackURL)
-	a.Equal(g.organization, organization)
+	p, _ := New(&config.Auth{
+		OauthClientID:     oauthClientID,
+		OauthClientSecret: oauthClientSecret,
+		OauthCallbackURL:  oauthCallbackURL,
+		ProviderOpts:      map[string]string{"organization": organization},
+		UsersWhitelist:    users,
+	})
+	a.Equal(p.config.ClientID, oauthClientID)
+	a.Equal(p.config.ClientSecret, oauthClientSecret)
+	a.Equal(p.config.RedirectURL, oauthCallbackURL)
+	a.Equal(p.organization, organization)
+	a.Equal(p.whitelist, map[string]bool{"user": true})
 }
 
-func TestNewEmptyOrganization(t *testing.T) {
-	organization = ""
-	if _, err := newGithub(); err == nil {
+func TestWhitelist(t *testing.T) {
+	c := &config.Auth{
+		OauthClientID:     oauthClientID,
+		OauthClientSecret: oauthClientSecret,
+		OauthCallbackURL:  oauthCallbackURL,
+		ProviderOpts:      map[string]string{"organization": ""},
+		UsersWhitelist:    []string{},
+	}
+	if _, err := New(c); err == nil {
 		t.Error("creating a provider without an organization set should return an error")
 	}
-	organization = "exampleorg"
+	// Set a user whitelist but no domain
+	c.UsersWhitelist = users
+	if _, err := New(c); err != nil {
+		t.Error("creating a provider with users but no organization should not return an error")
+	}
+	// Unset the user whitelist and set a domain
+	c.UsersWhitelist = []string{}
+	c.ProviderOpts = map[string]string{"organization": organization}
+	if _, err := New(c); err != nil {
+		t.Error("creating a provider with an organization set but without a user whitelist should not return an error")
+	}
 }
 
 func TestStartSession(t *testing.T) {
@@ -45,7 +67,7 @@ func TestStartSession(t *testing.T) {
 	a.Contains(s.AuthURL, fmt.Sprintf("client_id=%s", oauthClientID))
 }
 
-func newGithub() (auth.Provider, error) {
+func newGithub() (*Config, error) {
 	c := &config.Auth{
 		OauthClientID:     oauthClientID,
 		OauthClientSecret: oauthClientSecret,
diff --git a/server/auth/google/google.go b/server/auth/google/google.go
index 643ecfe9..8c6f53bd 100644
--- a/server/auth/google/google.go
+++ b/server/auth/google/google.go
@@ -27,8 +27,10 @@ type Config struct {
 	whitelist map[string]bool
 }
 
+var _ auth.Provider = (*Config)(nil)
+
 // New creates a new Google provider from a configuration.
-func New(c *config.Auth) (auth.Provider, error) {
+func New(c *config.Auth) (*Config, error) {
 	uw := make(map[string]bool)
 	for _, u := range c.UsersWhitelist {
 		uw[u] = true
diff --git a/server/auth/google/google_test.go b/server/auth/google/google_test.go
index 781cf6f2..b3d26334 100644
--- a/server/auth/google/google_test.go
+++ b/server/auth/google/google_test.go
@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/nsheridan/cashier/server/auth"
 	"github.com/nsheridan/cashier/server/config"
 	"github.com/stretchr/testify/assert"
 )
@@ -14,27 +13,42 @@ var (
 	oauthClientSecret = "secret"
 	oauthCallbackURL  = "url"
 	domain            = "example.com"
+	users             = []string{"user"}
 )
 
 func TestNew(t *testing.T) {
 	a := assert.New(t)
-
-	p, _ := newGoogle()
-	g := p.(*Config)
-	a.Equal(g.config.ClientID, oauthClientID)
-	a.Equal(g.config.ClientSecret, oauthClientSecret)
-	a.Equal(g.config.RedirectURL, oauthCallbackURL)
-	a.Equal(g.domain, domain)
+	p, err := newGoogle()
+	a.NoError(err)
+	a.Equal(p.config.ClientID, oauthClientID)
+	a.Equal(p.config.ClientSecret, oauthClientSecret)
+	a.Equal(p.config.RedirectURL, oauthCallbackURL)
+	a.Equal(p.domain, domain)
+	a.Equal(p.whitelist, map[string]bool{"user": true})
 }
 
-func TestNewWithoutDomain(t *testing.T) {
-	domain = ""
-
-	if _, err := newGoogle(); err == nil {
+func TestWhitelist(t *testing.T) {
+	c := &config.Auth{
+		OauthClientID:     oauthClientID,
+		OauthClientSecret: oauthClientSecret,
+		OauthCallbackURL:  oauthCallbackURL,
+		ProviderOpts:      map[string]string{"domain": ""},
+		UsersWhitelist:    []string{},
+	}
+	if _, err := New(c); err == nil {
 		t.Error("creating a provider without a domain set should return an error")
 	}
-
-	domain = "example.com"
+	// Set a user whitelist but no domain
+	c.UsersWhitelist = users
+	if _, err := New(c); err != nil {
+		t.Error("creating a provider with users but no domain should not return an error")
+	}
+	// Unset the user whitelist and set a domain
+	c.UsersWhitelist = []string{}
+	c.ProviderOpts = map[string]string{"domain": domain}
+	if _, err := New(c); err != nil {
+		t.Error("creating a provider with a domain set but without a user whitelist should not return an error")
+	}
 }
 
 func TestStartSession(t *testing.T) {
@@ -49,12 +63,13 @@ func TestStartSession(t *testing.T) {
 	a.Contains(s.AuthURL, fmt.Sprintf("client_id=%s", oauthClientID))
 }
 
-func newGoogle() (auth.Provider, error) {
+func newGoogle() (*Config, error) {
 	c := &config.Auth{
 		OauthClientID:     oauthClientID,
 		OauthClientSecret: oauthClientSecret,
 		OauthCallbackURL:  oauthCallbackURL,
 		ProviderOpts:      map[string]string{"domain": domain},
+		UsersWhitelist:    users,
 	}
 	return New(c)
 }
diff --git a/server/auth/testprovider/testprovider.go b/server/auth/testprovider/testprovider.go
index 3d2b13a4..e30b04aa 100644
--- a/server/auth/testprovider/testprovider.go
+++ b/server/auth/testprovider/testprovider.go
@@ -15,8 +15,10 @@ const (
 // Config is an implementation of `auth.Provider` for testing.
 type Config struct{}
 
+var _ auth.Provider = (*Config)(nil)
+
 // New creates a new provider.
-func New() auth.Provider {
+func New() *Config {
 	return &Config{}
 }
 
-- 
GitLab