From dbbf0ca91ff97f0b8228fe6364dce82faf5f6bb2 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 10:48:15 +0800 Subject: [PATCH 1/4] style: clear code --- app/Coding/Project.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/Coding/Project.php b/app/Coding/Project.php index 42b46a6..49eebc0 100644 --- a/app/Coding/Project.php +++ b/app/Coding/Project.php @@ -2,8 +2,6 @@ namespace App\Coding; -use Exception; - class Project extends Base { public function getIssueTypes($token, $projectName) @@ -14,10 +12,10 @@ public function getIssueTypes($token, $projectName) 'Authorization' => "token ${token}", 'Content-Type' => 'application/json' ], - 'json' => array_merge([ + 'json' => [ 'Action' => 'DescribeProjectIssueTypeList', 'ProjectName' => $projectName, - ]), + ], ]); $result = json_decode($response->getBody(), true); return $result['Response']['IssueTypes']; From 58429fc330608a83b1e15d9423a156e7c225ed98 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 10:50:44 +0800 Subject: [PATCH 2/4] style: clear code --- tests/Feature/WikiImportCommandTest.php | 2 +- tests/Unit/CodingWikiTest.php | 4 ++-- ...ploadTokenResponse.json => CreateUploadTokenResponse.json} | 0 .../{createWikiResponse.json => CreateWikiResponse.json} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename tests/data/coding/{createUploadTokenResponse.json => CreateUploadTokenResponse.json} (100%) rename tests/data/coding/{createWikiResponse.json => CreateWikiResponse.json} (100%) diff --git a/tests/Feature/WikiImportCommandTest.php b/tests/Feature/WikiImportCommandTest.php index 3b01fc6..5486c5f 100755 --- a/tests/Feature/WikiImportCommandTest.php +++ b/tests/Feature/WikiImportCommandTest.php @@ -17,7 +17,7 @@ protected function setUp(): void { parent::setUp(); $this->createWikiResponse = json_decode( - file_get_contents($this->dataDir . 'coding/createWikiResponse.json'), + file_get_contents($this->dataDir . 'coding/CreateWikiResponse.json'), true )['Response']['Data']; } diff --git a/tests/Unit/CodingWikiTest.php b/tests/Unit/CodingWikiTest.php index 84bc55c..90d035c 100644 --- a/tests/Unit/CodingWikiTest.php +++ b/tests/Unit/CodingWikiTest.php @@ -39,7 +39,7 @@ protected function setUp(): void public function testCreateWiki() { - $responseBody = file_get_contents($this->dataDir . 'coding/createWikiResponse.json'); + $responseBody = file_get_contents($this->dataDir . 'coding/CreateWikiResponse.json'); $codingToken = $this->faker->md5; $codingProjectUri = $this->faker->slug; $article = [ @@ -74,7 +74,7 @@ public function testCreateWiki() public function testCreateUploadToken() { - $responseBody = file_get_contents($this->dataDir . 'coding/createUploadTokenResponse.json'); + $responseBody = file_get_contents($this->dataDir . 'coding/CreateUploadTokenResponse.json'); $codingToken = $this->faker->md5; $codingProjectUri = $this->faker->slug; $fileName = $this->faker->word; diff --git a/tests/data/coding/createUploadTokenResponse.json b/tests/data/coding/CreateUploadTokenResponse.json similarity index 100% rename from tests/data/coding/createUploadTokenResponse.json rename to tests/data/coding/CreateUploadTokenResponse.json diff --git a/tests/data/coding/createWikiResponse.json b/tests/data/coding/CreateWikiResponse.json similarity index 100% rename from tests/data/coding/createWikiResponse.json rename to tests/data/coding/CreateWikiResponse.json From 6724fbe899541acfdbc30129c2c5128e26a33d02 Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 10:51:34 +0800 Subject: [PATCH 3/4] feat: #78 create iteration --- app/Coding/Iteration.php | 23 ++++++++++ tests/Unit/CodingIterationTest.php | 45 +++++++++++++++++++ .../data/coding/CreateIterationResponse.json | 24 ++++++++++ 3 files changed, 92 insertions(+) create mode 100644 app/Coding/Iteration.php create mode 100644 tests/Unit/CodingIterationTest.php create mode 100644 tests/data/coding/CreateIterationResponse.json diff --git a/app/Coding/Iteration.php b/app/Coding/Iteration.php new file mode 100644 index 0000000..a51ca34 --- /dev/null +++ b/app/Coding/Iteration.php @@ -0,0 +1,23 @@ +client->request('POST', 'https://e.coding.net/open-api', [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => "token ${token}", + 'Content-Type' => 'application/json' + ], + 'json' => array_merge([ + 'Action' => 'CreateIteration', + 'ProjectName' => $projectName, + ], $data), + ]); + $result = json_decode($response->getBody(), true); + return $result['Response']['Iteration']; + } +} diff --git a/tests/Unit/CodingIterationTest.php b/tests/Unit/CodingIterationTest.php new file mode 100644 index 0000000..fd0786a --- /dev/null +++ b/tests/Unit/CodingIterationTest.php @@ -0,0 +1,45 @@ +dataDir . 'coding/CreateIterationResponse.json'); + $codingToken = $this->faker->md5; + $codingProjectUri = $this->faker->slug; + $data = [ + 'Name' => $this->faker->title, + ]; + + $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' => 'CreateIteration', + 'ProjectName' => $codingProjectUri, + ], $data) + ] + ) + ->willReturn(new Response(200, [], $responseBody)); + $coding = new Iteration($clientMock); + $result = $coding->create($codingToken, $codingProjectUri, $data); + $this->assertEquals(json_decode($responseBody, true)['Response']['Iteration'], $result); + } +} diff --git a/tests/data/coding/CreateIterationResponse.json b/tests/data/coding/CreateIterationResponse.json new file mode 100644 index 0000000..a73f9c8 --- /dev/null +++ b/tests/data/coding/CreateIterationResponse.json @@ -0,0 +1,24 @@ +{ + "Response" : { + "Iteration" : { + "Assignee" : 0, + "Code" : 2746, + "CompletedCount" : 0, + "CompletedPercent" : 0, + "Completer" : 0, + "CreatedAt" : 1634697259529, + "Creator" : 183478, + "Deleter" : 0, + "EndAt" : -28800000, + "Goal" : "", + "Name" : "it by cli", + "ProcessingCount" : 0, + "StartAt" : -28800000, + "Starter" : 0, + "Status" : "WAIT_PROCESS", + "UpdatedAt" : 1634697259529, + "WaitProcessCount" : 0 + }, + "RequestId" : "58777aa6-e6e4-155a-c99f-415a33615ca6" + } +} From 658460d576a19654e51e85b53fea5f4024e6d91f Mon Sep 17 00:00:00 2001 From: sinkcup Date: Wed, 20 Oct 2021 12:03:09 +0800 Subject: [PATCH 4/4] feat: #78 cli create iteration --- app/Coding/Iteration.php | 8 +++ app/Commands/IterationCreateCommand.php | 64 ++++++++++++++++++++ composer.json | 1 + composer.lock | 19 +++--- tests/Feature/IterationCreateCommandTest.php | 48 +++++++++++++++ tests/Unit/CodingIterationTest.php | 14 +++++ 6 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 app/Commands/IterationCreateCommand.php create mode 100755 tests/Feature/IterationCreateCommandTest.php diff --git a/app/Coding/Iteration.php b/app/Coding/Iteration.php index a51ca34..e315698 100644 --- a/app/Coding/Iteration.php +++ b/app/Coding/Iteration.php @@ -2,6 +2,8 @@ namespace App\Coding; +use Carbon\Carbon; + class Iteration extends Base { public function create($token, $projectName, $data) @@ -20,4 +22,10 @@ public function create($token, $projectName, $data) $result = json_decode($response->getBody(), true); return $result['Response']['Iteration']; } + + public static function generateName(Carbon $startAt, Carbon $endAt): string + { + $endFormat = $startAt->year == $endAt->year ? 'm/d' : 'Y/m/d'; + return $startAt->format('Y/m/d') . '-' . $endAt->format($endFormat) . ' 迭代'; + } } diff --git a/app/Commands/IterationCreateCommand.php b/app/Commands/IterationCreateCommand.php new file mode 100644 index 0000000..80d79ed --- /dev/null +++ b/app/Commands/IterationCreateCommand.php @@ -0,0 +1,64 @@ +setCodingApi(); + + $data = []; + $startAt = Carbon::parse($this->option('start_at') ?? $this->ask('开始时间:', Carbon::today()->toDateString())); + $data['StartAt'] = $startAt->toDateString(); + $endAt = Carbon::parse($this->option('end_at') ?? $this->ask( + '结束时间:', + Carbon::today()->addDays(14)->toDateString() + )); + $data['EndAt'] = $endAt->toDateString(); + $data['Name'] = $this->option('name') ?? $this->ask('标题:', Iteration::generateName($startAt, $endAt)); + $data['Goal'] = $this->option('goal'); + $data['Assignee'] = $this->option('assignee'); + + $result = $iteration->create($this->codingToken, $this->codingProjectUri, $data); + + $this->info('创建成功'); + $this->info("https://{$this->codingTeamDomain}.coding.net/p/{$this->codingProjectUri}" . + "/iterations/${result['Code']}/issues"); + + return 0; + } +} diff --git a/composer.json b/composer.json index 02ffd15..e886ce7 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,7 @@ "laravel-fans/confluence": "^0.1.1", "laravel-zero/framework": "^8.8", "league/html-to-markdown": "^5.0", + "nesbot/carbon": "^2.53", "sinkcup/laravel-filesystem-cos-updated": "^4.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 48a5dda..383dc9c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b78aa1fa10887f82b88b1e7290803200", + "content-hash": "dd8f6ba7fb2903f0485d7037e87d122a", "packages": [ { "name": "brick/math", @@ -2185,27 +2185,28 @@ }, { "name": "nesbot/carbon", - "version": "2.50.0", + "version": "2.53.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb" + "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f47f17d17602b2243414a44ad53d9f8b9ada5fdb", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045", + "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", @@ -2219,8 +2220,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev", - "dev-3.x": "3.x-dev" + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" }, "laravel": { "providers": [ @@ -2274,7 +2275,7 @@ "type": "tidelift" } ], - "time": "2021-06-28T22:38:45+00:00" + "time": "2021-09-06T09:29:23+00:00" }, { "name": "nunomaduro/collision", diff --git a/tests/Feature/IterationCreateCommandTest.php b/tests/Feature/IterationCreateCommandTest.php new file mode 100755 index 0000000..b7746e6 --- /dev/null +++ b/tests/Feature/IterationCreateCommandTest.php @@ -0,0 +1,48 @@ +faker->md5; + config(['coding.token' => $codingToken]); + $this->teamDomain = $this->faker->domainWord; + config(['coding.team_domain' => $this->teamDomain]); + $this->projectUri = $this->faker->slug; + config(['coding.project_uri' => $this->projectUri]); + } + + public function testCreateSuccess() + { + $mock = \Mockery::mock(Iteration::class, [])->makePartial(); + $this->instance(Iteration::class, $mock); + + $mock->shouldReceive('create')->times(1)->andReturn(json_decode( + file_get_contents($this->dataDir . 'coding/' . 'CreateIterationResponse.json'), + true + )['Response']['Iteration']); + + $startAt = $this->faker->date(); + $endAt = Carbon::parse($startAt)->addDays($this->faker->randomNumber())->toDateString(); + $this->artisan('iteration:create', [ + '--goal' => $this->faker->text(), + '--assignee' => $this->faker->randomNumber(), + ]) + ->expectsQuestion('开始时间:', $startAt) + ->expectsQuestion('结束时间:', $endAt) + ->expectsQuestion('标题:', $startAt . '~' . $endAt . ' 迭代') + ->expectsOutput('创建成功') + ->expectsOutput("https://$this->teamDomain.coding.net/p/$this->projectUri/iterations/2746/issues") + ->assertExitCode(0); + } +} diff --git a/tests/Unit/CodingIterationTest.php b/tests/Unit/CodingIterationTest.php index fd0786a..b0cdb5b 100644 --- a/tests/Unit/CodingIterationTest.php +++ b/tests/Unit/CodingIterationTest.php @@ -4,6 +4,7 @@ use App\Coding\Issue; use App\Coding\Iteration; +use Carbon\Carbon; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Response; use Tests\TestCase; @@ -42,4 +43,17 @@ public function testCreateSuccess() $result = $coding->create($codingToken, $codingProjectUri, $data); $this->assertEquals(json_decode($responseBody, true)['Response']['Iteration'], $result); } + + public function testGenerateName() + { + $startAt = Carbon::parse('2021-10-20'); + $endAt = Carbon::parse('2021-10-30'); + $result = Iteration::generateName($startAt, $endAt); + $this->assertEquals("2021/10/20-10/30 迭代", $result); + + $startAt = Carbon::parse('2021-12-27'); + $endAt = Carbon::parse('2022-01-07'); + $result = Iteration::generateName($startAt, $endAt); + $this->assertEquals("2021/12/27-2022/01/07 迭代", $result); + } }