Skip to content

Commit 6c01bd8

Browse files
committed
feat: #13 command wiki from html
1 parent 9927edb commit 6c01bd8

File tree

3 files changed

+47
-32
lines changed

3 files changed

+47
-32
lines changed

app/Commands/WikiImportCommand.php

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\Coding;
66
use Confluence\Content;
7+
use Illuminate\Support\Facades\Storage;
78
use Illuminate\Support\Str;
89
use LaravelFans\Confluence\Facades\Confluence;
910
use LaravelZero\Framework\Commands\Command;
@@ -185,20 +186,28 @@ private function handleConfluenceHtml(): int
185186
}
186187

187188
$this->info("开始导入 CODING:");
188-
$pages = [];
189+
$pageTitles = [];
189190
foreach ($firstLevelLiElements as $firstLevelLiElement) {
190191
$aElement = $xpath->query('a', $firstLevelLiElement)->item(0);
191-
$pages[] = $aElement->getAttribute('href');
192+
$pageTitles[$aElement->getAttribute('href')] = $aElement->nodeValue;
192193
}
193-
foreach ($pages as $page) {
194-
$data = $this->confluence->parsePageHtml($dataPath . $page, $space['name']);
195-
$this->info("标题:${data['title']}");
196-
197-
$this->createWiki([
198-
'Title' => $data['title'],
199-
'Content' => $data['content'],
194+
foreach ($pageTitles as $page => $title) {
195+
$this->info('标题:' . $title);
196+
$markdown = $this->confluence->htmlFile2Markdown($dataPath . $page);
197+
$mdFilename = substr($page, 0, -5) . '.md';
198+
$zipFileFullPath = $this->coding->createMarkdownZip($markdown, $dataPath, $mdFilename);
199+
$zipFilename = basename($zipFileFullPath);
200+
$uploadToken = $this->coding->createUploadToken(
201+
$this->codingToken,
202+
$this->codingProjectUri,
203+
$zipFilename
204+
);
205+
$this->coding->upload($uploadToken, $zipFileFullPath);
206+
$result = $this->coding->createWikiByZip($this->codingToken, $this->codingProjectUri, $uploadToken, [
200207
'ParentIid' => 0,
208+
'FileName' => $zipFilename,
201209
]);
210+
$this->info('上传成功,正在处理,任务 ID:' . $result['JobId']);
202211
}
203212
} catch (\ErrorException $e) {
204213
$this->error($e->getMessage());

tests/Feature/WikiImportCommandTest.php

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,22 @@
55
use App\Coding;
66
use Confluence\Content;
77
use LaravelFans\Confluence\Facades\Confluence;
8+
use Mockery\Mock;
89
use Mockery\MockInterface;
910
use Tests\TestCase;
11+
use Tests\Unit\CodingTest;
1012

1113
class WikiImportCommandTest extends TestCase
1214
{
13-
private array $codingResponse;
15+
private array $codingCreateWikiResponse;
1416

1517
protected function setUp(): void
1618
{
1719
parent::setUp();
18-
$this->codingResponse = json_decode(file_get_contents($this->dataDir . 'coding/createWikiResponse.json'), true)
19-
['Response']['Data'];
20+
$this->codingCreateWikiResponse = json_decode(
21+
file_get_contents($this->dataDir . 'coding/createWikiResponse.json'),
22+
true
23+
)['Response']['Data'];
2024
}
2125

2226
public function testHandleIndex()
@@ -91,7 +95,7 @@ public function testHandleShow()
9195
});
9296
Confluence::setResource($mock);
9397

94-
$codingResponse = $this->codingResponse;
98+
$codingResponse = $this->codingCreateWikiResponse;
9599
$this->mock(Coding::class, function (MockInterface $mock) use (
96100
$codingToken,
97101
$codingProjectUri,
@@ -142,7 +146,7 @@ public function testHandleConfluenceHtmlFileNotExist()
142146
->assertExitCode(1);
143147
}
144148

145-
public function testHandleConfluenceHtml()
149+
public function testHandleConfluenceHtmlSuccess()
146150
{
147151
$codingToken = $this->faker->md5;
148152
config(['coding.token' => $codingToken]);
@@ -151,29 +155,31 @@ public function testHandleConfluenceHtml()
151155
$codingProjectUri = $this->faker->slug;
152156
config(['coding.project_uri' => $codingProjectUri]);
153157

154-
$path = $this->dataDir . 'confluence/space1/';
158+
$codingPath = $this->dataDir . 'coding/';
159+
// 注意:不能使用 partialMock
160+
// https://laracasts.com/discuss/channels/testing/this-partialmock-doesnt-call-the-constructor
161+
$mock = \Mockery::mock(Coding::class, [])->makePartial();
162+
$this->instance(Coding::class, $mock);
155163

156-
$codingResponse = $this->codingResponse;
157-
$this->mock(Coding::class, function (MockInterface $mock) use (
158-
$codingToken,
159-
$codingProjectUri,
160-
$codingResponse
161-
) {
162-
$mock->shouldReceive('createWiki')->times(2)->andReturn($codingResponse);
163-
});
164+
$mock->shouldReceive('createUploadToken')->times(2)->andReturn(CodingTest::$uploadToken);
165+
$mock->shouldReceive('upload')->times(2)->andReturn(true);
166+
$mock->shouldReceive('createWikiByZip')->times(2)->andReturn(json_decode(
167+
file_get_contents($codingPath . 'CreateWikiByZipResponse.json'),
168+
true
169+
)['Response']);
164170

165171
$this->artisan('wiki:import')
166172
->expectsQuestion('数据来源?', 'Confluence')
167173
->expectsQuestion('数据类型?', 'HTML')
168-
->expectsQuestion('路径:', $path)
174+
->expectsQuestion('路径:', $this->dataDir . 'confluence/space1/')
169175
->expectsOutput('空间名称:空间 1')
170176
->expectsOutput('空间标识:space1')
171177
->expectsOutput('发现 2 个一级页面')
172178
->expectsOutput("开始导入 CODING:")
173179
->expectsOutput('标题:Image Demo')
174-
->expectsOutput("https://${codingTeamDomain}.coding.net/p/$codingProjectUri/wiki/27")
180+
->expectsOutput('上传成功,正在处理,任务 ID:a12353fa-f45b-4af2-83db-666bf9f66615')
175181
->expectsOutput('标题:你好世界')
176-
->expectsOutput("https://${codingTeamDomain}.coding.net/p/$codingProjectUri/wiki/27")
182+
->expectsOutput('上传成功,正在处理,任务 ID:a12353fa-f45b-4af2-83db-666bf9f66615')
177183
->assertExitCode(0);
178184
}
179185
}

tests/Unit/CodingTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
class CodingTest extends TestCase
1212
{
13-
private array $uploadToken = [
13+
public static array $uploadToken = [
1414
'AuthToken' => '65e5968b5e17d5aaa3f5d33200aca2d1911fe2ad2948b47d899d46e6da1e4',
1515
'Provide' => 'TENCENT',
1616
'SecretId' => 'AKIDU-VqQm39vRar-ZrHj1UIE5u2gYJ7gWFcG2ThwFNO9eU1HbyQlZp8vVcQ99',
@@ -87,7 +87,7 @@ public function testCreateUploadToken()
8787
->willReturn(new Response(200, [], $responseBody));
8888
$coding = new Coding($clientMock);
8989
$result = $coding->createUploadToken($codingToken, $codingProjectUri, $fileName);
90-
$this->assertEquals($this->uploadToken, $result);
90+
$this->assertEquals(self::$uploadToken, $result);
9191
}
9292

9393
public function testCreateMarkdownZip()
@@ -113,7 +113,7 @@ public function testUpload()
113113
Storage::fake('cos');
114114

115115
$coding = new Coding();
116-
$coding->upload($this->uploadToken, $file);
116+
$coding->upload(self::$uploadToken, $file);
117117

118118
Storage::disk('cos')->assertExists(basename($file));
119119
}
@@ -178,14 +178,14 @@ public function testCreateWikiByZip()
178178
'ParentIid' => $data['ParentIid'],
179179
'FileName' => $data['FileName'],
180180
'Key' => $data['FileName'],
181-
'Time' => $this->uploadToken['Time'],
182-
'AuthToken' => $this->uploadToken['AuthToken'],
181+
'Time' => self::$uploadToken['Time'],
182+
'AuthToken' => self::$uploadToken['AuthToken'],
183183
],
184184
]
185185
)
186186
->willReturn(new Response(200, [], $responseBody));
187187
$coding = new Coding($clientMock);
188-
$result = $coding->createWikiByZip($codingToken, $codingProjectUri, $this->uploadToken, $data);
188+
$result = $coding->createWikiByZip($codingToken, $codingProjectUri, self::$uploadToken, $data);
189189
$this->assertArrayHasKey('JobId', $result);
190190
}
191191
}

0 commit comments

Comments
 (0)