99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
package auth_test
 | 
						|
 | 
						|
import (
 | 
						|
	"database/sql"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"os"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"git.hatecomputers.club/hatecomputers/hatecomputers.club/api/auth"
 | 
						|
	"git.hatecomputers.club/hatecomputers/hatecomputers.club/api/types"
 | 
						|
	"git.hatecomputers.club/hatecomputers/hatecomputers.club/args"
 | 
						|
	"git.hatecomputers.club/hatecomputers/hatecomputers.club/database"
 | 
						|
	"git.hatecomputers.club/hatecomputers/hatecomputers.club/utils"
 | 
						|
)
 | 
						|
 | 
						|
func IdContinuation(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
 | 
						|
	return func(success types.Continuation, _failure types.Continuation) types.ContinuationChain {
 | 
						|
		return success(context, req, resp)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func setup() (*sql.DB, *types.RequestContext, func()) {
 | 
						|
	randomDb := utils.RandomId()
 | 
						|
 | 
						|
	testDb := database.MakeConn(&randomDb)
 | 
						|
	database.Migrate(testDb)
 | 
						|
 | 
						|
	context := &types.RequestContext{
 | 
						|
		DBConn:       testDb,
 | 
						|
		Args:         &args.Arguments{},
 | 
						|
		TemplateData: &(map[string]interface{}{}),
 | 
						|
	}
 | 
						|
 | 
						|
	return testDb, context, func() {
 | 
						|
		testDb.Close()
 | 
						|
		os.Remove(randomDb)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestLoginSendsYouToRedirect(t *testing.T) {
 | 
						|
	db, context, cleanup := setup()
 | 
						|
	defer cleanup()
 | 
						|
 | 
						|
	user := &database.User{
 | 
						|
		ID:       "test",
 | 
						|
		Username: "test",
 | 
						|
	}
 | 
						|
	database.FindOrSaveUser(db, user)
 | 
						|
 | 
						|
	session, _ := database.MakeUserSessionFor(db, user)
 | 
						|
 | 
						|
	testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		auth.VerifySessionContinuation(context, r, w)(IdContinuation, auth.GoLoginContinuation)(IdContinuation, IdContinuation)
 | 
						|
	}))
 | 
						|
	defer testServer.Close()
 | 
						|
 | 
						|
	protectedPath := testServer.URL + "/protected-path"
 | 
						|
	req := httptest.NewRequest("GET", protectedPath, nil)
 | 
						|
	resp := httptest.NewRecorder()
 | 
						|
	testServer.Config.Handler.ServeHTTP(resp, req)
 | 
						|
 | 
						|
	location := resp.Header().Get("Location")
 | 
						|
	if resp.Code != http.StatusFound && location != "/login" {
 | 
						|
		t.Errorf("expected redirect code, got %d, to login, got %s", resp.Code, location)
 | 
						|
	}
 | 
						|
 | 
						|
	req.AddCookie(&http.Cookie{
 | 
						|
		Name:   "session",
 | 
						|
		Value:  session.ID,
 | 
						|
		MaxAge: 60,
 | 
						|
	})
 | 
						|
	resp = httptest.NewRecorder()
 | 
						|
	testServer.Config.Handler.ServeHTTP(resp, req)
 | 
						|
	if resp.Code != http.StatusOK {
 | 
						|
}
 | 
						|
 | 
						|
func TestOauthFormatsUsername(t *testing.T) {
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func TestSessionIsUnique(t *testing.T) {}
 | 
						|
 | 
						|
func TestLogoutClearsCookie(t *testing.T) {
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func TestRefreshUpdatesExpiration(t *testing.T) {
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func TestVerifySessionEnsuresNonExpired(t *testing.T) {
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func TestAPITokensAreEquivalentToSessions(t *testing.T) {
 | 
						|
 | 
						|
}
 |