From c722fc9fc7b5bb4ec712fd81217b120d71b05500 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Mon, 5 Jun 2023 11:04:47 +0200 Subject: [PATCH 1/4] [TESTS] testMiddlewareHook, dependency injection in integration tests (cherry picked from commit 6623630d1070c6c0f195197ad769b2aed15a50b9) (cherry picked from commit d30b9dc5b43da2ce3ecb24c0d2d1c47ea7582f65) (cherry picked from commit 8e790a65bae3ad42defaecfe0eac233caada0650) --- routers/init.go | 4 ++-- routers/web/web.go | 3 ++- .../integration/api_activitypub_person_test.go | 13 ++++++------- tests/integration/api_nodeinfo_test.go | 5 ++--- tests/integration/create_no_session_test.go | 5 ++--- tests/integration/integration_test.go | 17 ++++++++++++++--- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/routers/init.go b/routers/init.go index ddbabcc397447..961c9567ea9fc 100644 --- a/routers/init.go +++ b/routers/init.go @@ -168,12 +168,12 @@ func InitWebInstalled(ctx context.Context) { } // NormalRoutes represents non install routes -func NormalRoutes() *web.Route { +func NormalRoutes(middlewares ...any) *web.Route { _ = templates.HTMLRenderer() r := web.NewRoute() r.Use(common.ProtocolMiddlewares()...) - r.Mount("/", web_routers.Routes()) + r.Mount("/", web_routers.Routes(middlewares...)) r.Mount("/api/v1", apiv1.Routes()) r.Mount("/api/internal", private.Routes()) diff --git a/routers/web/web.go b/routers/web/web.go index 45c374e9c0a8e..d5f0be44294a1 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -104,7 +104,7 @@ func ctxDataSet(args ...any) func(ctx *context.Context) { } // Routes returns all web routes -func Routes() *web.Route { +func Routes(middlewares ...any) *web.Route { routes := web.NewRoute() routes.Head("/", misc.DummyOK) // for health check - doesn't need to be passed through gzip handler @@ -161,6 +161,7 @@ func Routes() *web.Route { mid = append(mid, user.GetNotificationCount) mid = append(mid, repo.GetActiveStopwatch) mid = append(mid, goGet) + mid = append(mid, middlewares...) 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 a1ce802709cac..140cf0f034a38 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() + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes() + 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() + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes() + 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() + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes() + setNormalRoutes() }() srv := httptest.NewServer(c) diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go index 158a8660914a4..3052d95be0fd3 100644 --- a/tests/integration/api_nodeinfo_test.go +++ b/tests/integration/api_nodeinfo_test.go @@ -10,17 +10,16 @@ import ( "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() + setNormalRoutes() defer func() { setting.Federation.Enabled = false - c = routers.NormalRoutes() + 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 535d0d4955a5c..81e02e3c2c994 100644 --- a/tests/integration/create_no_session_test.go +++ b/tests/integration/create_no_session_test.go @@ -12,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" @@ -56,7 +55,7 @@ func TestSessionFileCreation(t *testing.T) { oldSessionConfig := setting.SessionConfig.ProviderConfig defer func() { setting.SessionConfig.ProviderConfig = oldSessionConfig - c = routers.NormalRoutes() + setNormalRoutes() }() var config session.Options @@ -75,7 +74,7 @@ func TestSessionFileCreation(t *testing.T) { setting.SessionConfig.ProviderConfig = string(newConfigBytes) - c = routers.NormalRoutes() + 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 2318ab9bb965b..ff209f8934b3f 100644 --- a/tests/integration/integration_test.go +++ b/tests/integration/integration_test.go @@ -40,7 +40,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(middlewareHook) +} type NilResponseRecorder struct { httptest.ResponseRecorder @@ -87,8 +99,7 @@ func TestMain(m *testing.M) { defer cancel() tests.InitTest(true) - c = routers.NormalRoutes() - + setNormalRoutes() // integration test settings... if setting.CfgProvider != nil { testingCfg := setting.CfgProvider.Section("integration-tests") From a60c98d953e4c388d6a697edb493d208900312a6 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Mon, 5 Jun 2023 11:43:31 +0200 Subject: [PATCH 2/4] [TESTS] createUser via the user model helper for integration tests (cherry picked from commit c1d14c5fffeb823385b2984cfcdb3e195bfb151d) (cherry picked from commit e0e8aabc985af153cf1fcb2064c17f68ec37f3a2) (cherry picked from commit 392a415070af7f4e872c7bb013f259e2dcc8b7b4) --- tests/integration/integration_test.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go index ff209f8934b3f..f3d542511a293 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" @@ -239,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() From eb6f451b087b390e194fb1515883dc8ed04c0d0e Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Mon, 5 Jun 2023 11:29:07 +0200 Subject: [PATCH 3/4] [TESTS] auth LinkAccount test coverage (cherry picked from commit e11dcc60f291f1b882a993f60f8381fe4561d6d0) use backticks to avoid backslash (cherry picked from commit 34212791eef2031ef09ea118a2ee5b98082174dc) (cherry picked from commit bde9473c69eaf6306457b4218d9704af64cb6cc8) (cherry picked from commit d4deb43084eec4ce0de786a01acef52921a39b13) --- tests/integration/linkaccount_test.go | 63 +++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tests/integration/linkaccount_test.go diff --git a/tests/integration/linkaccount_test.go b/tests/integration/linkaccount_test.go new file mode 100644 index 0000000000000..e7b9f9c2616a7 --- /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) + } +} From a9838b6f7bcb9d68d79a8faed2f3c6e93fde1ae2 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sat, 8 Jul 2023 06:55:53 +0200 Subject: [PATCH 4/4] s/Forgejo/Gitea/ --- tests/integration/linkaccount_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/linkaccount_test.go b/tests/integration/linkaccount_test.go index e7b9f9c2616a7..a7fae801353ff 100644 --- a/tests/integration/linkaccount_test.go +++ b/tests/integration/linkaccount_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Forgejo Authors. All rights reserved. +// Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration