@ -433,133 +433,104 @@ func doMergeFork(ctx, baseCtx APITestContext, baseBranch, headBranch string) fun
defer PrintCurrentTest ( t ) ( )
defer PrintCurrentTest ( t ) ( )
var pr api . PullRequest
var pr api . PullRequest
var err error
var err error
// Create a test pullrequest
t . Run ( "CreatePullRequest" , func ( t * testing . T ) {
t . Run ( "CreatePullRequest" , func ( t * testing . T ) {
pr , err = doAPICreatePullRequest ( ctx , baseCtx . Username , baseCtx . Reponame , baseBranch , headBranch ) ( t )
pr , err = doAPICreatePullRequest ( ctx , baseCtx . Username , baseCtx . Reponame , baseBranch , headBranch ) ( t )
assert . NoError ( t , err )
assert . NoError ( t , err )
} )
} )
t . Run ( "EnsureCanSeePull" , func ( t * testing . T ) {
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
// Ensure the PR page works
ctx . Session . MakeRequest ( t , req , http . StatusOK )
t . Run ( "EnsureCanSeePull" , doEnsureCanSeePull ( baseCtx , pr ) )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/files" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
// Then get the diff string
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/commits" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
} )
var diffStr string
var diffStr string
t . Run ( "GetDiff" , func ( t * testing . T ) {
t . Run ( "GetDiff" , func ( t * testing . T ) {
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d.diff" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d.diff" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
resp := ctx . Session . MakeRequest ( t , req , http . StatusOK )
resp := ctx . Session . MakeRequest ( t , req , http . StatusOK )
diffStr = resp . Body . String ( )
diffStr = resp . Body . String ( )
} )
} )
// Now: Merge the PR & make sure that doesn't break the PR page or change its diff
t . Run ( "MergePR" , doAPIMergePullRequest ( baseCtx , baseCtx . Username , baseCtx . Reponame , pr . Index ) )
t . Run ( "MergePR" , doAPIMergePullRequest ( baseCtx , baseCtx . Username , baseCtx . Reponame , pr . Index ) )
t . Run ( "EnsureCanSeePull" , func ( t * testing . T ) {
t . Run ( "EnsureCanSeePull" , doEnsureCanSeePull ( baseCtx , pr ) )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
t . Run ( "EnsureDiffNoChange" , doEnsureDiffNoChange ( baseCtx , pr , diffStr ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/files" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
// Then: Delete the head branch & make sure that doesn't break the PR page or change its diff
ctx . Session . MakeRequest ( t , req , http . StatusOK )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/commits" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
} )
t . Run ( "EnsureDiffNoChange" , func ( t * testing . T ) {
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d.diff" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
resp := ctx . Session . MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , diffStr , resp . Body . String ( ) )
} )
t . Run ( "DeleteHeadBranch" , doBranchDelete ( baseCtx , baseCtx . Username , baseCtx . Reponame , headBranch ) )
t . Run ( "DeleteHeadBranch" , doBranchDelete ( baseCtx , baseCtx . Username , baseCtx . Reponame , headBranch ) )
t . Run ( "EnsureCanSeePull" , func ( t * testing . T ) {
t . Run ( "EnsureCanSeePull" , doEnsureCanSeePull ( baseCtx , pr ) )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
t . Run ( "EnsureDiffNoChange" , doEnsureDiffNoChange ( baseCtx , pr , diffStr ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/files" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
// Delete the head repository & make sure that doesn't break the PR page or change its diff
ctx . Session . MakeRequest ( t , req , http . StatusOK )
t . Run ( "DeleteHeadRepository" , doAPIDeleteRepository ( ctx ) )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/commits" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
t . Run ( "EnsureCanSeePull" , doEnsureCanSeePull ( baseCtx , pr ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
t . Run ( "EnsureDiffNoChange" , doEnsureDiffNoChange ( baseCtx , pr , diffStr ) )
} )
}
t . Run ( "EnsureDiffNoChange" , func ( t * testing . T ) {
}
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d.diff" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
resp := ctx . Session . MakeRequest ( t , req , http . StatusOK )
func doEnsureCanSeePull ( ctx APITestContext , pr api . PullRequest ) func ( t * testing . T ) {
assert . Equal ( t , diffStr , resp . Body . String ( ) )
return func ( t * testing . T ) {
} )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d" , url . PathEscape ( ctx . Username ) , url . PathEscape ( ctx . Reponame ) , pr . Index ) )
t . Run ( "DeleteRepository" , doAPIDeleteRepository ( ctx ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
t . Run ( "EnsureCanSeePull" , func ( t * testing . T ) {
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/files" , url . PathEscape ( ctx . Username ) , url . PathEscape ( ctx . Reponame ) , pr . Index ) )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/commits" , url . PathEscape ( ctx . Username ) , url . PathEscape ( ctx . Reponame ) , pr . Index ) )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/files" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
ctx . Session . MakeRequest ( t , req , http . StatusOK )
}
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d/commits" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
}
ctx . Session . MakeRequest ( t , req , http . StatusOK )
} )
func doEnsureDiffNoChange ( ctx APITestContext , pr api . PullRequest , diffStr string ) func ( t * testing . T ) {
t . Run ( "EnsureDiffNoChange" , func ( t * testing . T ) {
return func ( t * testing . T ) {
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d.diff" , url . PathEscape ( baseCtx . Username ) , url . PathEscape ( baseCtx . Reponame ) , pr . Index ) )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/%s/%s/pulls/%d.diff" , url . PathEscape ( ctx . Username ) , url . PathEscape ( ctx . Reponame ) , pr . Index ) )
resp := ctx . Session . MakeRequest ( t , req , http . StatusOK )
resp := ctx . Session . MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , diffStr , resp . Body . String ( ) )
assert . Equal ( t , diffStr , resp . Body . String ( ) )
} )
}
}
}
}
func doPushCreate ( ctx APITestContext , u * url . URL ) func ( t * testing . T ) {
func doPushCreate ( ctx APITestContext , u * url . URL ) func ( t * testing . T ) {
return func ( t * testing . T ) {
return func ( t * testing . T ) {
defer PrintCurrentTest ( t ) ( )
defer PrintCurrentTest ( t ) ( )
// create a context for a currently non-existent repository
ctx . Reponame = fmt . Sprintf ( "repo-tmp-push-create-%s" , u . Scheme )
ctx . Reponame = fmt . Sprintf ( "repo-tmp-push-create-%s" , u . Scheme )
u . Path = ctx . GitPath ( )
u . Path = ctx . GitPath ( )
// Create a temporary directory
tmpDir , err := ioutil . TempDir ( "" , ctx . Reponame )
tmpDir , err := ioutil . TempDir ( "" , ctx . Reponame )
assert . NoError ( t , err )
assert . NoError ( t , err )
defer os . RemoveAll ( tmpDir )
err = git . InitRepository ( tmpDir , false )
// Now create local repository to push as our test and set its origin
assert . NoError ( t , err )
t . Run ( "InitTestRepository" , doGitInitTestRepository ( tmpDir ) )
t . Run ( "AddRemote" , doGitAddRemote ( tmpDir , "origin" , u ) )
_ , err = os . Create ( filepath . Join ( tmpDir , "test.txt" ) )
// Disable "Push To Create" and attempt to push
assert . NoError ( t , err )
err = git . AddChanges ( tmpDir , true )
assert . NoError ( t , err )
err = git . CommitChanges ( tmpDir , git . CommitChangesOptions {
Committer : & git . Signature {
Email : "user2@example.com" ,
Name : "User Two" ,
When : time . Now ( ) ,
} ,
Author : & git . Signature {
Email : "user2@example.com" ,
Name : "User Two" ,
When : time . Now ( ) ,
} ,
Message : fmt . Sprintf ( "Testing push create @ %v" , time . Now ( ) ) ,
} )
assert . NoError ( t , err )
_ , err = git . NewCommand ( "remote" , "add" , "origin" , u . String ( ) ) . RunInDir ( tmpDir )
assert . NoError ( t , err )
invalidCtx := ctx
invalidCtx . Reponame = fmt . Sprintf ( "invalid/repo-tmp-push-create-%s" , u . Scheme )
u . Path = invalidCtx . GitPath ( )
_ , err = git . NewCommand ( "remote" , "add" , "invalid" , u . String ( ) ) . RunInDir ( tmpDir )
assert . NoError ( t , err )
// Push to create disabled
setting . Repository . EnablePushCreateUser = false
setting . Repository . EnablePushCreateUser = false
_ , err = git . NewCommand ( "push" , "origin" , "master" ) . RunInDir ( tmpDir )
t . Run ( "FailToPushAndCreateTestRepository" , doGitPushTestRepositoryFail ( tmpDir , "origin" , "master" ) )
assert . Error ( t , err )
// Push to create enabled
// Enable "Push To Create"
setting . Repository . EnablePushCreateUser = true
setting . Repository . EnablePushCreateUser = true
// Invalid repo
// Assert that cloning from a non-existent repository does not create it and that it definitely wasn't create above
_ , err = git . NewCommand ( "push" , "invalid" , "master" ) . RunInDir ( tmpDir )
t . Run ( "FailToCloneFromNonExistentRepository" , doGitCloneFail ( u ) )
assert . Error ( t , err )
// Valid repo
// Then "Push To Create"x
_ , err = git . NewCommand ( "push" , "origin" , "master" ) . RunInDir ( tmpDir )
t . Run ( "SuccessfullyPushAndCreateTestRepository" , doGitPushTestRepository ( tmpDir , "origin" , "master" ) )
assert . NoError ( t , err )
// Fetch repo from database
// Finally, fetch repo from database and ensure the correct repository has been created
repo , err := models . GetRepositoryByOwnerAndName ( ctx . Username , ctx . Reponame )
repo , err := models . GetRepositoryByOwnerAndName ( ctx . Username , ctx . Reponame )
assert . NoError ( t , err )
assert . NoError ( t , err )
assert . False ( t , repo . IsEmpty )
assert . False ( t , repo . IsEmpty )
assert . True ( t , repo . IsPrivate )
assert . True ( t , repo . IsPrivate )
// Now add a remote that is invalid to "Push To Create"
invalidCtx := ctx
invalidCtx . Reponame = fmt . Sprintf ( "invalid/repo-tmp-push-create-%s" , u . Scheme )
u . Path = invalidCtx . GitPath ( )
t . Run ( "AddInvalidRemote" , doGitAddRemote ( tmpDir , "invalid" , u ) )
// Fail to "Push To Create" the invalid
t . Run ( "FailToPushAndCreateInvalidTestRepository" , doGitPushTestRepositoryFail ( tmpDir , "invalid" , "master" ) )
}
}
}
}