package server import ( "io/fs" "net/url" "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/valyala/fasthttp" "github.com/authelia/authelia/v4/internal/configuration/schema" "github.com/authelia/authelia/v4/internal/mocks" "github.com/authelia/authelia/v4/internal/session" "github.com/authelia/authelia/v4/internal/templates" ) const ( assetsOpenAPIPath = "public_html/api/openapi.yml" localOpenAPIPath = "../../api/openapi.yml" ) type ReadFileOpenAPI struct{} func (lfs *ReadFileOpenAPI) Open(name string) (fs.File, error) { switch name { case assetsOpenAPIPath: return os.Open(localOpenAPIPath) default: return assets.Open(name) } } func (lfs *ReadFileOpenAPI) ReadFile(name string) ([]byte, error) { switch name { case assetsOpenAPIPath: return os.ReadFile(localOpenAPIPath) default: return assets.ReadFile(name) } } func TestShouldTemplateOpenAPI(t *testing.T) { provider, err := templates.New(templates.Config{}) require.NoError(t, err) fs := &ReadFileOpenAPI{} require.NoError(t, provider.LoadTemplatedAssets(fs)) mock := mocks.NewMockAutheliaCtx(t) mock.Ctx.Configuration.Server = schema.DefaultServerConfiguration mock.Ctx.Configuration.Session = schema.SessionConfiguration{ Cookies: []schema.SessionCookieConfiguration{ { SessionCookieCommonConfiguration: schema.SessionCookieCommonConfiguration{ Domain: "example.com", }, AutheliaURL: &url.URL{Scheme: "https", Host: "auth.example.com", Path: "/"}, }, }, } mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) opts := NewTemplatedFileOptions(&mock.Ctx.Configuration) handler := ServeTemplatedOpenAPI(provider.GetAssetOpenAPISpecTemplate(), opts) mock.Ctx.Request.Header.Set(fasthttp.HeaderXForwardedProto, "https") mock.Ctx.Request.Header.Set(fasthttp.HeaderXForwardedHost, "example.com") mock.Ctx.Request.Header.Set("X-Forwarded-Uri", "/api/openapi.yml") handler(mock.Ctx) assert.Equal(t, fasthttp.StatusOK, mock.Ctx.Response.StatusCode()) assert.NotEqual(t, "", string(mock.Ctx.Response.Body())) assert.Contains(t, string(mock.Ctx.Response.Body()), "example: https://auth.example.com/?rd=https%3A%2F%2Fexample.com&rm=GET") }