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  }