2017-08-02 22:09:16 -07:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package test
import (
"net/http"
2019-03-27 17:33:00 +08:00
"net/http/httptest"
2017-08-02 22:09:16 -07:00
"net/url"
"testing"
2017-11-30 07:52:15 -08:00
"code.gitea.io/gitea/models"
2017-08-02 22:09:16 -07:00
"code.gitea.io/gitea/modules/context"
2019-03-27 17:33:00 +08:00
"code.gitea.io/gitea/modules/git"
2018-04-28 23:21:33 -07:00
2019-08-23 09:40:30 -07:00
"gitea.com/macaron/macaron"
"gitea.com/macaron/session"
2017-08-02 22:09:16 -07:00
"github.com/stretchr/testify/assert"
)
// MockContext mock context for unit tests
2017-11-30 07:52:15 -08:00
func MockContext ( t * testing . T , path string ) * context . Context {
var macaronContext macaron . Context
macaronContext . ReplaceAllParams ( macaron . Params { } )
2017-08-02 22:09:16 -07:00
macaronContext . Locale = & mockLocale { }
2017-11-30 07:52:15 -08:00
requestURL , err := url . Parse ( path )
assert . NoError ( t , err )
macaronContext . Req = macaron . Request { Request : & http . Request {
URL : requestURL ,
Form : url . Values { } ,
} }
2017-08-02 22:09:16 -07:00
macaronContext . Resp = & mockResponseWriter { }
macaronContext . Render = & mockRender { ResponseWriter : macaronContext . Resp }
2017-11-30 07:52:15 -08:00
macaronContext . Data = map [ string ] interface { } { }
2017-08-02 22:09:16 -07:00
return & context . Context {
2017-11-30 07:52:15 -08:00
Context : & macaronContext ,
2017-12-03 01:11:22 +08:00
Flash : & session . Flash {
Values : make ( url . Values ) ,
} ,
2017-08-02 22:09:16 -07:00
}
}
2017-11-30 07:52:15 -08:00
// LoadRepo load a repo into a test context.
func LoadRepo ( t * testing . T , ctx * context . Context , repoID int64 ) {
ctx . Repo = & context . Repository { }
ctx . Repo . Repository = models . AssertExistsAndLoadBean ( t , & models . Repository { ID : repoID } ) . ( * models . Repository )
2017-12-15 13:11:02 -08:00
ctx . Repo . RepoLink = ctx . Repo . Repository . Link ( )
2018-11-28 19:26:14 +08:00
var err error
ctx . Repo . Permission , err = models . GetUserRepoPermission ( ctx . Repo . Repository , ctx . User )
assert . NoError ( t , err )
2017-11-30 07:52:15 -08:00
}
2018-04-28 23:21:33 -07:00
// LoadRepoCommit loads a repo's commit into a test context.
func LoadRepoCommit ( t * testing . T , ctx * context . Context ) {
gitRepo , err := git . OpenRepository ( ctx . Repo . Repository . RepoPath ( ) )
assert . NoError ( t , err )
2019-11-13 07:01:19 +00:00
defer gitRepo . Close ( )
2018-04-28 23:21:33 -07:00
branch , err := gitRepo . GetHEADBranch ( )
assert . NoError ( t , err )
2020-02-26 07:32:22 +01:00
assert . NotNil ( t , branch )
if branch != nil {
ctx . Repo . Commit , err = gitRepo . GetBranchCommit ( branch . Name )
assert . NoError ( t , err )
}
2018-04-28 23:21:33 -07:00
}
2017-11-30 07:52:15 -08:00
// LoadUser load a user into a test context.
func LoadUser ( t * testing . T , ctx * context . Context , userID int64 ) {
ctx . User = models . AssertExistsAndLoadBean ( t , & models . User { ID : userID } ) . ( * models . User )
}
2017-12-07 21:22:02 -08:00
// LoadGitRepo load a git repo into a test context. Requires that ctx.Repo has
// already been populated.
func LoadGitRepo ( t * testing . T , ctx * context . Context ) {
assert . NoError ( t , ctx . Repo . Repository . GetOwner ( ) )
var err error
ctx . Repo . GitRepo , err = git . OpenRepository ( ctx . Repo . Repository . RepoPath ( ) )
assert . NoError ( t , err )
}
2017-08-02 22:09:16 -07:00
type mockLocale struct { }
func ( l mockLocale ) Language ( ) string {
return "en"
}
func ( l mockLocale ) Tr ( s string , _ ... interface { } ) string {
2017-11-30 07:52:15 -08:00
return s
2017-08-02 22:09:16 -07:00
}
type mockResponseWriter struct {
2017-12-15 13:11:02 -08:00
httptest . ResponseRecorder
size int
2017-08-02 22:09:16 -07:00
}
func ( rw * mockResponseWriter ) Write ( b [ ] byte ) ( int , error ) {
rw . size += len ( b )
2017-12-15 13:11:02 -08:00
return rw . ResponseRecorder . Write ( b )
2017-08-02 22:09:16 -07:00
}
func ( rw * mockResponseWriter ) Status ( ) int {
2017-12-15 13:11:02 -08:00
return rw . ResponseRecorder . Code
2017-08-02 22:09:16 -07:00
}
func ( rw * mockResponseWriter ) Written ( ) bool {
2017-12-15 13:11:02 -08:00
return rw . ResponseRecorder . Code > 0
2017-08-02 22:09:16 -07:00
}
func ( rw * mockResponseWriter ) Size ( ) int {
return rw . size
}
func ( rw * mockResponseWriter ) Before ( b macaron . BeforeFunc ) {
b ( rw )
}
type mockRender struct {
http . ResponseWriter
}
func ( tr * mockRender ) SetResponseWriter ( rw http . ResponseWriter ) {
tr . ResponseWriter = rw
}
2017-11-30 07:52:15 -08:00
func ( tr * mockRender ) JSON ( status int , _ interface { } ) {
tr . Status ( status )
2017-08-02 22:09:16 -07:00
}
func ( tr * mockRender ) JSONString ( interface { } ) ( string , error ) {
return "" , nil
}
func ( tr * mockRender ) RawData ( status int , _ [ ] byte ) {
tr . Status ( status )
}
func ( tr * mockRender ) PlainText ( status int , _ [ ] byte ) {
tr . Status ( status )
}
func ( tr * mockRender ) HTML ( status int , _ string , _ interface { } , _ ... macaron . HTMLOptions ) {
tr . Status ( status )
}
func ( tr * mockRender ) HTMLSet ( status int , _ string , _ string , _ interface { } , _ ... macaron . HTMLOptions ) {
tr . Status ( status )
}
func ( tr * mockRender ) HTMLSetString ( string , string , interface { } , ... macaron . HTMLOptions ) ( string , error ) {
return "" , nil
}
func ( tr * mockRender ) HTMLString ( string , interface { } , ... macaron . HTMLOptions ) ( string , error ) {
return "" , nil
}
func ( tr * mockRender ) HTMLSetBytes ( string , string , interface { } , ... macaron . HTMLOptions ) ( [ ] byte , error ) {
return nil , nil
}
func ( tr * mockRender ) HTMLBytes ( string , interface { } , ... macaron . HTMLOptions ) ( [ ] byte , error ) {
return nil , nil
}
func ( tr * mockRender ) XML ( status int , _ interface { } ) {
tr . Status ( status )
}
func ( tr * mockRender ) Error ( status int , _ ... string ) {
tr . Status ( status )
}
func ( tr * mockRender ) Status ( status int ) {
tr . ResponseWriter . WriteHeader ( status )
}
func ( tr * mockRender ) SetTemplatePath ( string , string ) {
}
func ( tr * mockRender ) HasTemplateSet ( string ) bool {
return true
}