Added remaining tests on handler, added logout-flag on User

This commit is contained in:
2017-08-06 22:28:16 +02:00
parent d754bfb686
commit 6927ad4709
4 changed files with 109 additions and 6 deletions
+10 -2
View File
@@ -18,6 +18,14 @@ func (h *handler) Handle(path string, w http.ResponseWriter, req *http.Request,
}
method := FindAuthenticator(req.Form.Get("method"))
if method == nil {
if user == nil {
response.Text(w, 400, "Invalid method: "+req.Form.Get("method"))
return true
}
method = user.method
}
switch strings.ToLower(subpath) {
case "login":
@@ -33,7 +41,7 @@ func (h *handler) Handle(path string, w http.ResponseWriter, req *http.Request,
w.Header().Set("X-Auth-Method", method.Name())
user, err := method.Login(username, password)
if err != nil && user != nil {
if err == nil && user != nil {
sess := OpenSession(user)
http.SetCookie(w, &http.Cookie{Name: SessionCookieName, Value: sess.ID, Expires: sess.Time.Add(SessionMaxTime)})
@@ -60,7 +68,7 @@ func (h *handler) Handle(path string, w http.ResponseWriter, req *http.Request,
password := req.Form.Get("password")
user, err := method.Register(username, password, data)
if err != nil && user != nil {
if err == nil && user != nil {
sess := OpenSession(user)
http.SetCookie(w, &http.Cookie{Name: SessionCookieName, Value: sess.ID, Expires: sess.Time.Add(SessionMaxTime)})
+79 -1
View File
@@ -1,10 +1,13 @@
package auth
import (
"encoding/json"
"net/http"
"net/http/httptest"
"net/url"
"strings"
"testing"
"time"
)
type handlerStruct struct{}
@@ -19,14 +22,89 @@ func (hs *handlerStruct) ServeHTTP(w http.ResponseWriter, req *http.Request) {
}
func TestHandler(t *testing.T) {
server := httptest.NewServer(&handlerStruct{})
auther := testAuther{FullName: "Test"}
Register(&auther)
form := url.Values{}
form.Set("method", "test")
form.Set("username", "Test")
form.Set("password", "stuff'nthings")
t.Run("Register", func(t *testing.T) {
form2 := url.Values{}
form2.Set("method", "test")
form3 := url.Values{}
form3.Set("method", "test")
form3.Set("username", "Test2")
form3.Set("password", "stuff'nthings")
t.Run("Register", func(t *testing.T) {
resp, err := http.PostForm(server.URL+"/auth/register", form)
if err != nil {
t.Error("Request:", err)
t.Fail()
}
if resp.StatusCode != 200 {
t.Error("Expected 200, got", resp.Status)
t.Fail()
}
respSession := Session{}
json.NewDecoder(resp.Body).Decode(&respSession)
if respSession.UserID == "" {
t.Errorf("No user ID in session")
t.Fail()
}
if time.Since(respSession.Time) > time.Second {
t.Error("Session time is too low", time.Since(respSession.Time))
t.Fail()
}
})
t.Run("Login", func(t *testing.T) {
resp, err := http.PostForm(server.URL+"/auth/login", form)
if err != nil {
t.Error("Request:", err)
t.Fail()
}
if resp.StatusCode != 200 {
t.Error("Expected 200, got", resp.Status)
t.Fail()
}
respSession := Session{}
json.NewDecoder(resp.Body).Decode(&respSession)
if respSession.UserID == "" {
t.Errorf("No user ID in session")
t.Fail()
}
})
t.Run("Login_Fail", func(t *testing.T) {
resp, err := http.PostForm(server.URL+"/auth/login", form3)
if err != nil {
t.Error("Request:", err)
t.Fail()
}
if resp.StatusCode != 401 {
t.Error("Expected 401, got", resp.Status)
t.Fail()
}
respSession := Session{}
json.NewDecoder(resp.Body).Decode(&respSession)
if respSession.UserID != "" {
t.Errorf("A user ID in supposedly empty session")
t.Fail()
}
})
}
+14 -2
View File
@@ -6,7 +6,8 @@ type User struct {
Level string
Data map[string]string
method Authenticator
method Authenticator
loggedOut bool
}
// FullID is the userid prefixed with the method ID
@@ -14,6 +15,17 @@ func (user *User) FullID() string {
return user.method.ID() + ":" + user.ID
}
// Logout flags the user for logout
func (user *User) Logout() {
user.loggedOut = true
}
// LoggedOut returns whether the Logout() function has been called
func (user *User) LoggedOut() bool {
return user.loggedOut
}
// NewUser creates a new User object
func NewUser(method Authenticator, id, name, level string, data map[string]string) *User {
return &User{id, name, level, data, method}
return &User{id, name, level, data, method, false}
}