diff --git a/src/test/scala/gitbucket/core/service/ProtectedBranchServiceSpec.scala b/src/test/scala/gitbucket/core/service/ProtectedBranchServiceSpec.scala index aa343e4..df19add 100644 --- a/src/test/scala/gitbucket/core/service/ProtectedBranchServiceSpec.scala +++ b/src/test/scala/gitbucket/core/service/ProtectedBranchServiceSpec.scala @@ -1,14 +1,16 @@ package gitbucket.core.service +import gitbucket.core.util.GitSpecUtil._ import org.specs2.mutable.Specification -import org.eclipse.jgit.transport.ReceiveCommand +import org.eclipse.jgit.transport.{ReceivePack, ReceiveCommand} import org.eclipse.jgit.lib.ObjectId import gitbucket.core.model.CommitState import gitbucket.core.service.ProtectedBranchService.{ProtectedBranchReceiveHook, ProtectedBranchInfo} +import scalaz._, Scalaz._ class ProtectedBranchServiceSpec extends Specification with ServiceSpecBase with ProtectedBranchService with CommitStatusService { - val commitHook = new ProtectedBranchReceiveHook() + val receiveHook = new ProtectedBranchReceiveHook() val now = new java.util.Date() val sha = "0c77148632618b59b6f70004e3084002be2b8804" val sha2 = "0c77148632618b59b6f70004e3084002be2b8805" @@ -50,58 +52,70 @@ } "getBranchProtectedReason on force push from admin" in { withTestDB { implicit session => - val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE_NONFASTFORWARD) - generateNewUserWithDBRepository("user1", "repo1") - commitHook.hook("user1", "repo1", true, rc, "user1") must_== None - enableBranchProtection("user1", "repo1", "branch", false, Nil) - commitHook.hook("user1", "repo1", true, rc, "user1") must_== Some("Cannot force-push to a protected branch") + withTestRepository { git => + val rp = new ReceivePack(git.getRepository) <| { _.setAllowNonFastForwards(true) } + val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE_NONFASTFORWARD) + generateNewUserWithDBRepository("user1", "repo1") + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== None + enableBranchProtection("user1", "repo1", "branch", false, Nil) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== Some("Cannot force-push to a protected branch") + } } } "getBranchProtectedReason on force push from othre" in { withTestDB { implicit session => - val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE_NONFASTFORWARD) - generateNewUserWithDBRepository("user1", "repo1") - commitHook.hook("user1", "repo1", true, rc, "user2") must_== None - enableBranchProtection("user1", "repo1", "branch", false, Nil) - commitHook.hook("user1", "repo1", true, rc, "user2") must_== Some("Cannot force-push to a protected branch") + withTestRepository { git => + val rp = new ReceivePack(git.getRepository) <| { _.setAllowNonFastForwards(true) } + val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE_NONFASTFORWARD) + generateNewUserWithDBRepository("user1", "repo1") + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== None + enableBranchProtection("user1", "repo1", "branch", false, Nil) + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== Some("Cannot force-push to a protected branch") + } } } "getBranchProtectedReason check status on push from othre" in { withTestDB { implicit session => - val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE) - val user1 = generateNewUserWithDBRepository("user1", "repo1") - commitHook.hook("user1", "repo1", false, rc, "user2") must_== None - enableBranchProtection("user1", "repo1", "branch", false, Seq("must")) - commitHook.hook("user1", "repo1", false, rc, "user2") must_== Some("Required status check \"must\" is expected") - enableBranchProtection("user1", "repo1", "branch", false, Seq("must", "must2")) - commitHook.hook("user1", "repo1", false, rc, "user2") must_== Some("2 of 2 required status checks are expected") - createCommitStatus("user1", "repo1", sha2, "context", CommitState.SUCCESS, None, None, now, user1) - commitHook.hook("user1", "repo1", false, rc, "user2") must_== Some("2 of 2 required status checks are expected") - createCommitStatus("user1", "repo1", sha2, "must", CommitState.SUCCESS, None, None, now, user1) - commitHook.hook("user1", "repo1", false, rc, "user2") must_== Some("Required status check \"must2\" is expected") - createCommitStatus("user1", "repo1", sha2, "must2", CommitState.SUCCESS, None, None, now, user1) - commitHook.hook("user1", "repo1", false, rc, "user2") must_== None + withTestRepository { git => + val rp = new ReceivePack(git.getRepository) <| { _.setAllowNonFastForwards(false) } + val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE) + val user1 = generateNewUserWithDBRepository("user1", "repo1") + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== None + enableBranchProtection("user1", "repo1", "branch", false, Seq("must")) + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== Some("Required status check \"must\" is expected") + enableBranchProtection("user1", "repo1", "branch", false, Seq("must", "must2")) + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== Some("2 of 2 required status checks are expected") + createCommitStatus("user1", "repo1", sha2, "context", CommitState.SUCCESS, None, None, now, user1) + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== Some("2 of 2 required status checks are expected") + createCommitStatus("user1", "repo1", sha2, "must", CommitState.SUCCESS, None, None, now, user1) + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== Some("Required status check \"must2\" is expected") + createCommitStatus("user1", "repo1", sha2, "must2", CommitState.SUCCESS, None, None, now, user1) + receiveHook.preReceive("user1", "repo1", rp, rc, "user2") must_== None + } } } "getBranchProtectedReason check status on push from admin" in { withTestDB { implicit session => - val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE) - val user1 = generateNewUserWithDBRepository("user1", "repo1") - commitHook.hook("user1", "repo1", false, rc, "user1") must_== None - enableBranchProtection("user1", "repo1", "branch", false, Seq("must")) - commitHook.hook("user1", "repo1", false, rc, "user1") must_== None - enableBranchProtection("user1", "repo1", "branch", true, Seq("must")) - commitHook.hook("user1", "repo1", false, rc, "user1") must_== Some("Required status check \"must\" is expected") - enableBranchProtection("user1", "repo1", "branch", false, Seq("must", "must2")) - commitHook.hook("user1", "repo1", false, rc, "user1") must_== None - enableBranchProtection("user1", "repo1", "branch", true, Seq("must", "must2")) - commitHook.hook("user1", "repo1", false, rc, "user1") must_== Some("2 of 2 required status checks are expected") - createCommitStatus("user1", "repo1", sha2, "context", CommitState.SUCCESS, None, None, now, user1) - commitHook.hook("user1", "repo1", false, rc, "user1") must_== Some("2 of 2 required status checks are expected") - createCommitStatus("user1", "repo1", sha2, "must", CommitState.SUCCESS, None, None, now, user1) - commitHook.hook("user1", "repo1", false, rc, "user1") must_== Some("Required status check \"must2\" is expected") - createCommitStatus("user1", "repo1", sha2, "must2", CommitState.SUCCESS, None, None, now, user1) - commitHook.hook("user1", "repo1", false, rc, "user1") must_== None + withTestRepository { git => + val rp = new ReceivePack(git.getRepository) <| { _.setAllowNonFastForwards(false) } + val rc = new ReceiveCommand(ObjectId.fromString(sha), ObjectId.fromString(sha2), "refs/heads/branch", ReceiveCommand.Type.UPDATE) + val user1 = generateNewUserWithDBRepository("user1", "repo1") + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== None + enableBranchProtection("user1", "repo1", "branch", false, Seq("must")) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== None + enableBranchProtection("user1", "repo1", "branch", true, Seq("must")) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== Some("Required status check \"must\" is expected") + enableBranchProtection("user1", "repo1", "branch", false, Seq("must", "must2")) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== None + enableBranchProtection("user1", "repo1", "branch", true, Seq("must", "must2")) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== Some("2 of 2 required status checks are expected") + createCommitStatus("user1", "repo1", sha2, "context", CommitState.SUCCESS, None, None, now, user1) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== Some("2 of 2 required status checks are expected") + createCommitStatus("user1", "repo1", sha2, "must", CommitState.SUCCESS, None, None, now, user1) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== Some("Required status check \"must2\" is expected") + createCommitStatus("user1", "repo1", sha2, "must2", CommitState.SUCCESS, None, None, now, user1) + receiveHook.preReceive("user1", "repo1", rp, rc, "user1") must_== None + } } } } @@ -109,14 +123,14 @@ "administrator is owner" in { withTestDB { implicit session => generateNewUserWithDBRepository("user1", "repo1") - var x = ProtectedBranchInfo("user1", "repo1", true, Nil, false) + val x = ProtectedBranchInfo("user1", "repo1", true, Nil, false) x.isAdministrator("user1") must_== true x.isAdministrator("user2") must_== false } } "administrator is manager" in { withTestDB { implicit session => - var x = ProtectedBranchInfo("grp1", "repo1", true, Nil, false) + val x = ProtectedBranchInfo("grp1", "repo1", true, Nil, false) x.createGroup("grp1", None) generateNewAccount("user1") generateNewAccount("user2") @@ -131,7 +145,7 @@ "unSuccessedContexts" in { withTestDB { implicit session => val user1 = generateNewUserWithDBRepository("user1", "repo1") - var x = ProtectedBranchInfo("user1", "repo1", true, List("must"), false) + val x = ProtectedBranchInfo("user1", "repo1", true, List("must"), false) x.unSuccessedContexts(sha) must_== Set("must") createCommitStatus("user1", "repo1", sha, "context", CommitState.SUCCESS, None, None, now, user1) x.unSuccessedContexts(sha) must_== Set("must") @@ -148,7 +162,7 @@ "unSuccessedContexts when empty" in { withTestDB { implicit session => val user1 = generateNewUserWithDBRepository("user1", "repo1") - var x = ProtectedBranchInfo("user1", "repo1", true, Nil, false) + val x = ProtectedBranchInfo("user1", "repo1", true, Nil, false) val sha = "0c77148632618b59b6f70004e3084002be2b8804" x.unSuccessedContexts(sha) must_== Nil createCommitStatus("user1", "repo1", sha, "context", CommitState.SUCCESS, None, None, now, user1)