diff --git a/lib/Client/GitlabClient.php b/lib/Client/GitlabClient.php index 734deba..4c58e46 100644 --- a/lib/Client/GitlabClient.php +++ b/lib/Client/GitlabClient.php @@ -10,6 +10,10 @@ namespace Gitlab\Client; +use Gitlab\Entity\Comment; +use Gitlab\Entity\CommentCollection; +use Gitlab\Entity\MergeRequest; + interface GitlabClient { /** @@ -25,4 +29,52 @@ interface GitlabClient * @return \Gitlab\Entity\MergeRequest[] */ public function listMergeRequests($projectId, $state = null, $orderBy = null, $sort = null, $page = null, $perPage = null); + + /** + * Shows information about the merge request including its files and changes. + * @param string $projectId + * @param string $mergeRequestId + * @return MergeRequest + */ + public function getMergeRequest($projectId, $mergeRequestId); + + /** + * Creates a new merge request. + * @param MergeRequest $mergeRequest + * @return MergeRequest + */ + public function createMergeRequest(MergeRequest $mergeRequest); + + /** + * Updates an existing merge request. You can change branches, title, or even close the MR. + * @param MergeRequest $mergeRequest + * @return MergeRequest + */ + public function updateMergeRequest(MergeRequest $mergeRequest); + + /** + * Merge changes submitted with MR using this API. + * @param string $projectId + * @param int $mergeRequestId + * @param string|null $commitMessage Custom merge commit message + * @return MergeRequest + */ + public function acceptMergeRequest($projectId, $mergeRequestId, $commitMessage = null); + + /** + * Adds a comment to a merge request. + * @param string $projectId + * @param int $mergeRequestId + * @param string $note Text of the comment + * @return Comment + */ + public function createMergeRequestComment($projectId, $mergeRequestId, $note); + + /** + * Gets all the comments associated with a merge request. + * @param string $projectId + * @param int $mergeRequestId + * @return CommentCollection + */ + public function getMergeRequestComments($projectId, $mergeRequestId); } diff --git a/lib/Client/GitlabGuzzleClient.php b/lib/Client/GitlabGuzzleClient.php index 16eb8ce..5158a61 100644 --- a/lib/Client/GitlabGuzzleClient.php +++ b/lib/Client/GitlabGuzzleClient.php @@ -32,7 +32,7 @@ * @see GitlabGuzzleClient::acceptMergeRequest * @method array getMergeRequestChanges($parameters) * @method MergeRequest createMergeRequestComment($parameters) - * @method CommentCollection listMergeRequestComments($parameters) + * @method CommentCollection getMergeRequestComments($parameters) * * Commits API * @see https://github.com/gitlabhq/gitlabhq/blob/v7.7.0/doc/api/commits.md @@ -154,9 +154,9 @@ public function listMergeRequests(array $parameters) * @param array $parameters * @return MergeRequest */ - public function createMergeRequest(array $parameters) + public function getMergeRequest(array $parameters) { - $command = $this->getCommand('createMergeRequest', $parameters); + $command = $this->getCommand('getMergeRequest', $parameters); /** @var MergeRequest $mergeRequest */ $mergeRequest = $this->execute($command); @@ -169,9 +169,9 @@ public function createMergeRequest(array $parameters) * @param array $parameters * @return MergeRequest */ - public function getMergeRequest(array $parameters) + public function createMergeRequest(array $parameters) { - $command = $this->getCommand('getMergeRequest', $parameters); + $command = $this->getCommand('createMergeRequest', $parameters); /** @var MergeRequest $mergeRequest */ $mergeRequest = $this->execute($command); diff --git a/lib/Client/HttpGitlabClient.php b/lib/Client/HttpGitlabClient.php index 23a4d0d..64572d7 100644 --- a/lib/Client/HttpGitlabClient.php +++ b/lib/Client/HttpGitlabClient.php @@ -10,6 +10,8 @@ namespace Gitlab\Client; +use Gitlab\Entity\MergeRequest; + class HttpGitlabClient implements GitlabClient { private $client; @@ -30,4 +32,63 @@ public function listMergeRequests($projectId, $state = null, $orderBy = null, $s 'per_page' => $perPage, ])); } + + public function getMergeRequest($projectId, $mergeRequestId) + { + return $this->client->getMergeRequest(array_filter([ + 'project_id' => $projectId, + 'merge_request_id' => $mergeRequestId, + ])); + } + + public function createMergeRequest(MergeRequest $mergeRequest) + { + return $this->client->createMergeRequest(array_filter([ + 'project_id' => $mergeRequest->project, + 'source_branch' => $mergeRequest->sourceBranch, + 'target_branch' => $mergeRequest->targetBranch, + 'title' => $mergeRequest->title, + 'description' => $mergeRequest->description, + 'assignee_id' => isset($mergeRequest->assignee) ? $mergeRequest->assignee->id : null, + ])); + } + + public function updateMergeRequest(MergeRequest $mergeRequest) + { + return $this->client->updateMergeRequest(array_filter([ + 'project_id' => $mergeRequest->project, + 'merge_request_id' => $mergeRequest->id, + 'source_branch' => $mergeRequest->sourceBranch, + 'target_branch' => $mergeRequest->targetBranch, + 'title' => $mergeRequest->title, + 'description' => $mergeRequest->description, + 'assignee_id' => isset($mergeRequest->assignee) ? $mergeRequest->assignee->id : null, + ])); + } + + public function acceptMergeRequest($projectId, $mergeRequestId, $commitMessage = null) + { + return $this->client->acceptMergeRequest(array_filter([ + 'project_id' => $projectId, + 'merge_request_id' => $mergeRequestId, + 'merge_commit_message' => $commitMessage, + ])); + } + + public function createMergeRequestComment($projectId, $mergeRequestId, $note) + { + return $this->client->createMergeRequestComment(array_filter([ + 'project_id' => $projectId, + 'merge_request_id' => $mergeRequestId, + 'note' => $note, + ])); + } + + public function getMergeRequestComments($projectId, $mergeRequestId) + { + return $this->client->getMergeRequestComments(array_filter([ + 'project_id' => $projectId, + 'merge_request_id' => $mergeRequestId, + ])); + } } diff --git a/lib/Client/MockGitlabClient.php b/lib/Client/MockGitlabClient.php index c86c431..29194c5 100644 --- a/lib/Client/MockGitlabClient.php +++ b/lib/Client/MockGitlabClient.php @@ -10,10 +10,52 @@ namespace Gitlab\Client; +use Gitlab\Entity\Comment; +use Gitlab\Entity\CommentCollection; +use Gitlab\Entity\MergeRequest; + class MockGitlabClient implements GitlabClient { public function listMergeRequests($projectId, $state = null, $orderBy = null, $sort = null, $page = null, $perPage = null) { return []; } + + public function getMergeRequest($projectId, $mergeRequestId) + { + return $this->createMockMergeRequest($projectId, $mergeRequestId); + } + + public function createMergeRequest(MergeRequest $mergeRequest) + { + return $mergeRequest; + } + + public function updateMergeRequest(MergeRequest $mergeRequest) + { + return $mergeRequest; + } + + public function acceptMergeRequest($projectId, $mergeRequestId, $commitMessage = null) + { + return $this->createMockMergeRequest($projectId, $mergeRequestId); + } + + public function createMergeRequestComment($projectId, $mergeRequestId, $note) + { + return new Comment($note); + } + + public function getMergeRequestComments($projectId, $mergeRequestId) + { + return new CommentCollection(); + } + + private function createMockMergeRequest($projectId, $mergeRequestId) + { + $mergeRequest = new MergeRequest($projectId, "Mock merge request #$mergeRequestId"); + $mergeRequest->id = $mergeRequestId; + + return $mergeRequest; + } } diff --git a/lib/Client/ServiceDescription/merge_requests_api.yml b/lib/Client/ServiceDescription/merge_requests_api.yml index 43730e6..c6b1bb2 100644 --- a/lib/Client/ServiceDescription/merge_requests_api.yml +++ b/lib/Client/ServiceDescription/merge_requests_api.yml @@ -207,7 +207,7 @@ operations: type: string location: postField - listMergeRequestComments: + getMergeRequestComments: extends: paginatedOperation summary: Adds a comment to a merge request. responseClass: Gitlab\Entity\CommentCollection diff --git a/lib/Entity/MergeRequest.php b/lib/Entity/MergeRequest.php index c818f6a..bd6d5c1 100644 --- a/lib/Entity/MergeRequest.php +++ b/lib/Entity/MergeRequest.php @@ -81,6 +81,19 @@ public static function fromArray(array $data) return $mergeRequest; } + /** + * MergeRequest constructor. + * @param string $project + * @param string $title + * @param int|null $id + */ + public function __construct($project = '', $title = '', $id = null) + { + $this->project = $project; + $this->title = $title; + $this->id = $id; + } + public function __toString() { return sprintf('Merge request: %s (%s)', $this->title, $this->getCrossProjectReference()); diff --git a/tests/Client/HttpGitlabClientTest.php b/tests/Client/HttpGitlabClientTest.php index 436918e..d9b078f 100644 --- a/tests/Client/HttpGitlabClientTest.php +++ b/tests/Client/HttpGitlabClientTest.php @@ -10,9 +10,13 @@ namespace Client; +use Gitlab\Client\GitlabClient; use Gitlab\Client\GitlabGuzzleClient; use Gitlab\Client\HttpGitlabClient; +use Gitlab\Entity\Comment; +use Gitlab\Entity\CommentCollection; use Gitlab\Entity\MergeRequest; +use Gitlab\Entity\User; use Mockery; use Mockery\MockInterface; use PHPUnit_Framework_TestCase; @@ -22,7 +26,7 @@ class HttpGitlabClientTest extends PHPUnit_Framework_TestCase /** @var GitlabGuzzleClient|MockInterface */ private $guzzle; - /** @var HttpGitlabClient */ + /** @var GitlabClient */ private $client; protected function setUp() @@ -34,9 +38,9 @@ protected function setUp() public function testListMergeRequests() { $expectedResult = [ - new MergeRequest('fgrosse/example', 42, 'MR No. 42'), - new MergeRequest('fgrosse/example', 43, "cthulhu r'lyeh fhtagn"), - new MergeRequest('fgrosse/example', 44, 'Hello Gitlab World'), + new MergeRequest('fgrosse/example', 'MR No. 42'), + new MergeRequest('fgrosse/example', "cthulhu r'lyeh fhtagn"), + new MergeRequest('fgrosse/example', 'Hello Gitlab World'), ]; $this->guzzle->shouldReceive('listMergeRequests')->once()->with(Mockery::on(function ($params) { @@ -54,4 +58,129 @@ public function testListMergeRequests() $actualResult = $this->client->listMergeRequests('fgrosse/example', 'opened', 'created_at', 'desc', 42, 3); $this->assertEquals($expectedResult, $actualResult); } + + public function testGetMergeRequest() + { + $expectedResult = new MergeRequest('fgrosse/example', 'MR No. 42', 42); + + $this->guzzle->shouldReceive('getMergeRequest')->once()->with(Mockery::on(function ($params) { + $this->assertEquals([ + 'project_id' => 'fgrosse/example', + 'merge_request_id' => 42, + ], $params); + return true; + }))->andReturn($expectedResult); + + $actualResult = $this->client->getMergeRequest('fgrosse/example', 42); + $this->assertEquals($expectedResult, $actualResult); + } + + public function testCreateMergeRequest() + { + $assignee = new User(); + $assignee->id = 1; + $mergeRequest = new MergeRequest('fgrosse/example', 'MR No. 42'); + $mergeRequest->sourceBranch = 'develop'; + $mergeRequest->targetBranch = 'master'; + $mergeRequest->assignee = $assignee; + $mergeRequest->description = 'My description'; + $expectedResult = clone $mergeRequest; + $expectedResult->id = 42; + + $this->guzzle->shouldReceive('createMergeRequest')->once()->with(Mockery::on(function ($params) { + $this->assertEquals([ + 'project_id' => 'fgrosse/example', + 'source_branch' => 'develop', + 'target_branch' => 'master', + 'title' => 'MR No. 42', + 'assignee_id' => 1, + 'description' => 'My description', + ], $params); + return true; + }))->andReturn($expectedResult); + + $actualResult = $this->client->createMergeRequest($mergeRequest); + $this->assertEquals($expectedResult, $actualResult); + } + + public function testUpdateMergeRequest() + { + $assignee = new User(); + $assignee->id = 1; + $mergeRequest = new MergeRequest('fgrosse/example', 'MR No. 42', 42); + $mergeRequest->sourceBranch = 'develop'; + $mergeRequest->targetBranch = 'master'; + $mergeRequest->assignee = $assignee; + $mergeRequest->description = 'My description'; + $expectedResult = clone $mergeRequest; + + $this->guzzle->shouldReceive('updateMergeRequest')->once()->with(Mockery::on(function ($params) { + $this->assertEquals([ + 'project_id' => 'fgrosse/example', + 'merge_request_id' => 42, + 'source_branch' => 'develop', + 'target_branch' => 'master', + 'title' => 'MR No. 42', + 'assignee_id' => 1, + 'description' => 'My description', + ], $params); + return true; + }))->andReturn($expectedResult); + + $actualResult = $this->client->updateMergeRequest($mergeRequest); + $this->assertEquals($expectedResult, $actualResult); + } + + public function testAcceptMergeRequest() + { + $expectedResult = new MergeRequest('fgrosse/example', 'MR No. 42', 42); + $expectedResult->sourceBranch = 'develop'; + $expectedResult->targetBranch = 'master'; + $expectedResult->description = 'My description'; + + $this->guzzle->shouldReceive('acceptMergeRequest')->once()->with(Mockery::on(function ($params) { + $this->assertEquals([ + 'project_id' => 'fgrosse/example', + 'merge_request_id' => 42, + 'merge_commit_message' => 'Okey dokey', + ], $params); + return true; + }))->andReturn($expectedResult); + + $actualResult = $this->client->acceptMergeRequest('fgrosse/example', 42, 'Okey dokey'); + $this->assertEquals($expectedResult, $actualResult); + } + + public function testCreateMergeRequestComment() + { + $expectedResult = new Comment('Nice work joe!'); + $this->guzzle->shouldReceive('createMergeRequestComment')->once()->with(Mockery::on(function ($params) { + $this->assertEquals([ + 'project_id' => 'fgrosse/example', + 'merge_request_id' => 42, + 'note' => 'Nice work joe!', + ], $params); + return true; + }))->andReturn($expectedResult); + + $actualResult = $this->client->createMergeRequestComment('fgrosse/example', 42, 'Nice work joe!'); + $this->assertEquals($expectedResult, $actualResult); + } + + public function testGetMergeRequestComments() + { + $expectedResult = new CommentCollection(); + $expectedResult[] = new Comment('Foo'); + $expectedResult[] = new Comment('Bar'); + $this->guzzle->shouldReceive('getMergeRequestComments')->once()->with(Mockery::on(function ($params) { + $this->assertEquals([ + 'project_id' => 'fgrosse/example', + 'merge_request_id' => 42, + ], $params); + return true; + }))->andReturn($expectedResult); + + $actualResult = $this->client->getMergeRequestComments('fgrosse/example', 42); + $this->assertEquals($expectedResult, $actualResult); + } } diff --git a/tests/Client/MergeRequestsAPITest.php b/tests/Client/MergeRequestsAPITest.php index 9407db5..fbdbb4d 100644 --- a/tests/Client/MergeRequestsAPITest.php +++ b/tests/Client/MergeRequestsAPITest.php @@ -179,12 +179,12 @@ public function testCreateMergeRequestComment() $this->assertInstanceOf(Comment::class, $comment); } - public function testListMergeRequestComments() + public function testGetMergeRequestComments() { $this->setMockResponse(__DIR__.'/fixtures/merge_requests/list_merge_request_comments.http'); $projectId = 'fgrosse/example-project'; $mergeRequestId = 42; - $comments = $this->client->listMergeRequestComments([ + $comments = $this->client->getMergeRequestComments([ 'project_id' => $projectId, 'merge_request_id' => $mergeRequestId, 'page' => 3,