code.gitea.io/gitea@v1.19.3/modules/test/context_tests.go (about) 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package test 5 6 import ( 7 scontext "context" 8 "html/template" 9 "io" 10 "net/http" 11 "net/http/httptest" 12 "net/url" 13 "testing" 14 15 access_model "code.gitea.io/gitea/models/perm/access" 16 repo_model "code.gitea.io/gitea/models/repo" 17 "code.gitea.io/gitea/models/unittest" 18 user_model "code.gitea.io/gitea/models/user" 19 "code.gitea.io/gitea/modules/context" 20 "code.gitea.io/gitea/modules/git" 21 "code.gitea.io/gitea/modules/web/middleware" 22 23 chi "github.com/go-chi/chi/v5" 24 "github.com/stretchr/testify/assert" 25 "github.com/unrolled/render" 26 ) 27 28 // MockContext mock context for unit tests 29 func MockContext(t *testing.T, path string) *context.Context { 30 resp := &mockResponseWriter{} 31 ctx := context.Context{ 32 Render: &mockRender{}, 33 Data: make(map[string]interface{}), 34 Flash: &middleware.Flash{ 35 Values: make(url.Values), 36 }, 37 Resp: context.NewResponse(resp), 38 Locale: &mockLocale{}, 39 } 40 defer ctx.Close() 41 42 requestURL, err := url.Parse(path) 43 assert.NoError(t, err) 44 req := &http.Request{ 45 URL: requestURL, 46 Form: url.Values{}, 47 } 48 49 chiCtx := chi.NewRouteContext() 50 req = req.WithContext(scontext.WithValue(req.Context(), chi.RouteCtxKey, chiCtx)) 51 ctx.Req = context.WithContext(req, &ctx) 52 return &ctx 53 } 54 55 // LoadRepo load a repo into a test context. 56 func LoadRepo(t *testing.T, ctx *context.Context, repoID int64) { 57 ctx.Repo = &context.Repository{} 58 ctx.Repo.Repository = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID}) 59 var err error 60 ctx.Repo.Owner, err = user_model.GetUserByID(ctx, ctx.Repo.Repository.OwnerID) 61 assert.NoError(t, err) 62 ctx.Repo.RepoLink = ctx.Repo.Repository.Link() 63 ctx.Repo.Permission, err = access_model.GetUserRepoPermission(ctx, ctx.Repo.Repository, ctx.Doer) 64 assert.NoError(t, err) 65 } 66 67 // LoadRepoCommit loads a repo's commit into a test context. 68 func LoadRepoCommit(t *testing.T, ctx *context.Context) { 69 gitRepo, err := git.OpenRepository(ctx, ctx.Repo.Repository.RepoPath()) 70 assert.NoError(t, err) 71 defer gitRepo.Close() 72 branch, err := gitRepo.GetHEADBranch() 73 assert.NoError(t, err) 74 assert.NotNil(t, branch) 75 if branch != nil { 76 ctx.Repo.Commit, err = gitRepo.GetBranchCommit(branch.Name) 77 assert.NoError(t, err) 78 } 79 } 80 81 // LoadUser load a user into a test context. 82 func LoadUser(t *testing.T, ctx *context.Context, userID int64) { 83 ctx.Doer = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID}) 84 } 85 86 // LoadGitRepo load a git repo into a test context. Requires that ctx.Repo has 87 // already been populated. 88 func LoadGitRepo(t *testing.T, ctx *context.Context) { 89 assert.NoError(t, ctx.Repo.Repository.LoadOwner(ctx)) 90 var err error 91 ctx.Repo.GitRepo, err = git.OpenRepository(ctx, ctx.Repo.Repository.RepoPath()) 92 assert.NoError(t, err) 93 } 94 95 type mockLocale struct{} 96 97 func (l mockLocale) Language() string { 98 return "en" 99 } 100 101 func (l mockLocale) Tr(s string, _ ...interface{}) string { 102 return s 103 } 104 105 func (l mockLocale) TrN(_cnt interface{}, key1, _keyN string, _args ...interface{}) string { 106 return key1 107 } 108 109 type mockResponseWriter struct { 110 httptest.ResponseRecorder 111 size int 112 } 113 114 func (rw *mockResponseWriter) Write(b []byte) (int, error) { 115 rw.size += len(b) 116 return rw.ResponseRecorder.Write(b) 117 } 118 119 func (rw *mockResponseWriter) Status() int { 120 return rw.ResponseRecorder.Code 121 } 122 123 func (rw *mockResponseWriter) Written() bool { 124 return rw.ResponseRecorder.Code > 0 125 } 126 127 func (rw *mockResponseWriter) Size() int { 128 return rw.size 129 } 130 131 func (rw *mockResponseWriter) Push(target string, opts *http.PushOptions) error { 132 return nil 133 } 134 135 type mockRender struct{} 136 137 func (tr *mockRender) TemplateLookup(tmpl string) *template.Template { 138 return nil 139 } 140 141 func (tr *mockRender) HTML(w io.Writer, status int, _ string, _ interface{}, _ ...render.HTMLOptions) error { 142 if resp, ok := w.(http.ResponseWriter); ok { 143 resp.WriteHeader(status) 144 } 145 return nil 146 }