92 lines
2.4 KiB
Go
92 lines
2.4 KiB
Go
|
|
//go:build e2e
|
||
|
|
|
||
|
|
package e2e
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"net/http"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/require"
|
||
|
|
)
|
||
|
|
|
||
|
|
// TestZZZ_AuthTokenRefreshAndLogout runs last (separate go test invocation).
|
||
|
|
// It uses an isolated refresh so seed tokens used by member/permission stay valid.
|
||
|
|
func TestZZZ_AuthTokenRefreshAndLogout(t *testing.T) {
|
||
|
|
c := isolatedAuthClient(t)
|
||
|
|
|
||
|
|
refreshEnv := c.DoExpectOK(t, http.MethodPost, "/api/v1/auth/token/refresh", map[string]string{
|
||
|
|
"refresh_token": c.Fixture.RefreshToken,
|
||
|
|
}, false)
|
||
|
|
var pair struct {
|
||
|
|
AccessToken string `json:"access_token"`
|
||
|
|
RefreshToken string `json:"refresh_token"`
|
||
|
|
UID string `json:"uid"`
|
||
|
|
}
|
||
|
|
require.NoError(t, json.Unmarshal(refreshEnv.Data, &pair))
|
||
|
|
require.Equal(t, c.Fixture.UID, pair.UID)
|
||
|
|
|
||
|
|
c.Fixture.AccessToken = pair.AccessToken
|
||
|
|
c.Fixture.RefreshToken = pair.RefreshToken
|
||
|
|
|
||
|
|
c.DoExpectOK(t, http.MethodGet, "/api/v1/members/me", nil, true)
|
||
|
|
c.DoExpectOK(t, http.MethodPost, "/api/v1/auth/logout", nil, true)
|
||
|
|
|
||
|
|
resp, env := c.Do(t, http.MethodGet, "/api/v1/members/me", nil, true)
|
||
|
|
require.Equal(t, http.StatusUnauthorized, resp.StatusCode)
|
||
|
|
require.NotEqual(t, int64(successCode), env.Code)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestAuth_MissingBearer_401(t *testing.T) {
|
||
|
|
c := NewClient(t)
|
||
|
|
resp, env := c.Do(t, http.MethodGet, "/api/v1/members/me", nil, false)
|
||
|
|
require.Equal(t, http.StatusUnauthorized, resp.StatusCode)
|
||
|
|
require.NotEqual(t, int64(successCode), env.Code)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestAuth_PublicValidationErrors(t *testing.T) {
|
||
|
|
c := NewClient(t)
|
||
|
|
|
||
|
|
cases := []struct {
|
||
|
|
name string
|
||
|
|
path string
|
||
|
|
body any
|
||
|
|
}{
|
||
|
|
{
|
||
|
|
name: "register missing required fields",
|
||
|
|
path: "/api/v1/auth/register",
|
||
|
|
body: map[string]any{},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "login invalid email and password",
|
||
|
|
path: "/api/v1/auth/login",
|
||
|
|
body: map[string]any{
|
||
|
|
"tenant_slug": c.Fixture.TenantSlug,
|
||
|
|
"email": "not-an-email",
|
||
|
|
"password": "short",
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "token refresh missing token",
|
||
|
|
path: "/api/v1/auth/token/refresh",
|
||
|
|
body: map[string]any{},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "social login invalid provider",
|
||
|
|
path: "/api/v1/auth/login/social/start",
|
||
|
|
body: map[string]any{
|
||
|
|
"tenant_slug": c.Fixture.TenantSlug,
|
||
|
|
"provider": "github",
|
||
|
|
"redirect_uri": "http://127.0.0.1/callback",
|
||
|
|
},
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tc := range cases {
|
||
|
|
t.Run(tc.name, func(t *testing.T) {
|
||
|
|
env := c.DoExpectHTTP(t, http.MethodPost, tc.path, tc.body, false, http.StatusBadRequest)
|
||
|
|
require.NotEqual(t, int64(successCode), env.Code)
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|