diff --git a/modules/web/route.go b/modules/web/route.go index d801f1025..3a7e69065 100644 --- a/modules/web/route.go +++ b/modules/web/route.go @@ -14,6 +14,10 @@ import ( chi "github.com/go-chi/chi/v5" ) +type KeyTestMiddlewareHookType string + +var KeyTestMiddlewareHook = KeyTestMiddlewareHookType("testMiddlewareHook") + // Bind binding an obj to a handler func Bind[T any](_ T) any { return func(ctx *context.Context) { diff --git a/routers/web/web.go b/routers/web/web.go index 037e3075c..786cfcc1e 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -167,6 +167,10 @@ func Routes(ctx gocontext.Context) *web.Route { mid = append(mid, user.GetNotificationCount) mid = append(mid, repo.GetActiveStopwatch) mid = append(mid, goGet) + middlewareHook := ctx.Value(web.KeyTestMiddlewareHook) + if middlewareHook != nil { + mid = append(mid, middlewareHook) + } others := web.NewRoute() others.Use(mid...) diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go index 301cfba17..140cf0f03 100644 --- a/tests/integration/api_activitypub_person_test.go +++ b/tests/integration/api_activitypub_person_test.go @@ -14,7 +14,6 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/activitypub" "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/routers" ap "github.com/go-ap/activitypub" "github.com/stretchr/testify/assert" @@ -22,10 +21,10 @@ import ( func TestActivityPubPerson(t *testing.T) { setting.Federation.Enabled = true - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() }() onGiteaRun(t, func(*testing.T, *url.URL) { @@ -60,10 +59,10 @@ func TestActivityPubPerson(t *testing.T) { func TestActivityPubMissingPerson(t *testing.T) { setting.Federation.Enabled = true - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() }() onGiteaRun(t, func(*testing.T, *url.URL) { @@ -75,10 +74,10 @@ func TestActivityPubMissingPerson(t *testing.T) { func TestActivityPubPersonInbox(t *testing.T) { setting.Federation.Enabled = true - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() }() srv := httptest.NewServer(c) diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go index bc2f11a7f..3052d95be 100644 --- a/tests/integration/api_nodeinfo_test.go +++ b/tests/integration/api_nodeinfo_test.go @@ -4,24 +4,22 @@ package integration import ( - "context" "net/http" "net/url" "testing" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/routers" "github.com/stretchr/testify/assert" ) func TestNodeinfo(t *testing.T) { setting.Federation.Enabled = true - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() }() onGiteaRun(t, func(*testing.T, *url.URL) { diff --git a/tests/integration/create_no_session_test.go b/tests/integration/create_no_session_test.go index 9a96ed61f..81e02e3c2 100644 --- a/tests/integration/create_no_session_test.go +++ b/tests/integration/create_no_session_test.go @@ -4,7 +4,6 @@ package integration import ( - "context" "net/http" "net/http/httptest" "os" @@ -13,7 +12,6 @@ import ( "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/routers" "code.gitea.io/gitea/tests" "gitea.com/go-chi/session" @@ -57,7 +55,7 @@ func TestSessionFileCreation(t *testing.T) { oldSessionConfig := setting.SessionConfig.ProviderConfig defer func() { setting.SessionConfig.ProviderConfig = oldSessionConfig - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() }() var config session.Options @@ -76,7 +74,7 @@ func TestSessionFileCreation(t *testing.T) { setting.SessionConfig.ProviderConfig = string(newConfigBytes) - c = routers.NormalRoutes(context.TODO()) + setNormalRoutes() t.Run("NoSessionOnViewIssue", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go index 27918a9cc..7cc7a4501 100644 --- a/tests/integration/integration_test.go +++ b/tests/integration/integration_test.go @@ -24,6 +24,7 @@ import ( "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" gitea_context "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/json" @@ -33,6 +34,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers" + user_service "code.gitea.io/gitea/services/user" "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" @@ -40,7 +42,19 @@ import ( "github.com/xeipuuv/gojsonschema" ) -var c *web.Route +var ( + c *web.Route + testMiddlewareHook func(*gitea_context.Context) +) + +func setNormalRoutes() { + middlewareHook := func(ctx *gitea_context.Context) { + if testMiddlewareHook != nil { + testMiddlewareHook(ctx) + } + } + c = routers.NormalRoutes(context.WithValue(context.Background(), web.KeyTestMiddlewareHook, middlewareHook)) +} type NilResponseRecorder struct { httptest.ResponseRecorder @@ -87,8 +101,7 @@ func TestMain(m *testing.M) { defer cancel() tests.InitTest(true) - c = routers.NormalRoutes(context.TODO()) - + setNormalRoutes() // integration test settings... if setting.CfgProvider != nil { testingCfg := setting.CfgProvider.Section("integration-tests") @@ -228,6 +241,21 @@ func getUserToken(t testing.TB, userName string, scope ...auth.AccessTokenScope) return getTokenForLoggedInUser(t, loginUser(t, userName), scope...) } +func createUser(t testing.TB, userName, email, password string) func() { + u := &user_model.User{ + Name: userName, + Email: email, + Passwd: password, + MustChangePassword: false, + LoginType: auth.Plain, + } + + assert.NoError(t, user_model.CreateUser(u, &user_model.CreateUserOverwriteOptions{})) + return func() { + assert.NoError(t, user_service.DeleteUser(context.Background(), u, true)) + } +} + func loginUser(t testing.TB, userName string) *TestSession { t.Helper() diff --git a/tests/integration/linkaccount_test.go b/tests/integration/linkaccount_test.go new file mode 100644 index 000000000..e7b9f9c26 --- /dev/null +++ b/tests/integration/linkaccount_test.go @@ -0,0 +1,63 @@ +// Copyright 2023 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "net/http" + "testing" + + gitea_context "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/tests" + + "github.com/markbates/goth" + "github.com/stretchr/testify/assert" +) + +func TestLinkAccountChoose(t *testing.T) { + defer tests.PrepareTestEnv(t)() + username := "linkaccountuser" + email := "linkaccountuser@example.com" + password := "linkaccountuser" + defer createUser(t, username, email, password)() + + defer func() { + testMiddlewareHook = nil + }() + + for _, testCase := range []struct { + gothUser goth.User + signupTab string + signinTab string + }{ + { + gothUser: goth.User{}, + signupTab: "item active", + signinTab: "item ", + }, + { + gothUser: goth.User{ + Email: email, + }, + signupTab: "item ", + signinTab: "item active", + }, + } { + testMiddlewareHook = func(ctx *gitea_context.Context) { + ctx.Session.Set("linkAccountGothUser", testCase.gothUser) + } + + req := NewRequest(t, "GET", "/user/link_account") + resp := MakeRequest(t, req, http.StatusOK) + assert.Equal(t, resp.Code, http.StatusOK, resp.Body) + doc := NewHTMLParser(t, resp.Body) + + class, exists := doc.Find(`.new-menu-inner .item[data-tab="auth-link-signup-tab"]`).Attr("class") + assert.True(t, exists, resp.Body) + assert.Equal(t, testCase.signupTab, class) + + class, exists = doc.Find(`.new-menu-inner .item[data-tab="auth-link-signin-tab"]`).Attr("class") + assert.True(t, exists) + assert.Equal(t, testCase.signinTab, class) + } +}