|
|
@ -80,6 +80,7 @@ func testGitGeneral(t *testing.T, u *url.URL) {
|
|
|
|
mediaTest(t, &httpContext, pushedFilesStandard[0], pushedFilesStandard[1], pushedFilesLFS[0], pushedFilesLFS[1])
|
|
|
|
mediaTest(t, &httpContext, pushedFilesStandard[0], pushedFilesStandard[1], pushedFilesLFS[0], pushedFilesLFS[1])
|
|
|
|
|
|
|
|
|
|
|
|
t.Run("CreateAgitFlowPull", doCreateAgitFlowPull(dstPath, &httpContext, "test/head"))
|
|
|
|
t.Run("CreateAgitFlowPull", doCreateAgitFlowPull(dstPath, &httpContext, "test/head"))
|
|
|
|
|
|
|
|
t.Run("CreateProtectedBranch", doCreateProtectedBranch(&httpContext, dstPath))
|
|
|
|
t.Run("BranchProtectMerge", doBranchProtectPRMerge(&httpContext, dstPath))
|
|
|
|
t.Run("BranchProtectMerge", doBranchProtectPRMerge(&httpContext, dstPath))
|
|
|
|
t.Run("AutoMerge", doAutoPRMerge(&httpContext, dstPath))
|
|
|
|
t.Run("AutoMerge", doAutoPRMerge(&httpContext, dstPath))
|
|
|
|
t.Run("CreatePRAndSetManuallyMerged", doCreatePRAndSetManuallyMerged(httpContext, httpContext, dstPath, "master", "test-manually-merge"))
|
|
|
|
t.Run("CreatePRAndSetManuallyMerged", doCreatePRAndSetManuallyMerged(httpContext, httpContext, dstPath, "master", "test-manually-merge"))
|
|
|
@ -121,6 +122,7 @@ func testGitGeneral(t *testing.T, u *url.URL) {
|
|
|
|
mediaTest(t, &sshContext, pushedFilesStandard[0], pushedFilesStandard[1], pushedFilesLFS[0], pushedFilesLFS[1])
|
|
|
|
mediaTest(t, &sshContext, pushedFilesStandard[0], pushedFilesStandard[1], pushedFilesLFS[0], pushedFilesLFS[1])
|
|
|
|
|
|
|
|
|
|
|
|
t.Run("CreateAgitFlowPull", doCreateAgitFlowPull(dstPath, &sshContext, "test/head2"))
|
|
|
|
t.Run("CreateAgitFlowPull", doCreateAgitFlowPull(dstPath, &sshContext, "test/head2"))
|
|
|
|
|
|
|
|
t.Run("CreateProtectedBranch", doCreateProtectedBranch(&sshContext, dstPath))
|
|
|
|
t.Run("BranchProtectMerge", doBranchProtectPRMerge(&sshContext, dstPath))
|
|
|
|
t.Run("BranchProtectMerge", doBranchProtectPRMerge(&sshContext, dstPath))
|
|
|
|
t.Run("MergeFork", func(t *testing.T) {
|
|
|
|
t.Run("MergeFork", func(t *testing.T) {
|
|
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
@ -325,6 +327,34 @@ func generateCommitWithNewData(size int, repoPath, email, fullName, prefix strin
|
|
|
|
return filepath.Base(tmpFile.Name()), err
|
|
|
|
return filepath.Base(tmpFile.Name()), err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func doCreateProtectedBranch(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
|
|
|
|
|
|
|
|
return func(t *testing.T) {
|
|
|
|
|
|
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
|
|
|
|
ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t.Run("ProtectBranchWithFilePatterns", doProtectBranch(ctx, "release-*", baseCtx.Username, "", "", "config*"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// push a new branch without any new commits
|
|
|
|
|
|
|
|
t.Run("CreateProtectedBranch-NoChanges", doGitCreateBranch(dstPath, "release-v1.0"))
|
|
|
|
|
|
|
|
t.Run("PushProtectedBranch-NoChanges", doGitPushTestRepository(dstPath, "origin", "release-v1.0"))
|
|
|
|
|
|
|
|
t.Run("CheckoutMaster-NoChanges", doGitCheckoutBranch(dstPath, "master"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// push a new branch with a new unprotected file
|
|
|
|
|
|
|
|
t.Run("CreateProtectedBranch-UnprotectedFile", doGitCreateBranch(dstPath, "release-v2.0"))
|
|
|
|
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "abc.txt")
|
|
|
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
t.Run("PushProtectedBranch-UnprotectedFile", doGitPushTestRepository(dstPath, "origin", "release-v2.0"))
|
|
|
|
|
|
|
|
t.Run("CheckoutMaster-UnprotectedFile", doGitCheckoutBranch(dstPath, "master"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// push a new branch with a new protected file
|
|
|
|
|
|
|
|
t.Run("CreateProtectedBranch-ProtectedFile", doGitCreateBranch(dstPath, "release-v3.0"))
|
|
|
|
|
|
|
|
_, err = generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "config")
|
|
|
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
t.Run("PushProtectedBranch-ProtectedFile", doGitPushTestRepositoryFail(dstPath, "origin", "release-v3.0"))
|
|
|
|
|
|
|
|
t.Run("CheckoutMaster-ProtectedFile", doGitCheckoutBranch(dstPath, "master"))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
|
|
|
|
func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
|
|
|
|
return func(t *testing.T) {
|
|
|
|
return func(t *testing.T) {
|
|
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
@ -334,27 +364,23 @@ func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *tes
|
|
|
|
ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository)
|
|
|
|
ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository)
|
|
|
|
|
|
|
|
|
|
|
|
// Protect branch without any whitelisting
|
|
|
|
// Protect branch without any whitelisting
|
|
|
|
t.Run("ProtectBranchNoWhitelist", func(t *testing.T) {
|
|
|
|
t.Run("ProtectBranchNoWhitelist", doProtectBranch(ctx, "protected", "", "", "", ""))
|
|
|
|
doProtectBranch(ctx, "protected", "", "", "")
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Try to push without permissions, which should fail
|
|
|
|
// Try to push without permissions, which should fail
|
|
|
|
t.Run("TryPushWithoutPermissions", func(t *testing.T) {
|
|
|
|
t.Run("TryPushWithoutPermissions", func(t *testing.T) {
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
doGitPushTestRepositoryFail(dstPath, "origin", "protected")
|
|
|
|
doGitPushTestRepositoryFail(dstPath, "origin", "protected")(t)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// Set up permissions for normal push but not force push
|
|
|
|
// Set up permissions for normal push but not force push
|
|
|
|
t.Run("SetupNormalPushPermissions", func(t *testing.T) {
|
|
|
|
t.Run("SetupNormalPushPermissions", doProtectBranch(ctx, "protected", baseCtx.Username, "", "", ""))
|
|
|
|
doProtectBranch(ctx, "protected", baseCtx.Username, "", "")
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Normal push should work
|
|
|
|
// Normal push should work
|
|
|
|
t.Run("NormalPushWithPermissions", func(t *testing.T) {
|
|
|
|
t.Run("NormalPushWithPermissions", func(t *testing.T) {
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
doGitPushTestRepository(dstPath, "origin", "protected")
|
|
|
|
doGitPushTestRepository(dstPath, "origin", "protected")(t)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// Try to force push without force push permissions, which should fail
|
|
|
|
// Try to force push without force push permissions, which should fail
|
|
|
@ -364,30 +390,22 @@ func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *tes
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "branch-data-file-new")
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "branch-data-file-new")
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
doGitPushTestRepositoryFail(dstPath, "-f", "origin", "protected")
|
|
|
|
doGitPushTestRepositoryFail(dstPath, "-f", "origin", "protected")(t)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// Set up permissions for force push but not normal push
|
|
|
|
// Set up permissions for force push but not normal push
|
|
|
|
t.Run("SetupForcePushPermissions", func(t *testing.T) {
|
|
|
|
t.Run("SetupForcePushPermissions", doProtectBranch(ctx, "protected", "", baseCtx.Username, "", ""))
|
|
|
|
doProtectBranch(ctx, "protected", "", baseCtx.Username, "")
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Try to force push without normal push permissions, which should fail
|
|
|
|
// Try to force push without normal push permissions, which should fail
|
|
|
|
t.Run("ForcePushWithoutNormalPermissions", func(t *testing.T) {
|
|
|
|
t.Run("ForcePushWithoutNormalPermissions", doGitPushTestRepositoryFail(dstPath, "-f", "origin", "protected"))
|
|
|
|
doGitPushTestRepositoryFail(dstPath, "-f", "origin", "protected")
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Set up permissions for normal and force push (both are required to force push)
|
|
|
|
// Set up permissions for normal and force push (both are required to force push)
|
|
|
|
t.Run("SetupNormalAndForcePushPermissions", func(t *testing.T) {
|
|
|
|
t.Run("SetupNormalAndForcePushPermissions", doProtectBranch(ctx, "protected", baseCtx.Username, baseCtx.Username, "", ""))
|
|
|
|
doProtectBranch(ctx, "protected", baseCtx.Username, baseCtx.Username, "")
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Force push should now work
|
|
|
|
// Force push should now work
|
|
|
|
t.Run("ForcePushWithPermissions", func(t *testing.T) {
|
|
|
|
t.Run("ForcePushWithPermissions", doGitPushTestRepository(dstPath, "-f", "origin", "protected"))
|
|
|
|
doGitPushTestRepository(dstPath, "-f", "origin", "protected")
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t.Run("ProtectProtectedBranchNoWhitelist", doProtectBranch(ctx, "protected", "", "", ""))
|
|
|
|
t.Run("ProtectProtectedBranchNoWhitelist", doProtectBranch(ctx, "protected", "", "", "", ""))
|
|
|
|
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected"))
|
|
|
|
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected"))
|
|
|
|
var pr api.PullRequest
|
|
|
|
var pr api.PullRequest
|
|
|
|
var err error
|
|
|
|
var err error
|
|
|
@ -409,14 +427,14 @@ func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *tes
|
|
|
|
t.Run("MergePR", doAPIMergePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index))
|
|
|
|
t.Run("MergePR", doAPIMergePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index))
|
|
|
|
t.Run("PullProtected", doGitPull(dstPath, "origin", "protected"))
|
|
|
|
t.Run("PullProtected", doGitPull(dstPath, "origin", "protected"))
|
|
|
|
|
|
|
|
|
|
|
|
t.Run("ProtectProtectedBranchUnprotectedFilePaths", doProtectBranch(ctx, "protected", "", "", "unprotected-file-*"))
|
|
|
|
t.Run("ProtectProtectedBranchUnprotectedFilePaths", doProtectBranch(ctx, "protected", "", "", "unprotected-file-*", ""))
|
|
|
|
t.Run("GenerateCommit", func(t *testing.T) {
|
|
|
|
t.Run("GenerateCommit", func(t *testing.T) {
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "unprotected-file-")
|
|
|
|
_, err := generateCommitWithNewData(testFileSizeSmall, dstPath, "user2@example.com", "User Two", "unprotected-file-")
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("PushUnprotectedFilesToProtectedBranch", doGitPushTestRepository(dstPath, "origin", "protected"))
|
|
|
|
t.Run("PushUnprotectedFilesToProtectedBranch", doGitPushTestRepository(dstPath, "origin", "protected"))
|
|
|
|
|
|
|
|
|
|
|
|
t.Run("ProtectProtectedBranchWhitelist", doProtectBranch(ctx, "protected", baseCtx.Username, "", ""))
|
|
|
|
t.Run("ProtectProtectedBranchWhitelist", doProtectBranch(ctx, "protected", baseCtx.Username, "", "", ""))
|
|
|
|
|
|
|
|
|
|
|
|
t.Run("CheckoutMaster", doGitCheckoutBranch(dstPath, "master"))
|
|
|
|
t.Run("CheckoutMaster", doGitCheckoutBranch(dstPath, "master"))
|
|
|
|
t.Run("CreateBranchForced", doGitCreateBranch(dstPath, "toforce"))
|
|
|
|
t.Run("CreateBranchForced", doGitCreateBranch(dstPath, "toforce"))
|
|
|
@ -431,7 +449,7 @@ func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *tes
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func doProtectBranch(ctx APITestContext, branch, userToWhitelistPush, userToWhitelistForcePush, unprotectedFilePatterns string) func(t *testing.T) {
|
|
|
|
func doProtectBranch(ctx APITestContext, branch, userToWhitelistPush, userToWhitelistForcePush, unprotectedFilePatterns, protectedFilePatterns string) func(t *testing.T) {
|
|
|
|
// We are going to just use the owner to set the protection.
|
|
|
|
// We are going to just use the owner to set the protection.
|
|
|
|
return func(t *testing.T) {
|
|
|
|
return func(t *testing.T) {
|
|
|
|
csrf := GetUserCSRFToken(t, ctx.Session)
|
|
|
|
csrf := GetUserCSRFToken(t, ctx.Session)
|
|
|
@ -440,6 +458,7 @@ func doProtectBranch(ctx APITestContext, branch, userToWhitelistPush, userToWhit
|
|
|
|
"_csrf": csrf,
|
|
|
|
"_csrf": csrf,
|
|
|
|
"rule_name": branch,
|
|
|
|
"rule_name": branch,
|
|
|
|
"unprotected_file_patterns": unprotectedFilePatterns,
|
|
|
|
"unprotected_file_patterns": unprotectedFilePatterns,
|
|
|
|
|
|
|
|
"protected_file_patterns": protectedFilePatterns,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if userToWhitelistPush != "" {
|
|
|
|
if userToWhitelistPush != "" {
|
|
|
|