loading up the forgejo repo on tangled to test page performance
at forgejo 189 lines 6.3 kB view raw
1// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. 2// SPDX-License-Identifier: MIT 3 4package integration 5 6import ( 7 "net/http" 8 "net/url" 9 "testing" 10 11 "forgejo.org/models/db" 12 repo_model "forgejo.org/models/repo" 13 "forgejo.org/models/unittest" 14 user_model "forgejo.org/models/user" 15 webhook_model "forgejo.org/models/webhook" 16 "forgejo.org/modules/git" 17 "forgejo.org/modules/gitrepo" 18 "forgejo.org/modules/json" 19 webhook_module "forgejo.org/modules/webhook" 20 "forgejo.org/services/release" 21 "forgejo.org/tests" 22 23 "github.com/stretchr/testify/assert" 24 "github.com/stretchr/testify/require" 25) 26 27func TestWebhookPayloadRef(t *testing.T) { 28 onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { 29 w := unittest.AssertExistsAndLoadBean(t, &webhook_model.Webhook{ID: 1}) 30 w.HookEvent = &webhook_module.HookEvent{ 31 SendEverything: true, 32 } 33 require.NoError(t, w.UpdateEvent()) 34 require.NoError(t, webhook_model.UpdateWebhook(db.DefaultContext, w)) 35 36 hookTasks := retrieveHookTasks(t, w.ID, true) 37 hookTasksLenBefore := len(hookTasks) 38 39 session := loginUser(t, "user2") 40 // create new branch 41 csrf := GetCSRF(t, session, "user2/repo1") 42 req := NewRequestWithValues(t, "POST", "user2/repo1/branches/_new/branch/master", 43 map[string]string{ 44 "_csrf": csrf, 45 "new_branch_name": "arbre", 46 "create_tag": "false", 47 }, 48 ) 49 session.MakeRequest(t, req, http.StatusSeeOther) 50 // delete the created branch 51 req = NewRequestWithValues(t, "POST", "user2/repo1/branches/delete?name=arbre", 52 map[string]string{ 53 "_csrf": csrf, 54 }, 55 ) 56 session.MakeRequest(t, req, http.StatusOK) 57 58 // check the newly created hooktasks 59 hookTasks = retrieveHookTasks(t, w.ID, false) 60 expected := map[webhook_module.HookEventType]bool{ 61 webhook_module.HookEventCreate: true, 62 webhook_module.HookEventPush: true, // the branch creation also creates a push event 63 webhook_module.HookEventDelete: true, 64 } 65 for _, hookTask := range hookTasks[:len(hookTasks)-hookTasksLenBefore] { 66 if !expected[hookTask.EventType] { 67 t.Errorf("unexpected (or duplicated) event %q", hookTask.EventType) 68 } 69 70 var payload struct { 71 Ref string `json:"ref"` 72 } 73 require.NoError(t, json.Unmarshal([]byte(hookTask.PayloadContent), &payload)) 74 assert.Equal(t, "refs/heads/arbre", payload.Ref, "unexpected ref for %q event", hookTask.EventType) 75 delete(expected, hookTask.EventType) 76 } 77 assert.Empty(t, expected) 78 }) 79} 80 81func TestWebhookReleaseEvents(t *testing.T) { 82 defer tests.PrepareTestEnv(t)() 83 84 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 85 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 86 w := unittest.AssertExistsAndLoadBean(t, &webhook_model.Webhook{ 87 ID: 1, 88 RepoID: repo.ID, 89 }) 90 w.HookEvent = &webhook_module.HookEvent{ 91 SendEverything: true, 92 } 93 require.NoError(t, w.UpdateEvent()) 94 require.NoError(t, webhook_model.UpdateWebhook(db.DefaultContext, w)) 95 96 hookTasks := retrieveHookTasks(t, w.ID, true) 97 98 gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo) 99 require.NoError(t, err) 100 defer gitRepo.Close() 101 102 t.Run("CreateRelease", func(t *testing.T) { 103 require.NoError(t, release.CreateRelease(gitRepo, &repo_model.Release{ 104 RepoID: repo.ID, 105 Repo: repo, 106 PublisherID: user.ID, 107 Publisher: user, 108 TagName: "v1.1.1", 109 Target: "master", 110 Title: "v1.1.1 is released", 111 Note: "v1.1.1 is released", 112 IsDraft: false, 113 IsPrerelease: false, 114 IsTag: false, 115 }, "", nil)) 116 117 // check the newly created hooktasks 118 hookTasksLenBefore := len(hookTasks) 119 hookTasks = retrieveHookTasks(t, w.ID, false) 120 121 checkHookTasks(t, map[webhook_module.HookEventType]string{ 122 webhook_module.HookEventRelease: "published", 123 webhook_module.HookEventCreate: "", // a tag was created as well 124 webhook_module.HookEventPush: "", // the tag creation also means a push event 125 }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 126 127 t.Run("UpdateRelease", func(t *testing.T) { 128 rel := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v1.1.1"}) 129 require.NoError(t, release.UpdateRelease(db.DefaultContext, user, gitRepo, rel, false, nil)) 130 131 // check the newly created hooktasks 132 hookTasksLenBefore := len(hookTasks) 133 hookTasks = retrieveHookTasks(t, w.ID, false) 134 135 checkHookTasks(t, map[webhook_module.HookEventType]string{ 136 webhook_module.HookEventRelease: "updated", 137 }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 138 }) 139 }) 140 141 t.Run("CreateNewTag", func(t *testing.T) { 142 require.NoError(t, release.CreateNewTag(db.DefaultContext, 143 user, 144 repo, 145 "master", 146 "v1.1.2", 147 "v1.1.2 is tagged", 148 )) 149 150 // check the newly created hooktasks 151 hookTasksLenBefore := len(hookTasks) 152 hookTasks = retrieveHookTasks(t, w.ID, false) 153 154 checkHookTasks(t, map[webhook_module.HookEventType]string{ 155 webhook_module.HookEventCreate: "", // tag was created as well 156 webhook_module.HookEventPush: "", // the tag creation also means a push event 157 }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 158 159 t.Run("UpdateRelease", func(t *testing.T) { 160 rel := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v1.1.2"}) 161 require.NoError(t, release.UpdateRelease(db.DefaultContext, user, gitRepo, rel, true, nil)) 162 163 // check the newly created hooktasks 164 hookTasksLenBefore := len(hookTasks) 165 hookTasks = retrieveHookTasks(t, w.ID, false) 166 167 checkHookTasks(t, map[webhook_module.HookEventType]string{ 168 webhook_module.HookEventRelease: "published", 169 }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 170 }) 171 }) 172} 173 174func checkHookTasks(t *testing.T, expectedActions map[webhook_module.HookEventType]string, hookTasks []*webhook_model.HookTask) { 175 t.Helper() 176 for _, hookTask := range hookTasks { 177 expectedAction, ok := expectedActions[hookTask.EventType] 178 if !ok { 179 t.Errorf("unexpected (or duplicated) event %q", hookTask.EventType) 180 } 181 var payload struct { 182 Action string `json:"action"` 183 } 184 require.NoError(t, json.Unmarshal([]byte(hookTask.PayloadContent), &payload)) 185 assert.Equal(t, expectedAction, payload.Action, "unexpected action for %q event", hookTask.EventType) 186 delete(expectedActions, hookTask.EventType) 187 } 188 assert.Empty(t, expectedActions) 189}