You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
6.6 KiB
249 lines
6.6 KiB
package auth_test
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/mnrva-dev/owltier.com/server/auth"
|
|
"github.com/mnrva-dev/owltier.com/server/config"
|
|
"github.com/mnrva-dev/owltier.com/server/db"
|
|
"github.com/mnrva-dev/owltier.com/server/token"
|
|
)
|
|
|
|
// TODO also write unit tests
|
|
|
|
type userdata struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
Email string `json:"email"`
|
|
AccessToken string `json:"access_token"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
var (
|
|
testuser = &db.UserSchema{
|
|
Username: "test",
|
|
Password: "testpassword1234!!",
|
|
Email: "test@example.com",
|
|
}
|
|
permatestuser = &db.UserSchema{
|
|
Id: "0a85b0ae-a577-4be3-8609-d443d50f6939",
|
|
Username: "user",
|
|
Password: "password1234!!",
|
|
Email: "user@example.com",
|
|
Refresh: "",
|
|
}
|
|
)
|
|
|
|
func runTestServer() *httptest.Server {
|
|
return httptest.NewServer(auth.BuildRouter())
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
m.Run()
|
|
}
|
|
|
|
func TestRegister(t *testing.T) {
|
|
ts := runTestServer()
|
|
defer ts.Close()
|
|
data := url.Values{}
|
|
data.Set("email", testuser.Email)
|
|
if config.UsernamesEnabled() {
|
|
data.Set("username", testuser.Username)
|
|
}
|
|
data.Set("password", testuser.Password)
|
|
resp, err := http.PostForm(fmt.Sprintf("%s/register", ts.URL), data)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("Could not read body")
|
|
}
|
|
if resp.StatusCode/100 != 2 {
|
|
t.Errorf("Expected status in 200-299 range, got %d", resp.StatusCode)
|
|
fmt.Println(string(body))
|
|
t.FailNow()
|
|
}
|
|
AccessToken := strings.Split(string(body), "\n")[0]
|
|
RefreshToken := strings.Split(string(body), "\n")[1]
|
|
if AccessToken == "" || RefreshToken == "" {
|
|
t.Errorf("Expected access and refresh token to be set")
|
|
}
|
|
if AccessToken == RefreshToken {
|
|
t.Errorf("Expected access and refresh tokens to be different")
|
|
}
|
|
_, err = token.ValidateAccess(AccessToken)
|
|
if err != nil {
|
|
t.Errorf("Expected valid access token, got %v", err)
|
|
}
|
|
_, err = token.ValidateRefresh(RefreshToken)
|
|
if err != nil {
|
|
t.Errorf("Expected valid refresh token, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestLogin(t *testing.T) {
|
|
ts := runTestServer()
|
|
defer ts.Close()
|
|
data := url.Values{}
|
|
data.Set("email", testuser.Email)
|
|
if config.UsernamesEnabled() {
|
|
data.Set("username", testuser.Username)
|
|
}
|
|
data.Set("password", testuser.Password)
|
|
resp, err := http.PostForm(fmt.Sprintf("%s/login", ts.URL), data)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("Could not read body")
|
|
}
|
|
if resp.StatusCode/100 != 2 {
|
|
t.Errorf("Expected status in 200-299 range, got %d", resp.StatusCode)
|
|
fmt.Println(string(body))
|
|
t.FailNow()
|
|
}
|
|
AccessToken := strings.Split(string(body), "\n")[0]
|
|
RefreshToken := strings.Split(string(body), "\n")[1]
|
|
if AccessToken == "" || RefreshToken == "" {
|
|
t.Errorf("Expected access and refresh token to be set")
|
|
}
|
|
if AccessToken == RefreshToken {
|
|
t.Errorf("Expected access and refresh tokens to be different")
|
|
}
|
|
_, err = token.ValidateAccess(AccessToken)
|
|
if err != nil {
|
|
t.Errorf("Expected valid access token, got %v", err)
|
|
}
|
|
_, err = token.ValidateRefresh(RefreshToken)
|
|
if err != nil {
|
|
t.Errorf("Expected valid refresh token, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestRefresh(t *testing.T) {
|
|
ts := runTestServer()
|
|
defer ts.Close()
|
|
data := url.Values{}
|
|
data.Set("email", testuser.Email)
|
|
data.Set("password", testuser.Password)
|
|
resp, err := http.PostForm(fmt.Sprintf("%s/login", ts.URL), data)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("Could not read body")
|
|
}
|
|
if resp.StatusCode/100 != 2 {
|
|
t.Error("Failed to login")
|
|
t.FailNow()
|
|
}
|
|
RefreshToken := strings.Split(string(body), "\n")[1]
|
|
req, err := http.NewRequest("POST", fmt.Sprintf("%s/token/refresh", ts.URL), nil)
|
|
if err != nil {
|
|
t.Fatalf("Couldn't create request: %v", err)
|
|
}
|
|
req.Header.Set("Authorization", "Bearer "+RefreshToken)
|
|
resp, err = http.DefaultClient.Do(req)
|
|
body, err = ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("Could not read body")
|
|
}
|
|
if resp.StatusCode/100 != 2 {
|
|
t.Errorf("%s\n", string(body))
|
|
t.Fatalf("Expected token to be validated but got status %d", resp.StatusCode)
|
|
}
|
|
AccessToken := strings.Split(string(body), "\n")[0]
|
|
RefreshToken = strings.Split(string(body), "\n")[1]
|
|
if AccessToken == "" || RefreshToken == "" {
|
|
t.Errorf("Expected access and refresh token to be set")
|
|
}
|
|
if AccessToken == RefreshToken {
|
|
t.Errorf("Expected access and refresh tokens to be different")
|
|
}
|
|
_, err = token.ValidateAccess(AccessToken)
|
|
if err != nil {
|
|
t.Errorf("Expected valid access token, got %v", err)
|
|
}
|
|
_, err = token.ValidateRefresh(RefreshToken)
|
|
if err != nil {
|
|
t.Errorf("Expected valid refresh token, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestValidateAccess(t *testing.T) {
|
|
ts := runTestServer()
|
|
defer ts.Close()
|
|
AccessToken := token.GenerateAccess(testuser)
|
|
req, err := http.NewRequest("GET", fmt.Sprintf("%s/token/validate", ts.URL), nil)
|
|
if err != nil {
|
|
t.Fatalf("Couldn't create request: %v", err)
|
|
}
|
|
req.Header.Set("Authorization", "Bearer "+AccessToken)
|
|
resp, err := http.DefaultClient.Do(req)
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("Could not read body")
|
|
}
|
|
if err != nil {
|
|
t.Error(string(body))
|
|
t.Fatal(err)
|
|
}
|
|
if resp.StatusCode/100 != 2 {
|
|
t.Error(string(body))
|
|
t.Errorf("Expected token to be validated but got status %d", resp.StatusCode)
|
|
}
|
|
}
|
|
|
|
func TestDeleteAccount(t *testing.T) {
|
|
ts := runTestServer()
|
|
defer ts.Close()
|
|
data := url.Values{}
|
|
data.Set("email", testuser.Email)
|
|
data.Set("password", testuser.Password)
|
|
resp, err := http.PostForm(fmt.Sprintf("%s/login", ts.URL), data)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("Could not read body")
|
|
}
|
|
if resp.StatusCode/100 != 2 {
|
|
t.Error("Failed to login")
|
|
t.FailNow()
|
|
}
|
|
AccessToken := strings.Split(string(body), "\n")[0]
|
|
data = url.Values{}
|
|
data.Set("password", testuser.Password)
|
|
req, err := http.NewRequest("POST", fmt.Sprintf("%s/delete", ts.URL), strings.NewReader(data.Encode()))
|
|
req.Header.Add("Authorization", "Bearer "+AccessToken)
|
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
resp, err = http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
body, err = ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("Could not read body")
|
|
}
|
|
// fmt.Println(string(body))
|
|
if resp.StatusCode/100 != 2 {
|
|
t.Errorf("Expected status in 200-299 range, got %d", resp.StatusCode)
|
|
fmt.Println(string(body))
|
|
t.FailNow()
|
|
}
|
|
}
|