118 lines
3.4 KiB
Go
118 lines
3.4 KiB
Go
package mocks
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/clems4ever/authelia/regulation"
|
|
"github.com/clems4ever/authelia/storage"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/clems4ever/authelia/authorization"
|
|
"github.com/clems4ever/authelia/configuration/schema"
|
|
"github.com/clems4ever/authelia/middlewares"
|
|
"github.com/clems4ever/authelia/session"
|
|
"github.com/golang/mock/gomock"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/sirupsen/logrus/hooks/test"
|
|
"github.com/valyala/fasthttp"
|
|
)
|
|
|
|
// MockAutheliaCtx a mock of AutheliaCtx
|
|
type MockAutheliaCtx struct {
|
|
// Logger hook
|
|
Hook *test.Hook
|
|
Ctx *middlewares.AutheliaCtx
|
|
Ctrl *gomock.Controller
|
|
|
|
// Providers
|
|
UserProviderMock *MockUserProvider
|
|
StorageProviderMock *storage.MockProvider
|
|
NotifierMock *MockNotifier
|
|
|
|
UserSession *session.UserSession
|
|
}
|
|
|
|
// NewMockAutheliaCtx create an instance of AutheliaCtx mock
|
|
func NewMockAutheliaCtx(t *testing.T) *MockAutheliaCtx {
|
|
mockAuthelia := new(MockAutheliaCtx)
|
|
|
|
configuration := schema.Configuration{
|
|
AccessControl: new(schema.AccessControlConfiguration),
|
|
}
|
|
configuration.Session.Name = "authelia_session"
|
|
configuration.AccessControl.DefaultPolicy = "deny"
|
|
configuration.AccessControl.Rules = []schema.ACLRule{schema.ACLRule{
|
|
Domain: "bypass.example.com",
|
|
Policy: "bypass",
|
|
}, schema.ACLRule{
|
|
Domain: "one-factor.example.com",
|
|
Policy: "one_factor",
|
|
}, schema.ACLRule{
|
|
Domain: "two-factor.example.com",
|
|
Policy: "two_factor",
|
|
}, schema.ACLRule{
|
|
Domain: "deny.example.com",
|
|
Policy: "deny",
|
|
}}
|
|
|
|
providers := middlewares.Providers{}
|
|
|
|
mockAuthelia.Ctrl = gomock.NewController(t)
|
|
mockAuthelia.UserProviderMock = NewMockUserProvider(mockAuthelia.Ctrl)
|
|
providers.UserProvider = mockAuthelia.UserProviderMock
|
|
|
|
mockAuthelia.StorageProviderMock = storage.NewMockProvider(mockAuthelia.Ctrl)
|
|
providers.StorageProvider = mockAuthelia.StorageProviderMock
|
|
|
|
mockAuthelia.NotifierMock = NewMockNotifier(mockAuthelia.Ctrl)
|
|
providers.Notifier = mockAuthelia.NotifierMock
|
|
|
|
providers.Authorizer = authorization.NewAuthorizer(
|
|
*configuration.AccessControl)
|
|
|
|
providers.SessionProvider = session.NewProvider(
|
|
configuration.Session)
|
|
|
|
providers.Regulator = regulation.NewRegulator(configuration.Regulation, providers.StorageProvider)
|
|
|
|
request := &fasthttp.RequestCtx{}
|
|
// Set a cookie to identify this client throughout the test
|
|
// request.Request.Header.SetCookie("authelia_session", "client_cookie")
|
|
|
|
autheliaCtx, _ := middlewares.NewAutheliaCtx(request, configuration, providers)
|
|
mockAuthelia.Ctx = autheliaCtx
|
|
|
|
logger, hook := test.NewNullLogger()
|
|
mockAuthelia.Hook = hook
|
|
|
|
mockAuthelia.Ctx.Logger = logrus.NewEntry(logger)
|
|
return mockAuthelia
|
|
}
|
|
|
|
// Close close the mock
|
|
func (m *MockAutheliaCtx) Close() {
|
|
m.Hook.Reset()
|
|
}
|
|
|
|
// Assert200KO assert an error response from the service.
|
|
func (m *MockAutheliaCtx) Assert200KO(t *testing.T, message string) {
|
|
assert.Equal(t, 200, m.Ctx.Response.StatusCode())
|
|
assert.Equal(t, fmt.Sprintf("{\"status\":\"KO\",\"message\":\"%s\"}", message), string(m.Ctx.Response.Body()))
|
|
}
|
|
|
|
// Assert200OK assert a successful response from the service.
|
|
func (m *MockAutheliaCtx) Assert200OK(t *testing.T, data interface{}) {
|
|
assert.Equal(t, 200, m.Ctx.Response.StatusCode())
|
|
response := middlewares.OKResponse{
|
|
Status: "OK",
|
|
Data: data,
|
|
}
|
|
|
|
b, err := json.Marshal(response)
|
|
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, string(b), string(m.Ctx.Response.Body()))
|
|
}
|