From 77d1547c6955ce36b1bfeecbab74ad1faa011c96 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Tue, 19 Oct 2021 17:20:45 +0800 Subject: [PATCH 1/2] feat: #75 get project issue types --- app/Coding/Project.php | 25 +++++++++ tests/Unit/CodingProjectTest.php | 41 +++++++++++++++ .../DescribeProjectIssueTypeListResponse.json | 52 +++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 app/Coding/Project.php create mode 100644 tests/Unit/CodingProjectTest.php create mode 100644 tests/data/coding/DescribeProjectIssueTypeListResponse.json diff --git a/app/Coding/Project.php b/app/Coding/Project.php new file mode 100644 index 0000000..42b46a6 --- /dev/null +++ b/app/Coding/Project.php @@ -0,0 +1,25 @@ +client->request('POST', 'https://e.coding.net/open-api', [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${token}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'DescribeProjectIssueTypeList', + 'ProjectName' => $projectName, + ]), + ]); + $result = json_decode($response->getBody(), true); + return $result['Response']['IssueTypes']; + } +} diff --git a/tests/Unit/CodingProjectTest.php b/tests/Unit/CodingProjectTest.php new file mode 100644 index 0000000..5052483 --- /dev/null +++ b/tests/Unit/CodingProjectTest.php @@ -0,0 +1,41 @@ +dataDir . 'coding/DescribeProjectIssueTypeListResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + + $clientMock = $this->getMockBuilder(Client::class)->getMock(); + $clientMock->expects($this->once()) + ->method('request') + ->with( + 'POST', + 'https://e.coding.net/open-api', + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${codingToken}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'DescribeProjectIssueTypeList', + 'ProjectName' => $codingProjectUri, + ]) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new Project($clientMock); + $result = $coding->getIssueTypes($codingToken, $codingProjectUri); + $this->assertEquals(json_decode($responseBody, true)['Response']['IssueTypes'], $result); + } +} diff --git a/tests/data/coding/DescribeProjectIssueTypeListResponse.json b/tests/data/coding/DescribeProjectIssueTypeListResponse.json new file mode 100644 index 0000000..d18c46c --- /dev/null +++ b/tests/data/coding/DescribeProjectIssueTypeListResponse.json @@ -0,0 +1,52 @@ +{ + "Response" : { + "IssueTypes" : [ + { + "Description" : "史诗是一个较大的功能或特性,可以分解为多个较小的需求或任务。通常其需要分多次迭代才可完成。", + "Id" : 213217, + "IsSystem" : true, + "IssueType" : "EPIC", + "Name" : "史诗", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + }, + { + "Description" : "用户故事是敏捷框架中最小的工作单元,是从用户角度描述软件如何为其带来特定的价值。", + "Id" : 213218, + "IsSystem" : true, + "IssueType" : "REQUIREMENT", + "Name" : "用户故事", + "SplitTargetIssueTypeId" : [], + "SplitType" : "ALL_REQUIREMENT" + }, + { + "Description" : "任务是指为实现某个目标或需求所进行的具体活动。", + "Id" : 213220, + "IsSystem" : true, + "IssueType" : "MISSION", + "Name" : "任务", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + }, + { + "Description" : "缺陷是指软件不符合最初定义的业务需求的现象,缺陷管理用于跟踪这些问题和错误。", + "Id" : 213221, + "IsSystem" : true, + "IssueType" : "DEFECT", + "Name" : "缺陷", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + }, + { + "Description" : "在敏捷模式下,将一个事项拆分成更小的块。", + "Id" : 213222, + "IsSystem" : true, + "IssueType" : "SUB_TASK", + "Name" : "子工作项", + "SplitTargetIssueTypeId" : [], + "SplitType" : "UNSPLITTABLE" + } + ], + "RequestId" : "9f7e8405-943d-fb02-96bf-3ee3c63e0fe6" + } +} From 9e4652c09bd79313e9725e370a64b92d36e43408 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Tue, 19 Oct 2021 17:21:51 +0800 Subject: [PATCH 2/2] feat: #75 cli get project issue types --- app/Commands/ProjectGetIssueTypesCommand.php | 47 +++++++++++++++++++ .../ProjectGetIssueTypesCommandTest.php | 39 +++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 app/Commands/ProjectGetIssueTypesCommand.php create mode 100755 tests/Feature/ProjectGetIssueTypesCommandTest.php diff --git a/app/Commands/ProjectGetIssueTypesCommand.php b/app/Commands/ProjectGetIssueTypesCommand.php new file mode 100644 index 0000000..011b3e8 --- /dev/null +++ b/app/Commands/ProjectGetIssueTypesCommand.php @@ -0,0 +1,47 @@ +setCodingApi(); + + $result = $codingProject->getIssueTypes($this->codingToken, $this->codingProjectUri); + + foreach ($result as $item) { + $this->info($item['Id'] . ' ' . $item['Name']); + } + + return 0; + } +} diff --git a/tests/Feature/ProjectGetIssueTypesCommandTest.php b/tests/Feature/ProjectGetIssueTypesCommandTest.php new file mode 100755 index 0000000..1e8b18f --- /dev/null +++ b/tests/Feature/ProjectGetIssueTypesCommandTest.php @@ -0,0 +1,39 @@ +faker->md5; + config(['coding.token' => $codingToken]); + $codingTeamDomain = $this->faker->domainWord; + config(['coding.team_domain' => $codingTeamDomain]); + $codingProjectUri = $this->faker->slug; + config(['coding.project_uri' => $codingProjectUri]); + } + + public function testCreateSuccess() + { + $mock = \Mockery::mock(Project::class, [])->makePartial(); + $this->instance(Project::class, $mock); + + $mock->shouldReceive('getIssueTypes')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'DescribeProjectIssueTypeListResponse.json'), + true + )['Response']['IssueTypes']); + + $this->artisan('project:get-issue-types') + ->expectsOutput('213217 史诗') + ->expectsOutput('213218 用户故事') + ->expectsOutput('213220 任务') + ->expectsOutput('213221 缺陷') + ->expectsOutput('213222 子工作项') + ->assertExitCode(0); + } +}