Files

115 lines
2.5 KiB
Go

package httpupstream
import (
"net/http"
"net/http/httptest"
"net/url"
"testing"
"time"
. "github.com/stretchr/testify/assert"
"github.com/tarent/loginsrv/login"
)
func TestSetup(t *testing.T) {
p, exist := login.GetProvider(ProviderName)
True(t, exist)
NotNil(t, p)
backend, err := p(map[string]string{
"upstream": "https://google.com",
"skipverify": "true",
"timeout": "20s",
})
NoError(t, err)
Equal(t,
"https://google.com",
backend.(*Backend).auth.upstream.String())
Equal(t,
true,
backend.(*Backend).auth.skipverify)
Equal(t,
time.Second*20,
backend.(*Backend).auth.timeout)
}
func TestSetup_Default(t *testing.T) {
p, exist := login.GetProvider(ProviderName)
True(t, exist)
NotNil(t, p)
backend, err := p(map[string]string{
"upstream": "https://google.com",
})
NoError(t, err)
Equal(t,
"https://google.com",
backend.(*Backend).auth.upstream.String())
Equal(t,
false,
backend.(*Backend).auth.skipverify)
Equal(t,
defaultTimeout,
backend.(*Backend).auth.timeout)
}
func TestSetup_Error(t *testing.T) {
p, exist := login.GetProvider(ProviderName)
True(t, exist)
NotNil(t, p)
_, err := p(map[string]string{})
Error(t, err)
_, err = p(map[string]string{"upstream": ":invalid-url"})
Error(t, err)
_, err = p(map[string]string{"upstream": "http://example.com", "timeout": "some-string"})
Error(t, err)
_, err = p(map[string]string{"upstream": "http://example.com", "skipverify": "some-string"})
Error(t, err)
}
func TestSimpleBackend_Authenticate(t *testing.T) {
ts := newTestServer()
defer ts.Close()
u, _ := url.Parse(ts.URL)
backend, err := NewBackend(u, time.Second, false)
NoError(t, err)
authenticated, userInfo, err := backend.Authenticate("bob-bcrypt", "secret")
True(t, authenticated)
Equal(t, "bob-bcrypt", userInfo.Sub)
NoError(t, err)
authenticated, userInfo, err = backend.Authenticate("bob-bcrypt", "fooo")
False(t, authenticated)
Equal(t, "", userInfo.Sub)
NoError(t, err)
authenticated, userInfo, err = backend.Authenticate("", "")
False(t, authenticated)
Equal(t, "", userInfo.Sub)
NoError(t, err)
}
func newTestServer() *httptest.Server {
passwordCheck := func(w http.ResponseWriter, r *http.Request) {
u, p, k := r.BasicAuth()
if !k {
w.Header().Set("WWW-Authenticate", `Basic realm="test"`)
}
if !(u == "bob-bcrypt" && p == "secret") {
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
return
}
}
return httptest.NewServer(http.HandlerFunc(passwordCheck))
}