mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-08 18:04:14 +01:00
Fix install page context, make the install page tests really test (#24858)
Fix #24856 Rename "context.contextKey" to "context.WebContextKey", this context is for web context only. But the Context itself is not renamed, otherwise it would cause a lot of changes (if we really want to rename it, there could be a separate PR). The old test code doesn't really test, the "install page" gets broken not only one time, so use new test code to make sure the "install page" could work.
This commit is contained in:
parent
5c0745c034
commit
abcf5a7b5e
9 changed files with 43 additions and 28 deletions
|
@ -142,10 +142,8 @@ func runWeb(ctx *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
installCtx, cancel := context.WithCancel(graceful.GetManager().HammerContext())
|
c := install.Routes()
|
||||||
c := install.Routes(installCtx)
|
|
||||||
err := listen(c, false)
|
err := listen(c, false)
|
||||||
cancel()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Critical("Unable to open listener for installer. Is Gitea already running?")
|
log.Critical("Unable to open listener for installer. Is Gitea already running?")
|
||||||
graceful.GetManager().DoGracefulShutdown()
|
graceful.GetManager().DoGracefulShutdown()
|
||||||
|
|
|
@ -68,12 +68,12 @@ func (ctx *Context) TrHTMLEscapeArgs(msg string, args ...string) string {
|
||||||
return ctx.Locale.Tr(msg, trArgs...)
|
return ctx.Locale.Tr(msg, trArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
type contextKeyType struct{}
|
type webContextKeyType struct{}
|
||||||
|
|
||||||
var contextKey interface{} = contextKeyType{}
|
var WebContextKey = webContextKeyType{}
|
||||||
|
|
||||||
func GetContext(req *http.Request) *Context {
|
func GetWebContext(req *http.Request) *Context {
|
||||||
ctx, _ := req.Context().Value(contextKey).(*Context)
|
ctx, _ := req.Context().Value(WebContextKey).(*Context)
|
||||||
return ctx
|
return ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ type ValidateContext struct {
|
||||||
func GetValidateContext(req *http.Request) (ctx *ValidateContext) {
|
func GetValidateContext(req *http.Request) (ctx *ValidateContext) {
|
||||||
if ctxAPI, ok := req.Context().Value(apiContextKey).(*APIContext); ok {
|
if ctxAPI, ok := req.Context().Value(apiContextKey).(*APIContext); ok {
|
||||||
ctx = &ValidateContext{Base: ctxAPI.Base}
|
ctx = &ValidateContext{Base: ctxAPI.Base}
|
||||||
} else if ctxWeb, ok := req.Context().Value(contextKey).(*Context); ok {
|
} else if ctxWeb, ok := req.Context().Value(WebContextKey).(*Context); ok {
|
||||||
ctx = &ValidateContext{Base: ctxWeb.Base}
|
ctx = &ValidateContext{Base: ctxWeb.Base}
|
||||||
} else {
|
} else {
|
||||||
panic("invalid context, expect either APIContext or Context")
|
panic("invalid context, expect either APIContext or Context")
|
||||||
|
@ -135,7 +135,7 @@ func Contexter() func(next http.Handler) http.Handler {
|
||||||
ctx.PageData = map[string]any{}
|
ctx.PageData = map[string]any{}
|
||||||
ctx.Data["PageData"] = ctx.PageData
|
ctx.Data["PageData"] = ctx.PageData
|
||||||
|
|
||||||
ctx.Base.AppendContextValue(contextKey, ctx)
|
ctx.Base.AppendContextValue(WebContextKey, ctx)
|
||||||
ctx.Base.AppendContextValueFunc(git.RepositoryContextKey, func() any { return ctx.Repo.GitRepo })
|
ctx.Base.AppendContextValueFunc(git.RepositoryContextKey, func() any { return ctx.Repo.GitRepo })
|
||||||
|
|
||||||
ctx.Csrf = PrepareCSRFProtector(csrfOpts, ctx)
|
ctx.Csrf = PrepareCSRFProtector(csrfOpts, ctx)
|
||||||
|
|
|
@ -150,7 +150,7 @@ func PackageContexter() func(next http.Handler) http.Handler {
|
||||||
}
|
}
|
||||||
defer baseCleanUp()
|
defer baseCleanUp()
|
||||||
|
|
||||||
ctx.Base.AppendContextValue(contextKey, ctx)
|
ctx.Base.AppendContextValue(WebContextKey, ctx)
|
||||||
next.ServeHTTP(ctx.Resp, ctx.Req)
|
next.ServeHTTP(ctx.Resp, ctx.Req)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ type ResponseStatusProvider interface {
|
||||||
// TODO: decouple this from the context package, let the context package register these providers
|
// TODO: decouple this from the context package, let the context package register these providers
|
||||||
var argTypeProvider = map[reflect.Type]func(req *http.Request) ResponseStatusProvider{
|
var argTypeProvider = map[reflect.Type]func(req *http.Request) ResponseStatusProvider{
|
||||||
reflect.TypeOf(&context.APIContext{}): func(req *http.Request) ResponseStatusProvider { return context.GetAPIContext(req) },
|
reflect.TypeOf(&context.APIContext{}): func(req *http.Request) ResponseStatusProvider { return context.GetAPIContext(req) },
|
||||||
reflect.TypeOf(&context.Context{}): func(req *http.Request) ResponseStatusProvider { return context.GetContext(req) },
|
reflect.TypeOf(&context.Context{}): func(req *http.Request) ResponseStatusProvider { return context.GetWebContext(req) },
|
||||||
reflect.TypeOf(&context.PrivateContext{}): func(req *http.Request) ResponseStatusProvider { return context.GetPrivateContext(req) },
|
reflect.TypeOf(&context.PrivateContext{}): func(req *http.Request) ResponseStatusProvider { return context.GetPrivateContext(req) },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ func Contexter() func(next http.Handler) http.Handler {
|
||||||
return func(next http.Handler) http.Handler {
|
return func(next http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
|
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
|
||||||
base, baseCleanUp := context.NewBaseContext(resp, req)
|
base, baseCleanUp := context.NewBaseContext(resp, req)
|
||||||
ctx := context.Context{
|
ctx := &context.Context{
|
||||||
Base: base,
|
Base: base,
|
||||||
Flash: &middleware.Flash{},
|
Flash: &middleware.Flash{},
|
||||||
Render: rnd,
|
Render: rnd,
|
||||||
|
@ -67,6 +67,7 @@ func Contexter() func(next http.Handler) http.Handler {
|
||||||
}
|
}
|
||||||
defer baseCleanUp()
|
defer baseCleanUp()
|
||||||
|
|
||||||
|
ctx.AppendContextValue(context.WebContextKey, ctx)
|
||||||
ctx.Data.MergeFrom(middleware.CommonTemplateContextData())
|
ctx.Data.MergeFrom(middleware.CommonTemplateContextData())
|
||||||
ctx.Data.MergeFrom(middleware.ContextData{
|
ctx.Data.MergeFrom(middleware.ContextData{
|
||||||
"locale": ctx.Locale,
|
"locale": ctx.Locale,
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
package install
|
package install
|
||||||
|
|
||||||
import (
|
import (
|
||||||
goctx "context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"html"
|
"html"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -18,7 +17,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Routes registers the installation routes
|
// Routes registers the installation routes
|
||||||
func Routes(ctx goctx.Context) *web.Route {
|
func Routes() *web.Route {
|
||||||
base := web.NewRoute()
|
base := web.NewRoute()
|
||||||
base.Use(common.ProtocolMiddlewares()...)
|
base.Use(common.ProtocolMiddlewares()...)
|
||||||
base.RouteMethods("/assets/*", "GET, HEAD", public.AssetsHandlerFunc("/assets/"))
|
base.RouteMethods("/assets/*", "GET, HEAD", public.AssetsHandlerFunc("/assets/"))
|
||||||
|
|
|
@ -1,24 +1,41 @@
|
||||||
// Copyright 2021 The Gitea Authors. All rights reserved.
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
package install
|
package install
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"net/http/httptest"
|
||||||
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/unittest"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRoutes(t *testing.T) {
|
func TestRoutes(t *testing.T) {
|
||||||
// TODO: this test seems not really testing the handlers
|
r := Routes()
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
assert.NotNil(t, r)
|
||||||
defer cancel()
|
|
||||||
base := Routes(ctx)
|
w := httptest.NewRecorder()
|
||||||
assert.NotNil(t, base)
|
req := httptest.NewRequest("GET", "/", nil)
|
||||||
r := base.R.Routes()[1]
|
r.ServeHTTP(w, req)
|
||||||
routes := r.SubRoutes.Routes()[0]
|
assert.EqualValues(t, 200, w.Code)
|
||||||
assert.EqualValues(t, "/", routes.Pattern)
|
assert.Contains(t, w.Body.String(), `class="page-content install"`)
|
||||||
assert.Nil(t, routes.SubRoutes)
|
|
||||||
assert.Len(t, routes.Handlers, 2)
|
w = httptest.NewRecorder()
|
||||||
|
req = httptest.NewRequest("GET", "/no-such", nil)
|
||||||
|
r.ServeHTTP(w, req)
|
||||||
|
assert.EqualValues(t, 404, w.Code)
|
||||||
|
|
||||||
|
w = httptest.NewRecorder()
|
||||||
|
req = httptest.NewRequest("GET", "/assets/img/gitea.svg", nil)
|
||||||
|
r.ServeHTTP(w, req)
|
||||||
|
assert.EqualValues(t, 200, w.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
unittest.MainTest(m, &unittest.TestOptions{
|
||||||
|
GiteaRootPath: filepath.Join("..", ".."),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1405,7 +1405,7 @@ func registerRoutes(m *web.Route) {
|
||||||
}
|
}
|
||||||
|
|
||||||
m.NotFound(func(w http.ResponseWriter, req *http.Request) {
|
m.NotFound(func(w http.ResponseWriter, req *http.Request) {
|
||||||
ctx := context.GetContext(req)
|
ctx := context.GetWebContext(req)
|
||||||
ctx.NotFound("", nil)
|
ctx.NotFound("", nil)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore
|
||||||
middleware.SetLocaleCookie(resp, user.Language, 0)
|
middleware.SetLocaleCookie(resp, user.Language, 0)
|
||||||
|
|
||||||
// Clear whatever CSRF has right now, force to generate a new one
|
// Clear whatever CSRF has right now, force to generate a new one
|
||||||
if ctx := gitea_context.GetContext(req); ctx != nil {
|
if ctx := gitea_context.GetWebContext(req); ctx != nil {
|
||||||
ctx.Csrf.DeleteCookie(ctx)
|
ctx.Csrf.DeleteCookie(ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue