loading up the forgejo repo on tangled to test page performance
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}