]>
Commit | Line | Data |
---|---|---|
c70ff64a A |
1 | <?php |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
78657347 | 5 | namespace Shaarli\Front\Controller\Admin; |
c70ff64a | 6 | |
c70ff64a A |
7 | use Shaarli\Bookmark\Bookmark; |
8 | use Shaarli\Formatter\BookmarkFormatter; | |
9 | use Shaarli\Formatter\BookmarkRawFormatter; | |
c70ff64a A |
10 | use Shaarli\Netscape\NetscapeBookmarkUtils; |
11 | use Shaarli\Security\SessionManager; | |
a5a9cf23 | 12 | use Shaarli\TestCase; |
c70ff64a A |
13 | use Slim\Http\Request; |
14 | use Slim\Http\Response; | |
15 | ||
16 | class ExportControllerTest extends TestCase | |
17 | { | |
18 | use FrontAdminControllerMockHelper; | |
19 | ||
20 | /** @var ExportController */ | |
21 | protected $controller; | |
22 | ||
23 | public function setUp(): void | |
24 | { | |
25 | $this->createContainer(); | |
26 | ||
27 | $this->controller = new ExportController($this->container); | |
28 | } | |
29 | ||
30 | /** | |
31 | * Test displaying export page | |
32 | */ | |
33 | public function testIndex(): void | |
34 | { | |
35 | $assignedVariables = []; | |
36 | $this->assignTemplateVars($assignedVariables); | |
37 | ||
38 | $request = $this->createMock(Request::class); | |
39 | $response = new Response(); | |
40 | ||
41 | $result = $this->controller->index($request, $response); | |
42 | ||
43 | static::assertSame(200, $result->getStatusCode()); | |
44 | static::assertSame('export', (string) $result->getBody()); | |
45 | ||
46 | static::assertSame('Export - Shaarli', $assignedVariables['pagetitle']); | |
47 | } | |
48 | ||
49 | /** | |
50 | * Test posting an export request | |
51 | */ | |
52 | public function testExportDefault(): void | |
53 | { | |
54 | $assignedVariables = []; | |
55 | $this->assignTemplateVars($assignedVariables); | |
56 | ||
57 | $parameters = [ | |
58 | 'selection' => 'all', | |
59 | 'prepend_note_url' => 'on', | |
60 | ]; | |
61 | ||
62 | $request = $this->createMock(Request::class); | |
63 | $request->method('getParam')->willReturnCallback(function (string $key) use ($parameters) { | |
64 | return $parameters[$key] ?? null; | |
65 | }); | |
66 | $response = new Response(); | |
67 | ||
68 | $bookmarks = [ | |
69 | (new Bookmark())->setUrl('http://link1.tld')->setTitle('Title 1'), | |
70 | (new Bookmark())->setUrl('http://link2.tld')->setTitle('Title 2'), | |
71 | ]; | |
72 | ||
73 | $this->container->netscapeBookmarkUtils = $this->createMock(NetscapeBookmarkUtils::class); | |
74 | $this->container->netscapeBookmarkUtils | |
75 | ->expects(static::once()) | |
76 | ->method('filterAndFormat') | |
77 | ->willReturnCallback( | |
78 | function ( | |
79 | BookmarkFormatter $formatter, | |
80 | string $selection, | |
81 | bool $prependNoteUrl, | |
82 | string $indexUrl | |
83 | ) use ($parameters, $bookmarks): array { | |
84 | static::assertInstanceOf(BookmarkRawFormatter::class, $formatter); | |
85 | static::assertSame($parameters['selection'], $selection); | |
86 | static::assertTrue($prependNoteUrl); | |
b93cfeba | 87 | static::assertSame('http://shaarli/subfolder/', $indexUrl); |
c70ff64a A |
88 | |
89 | return $bookmarks; | |
90 | } | |
91 | ) | |
92 | ; | |
93 | ||
94 | $result = $this->controller->export($request, $response); | |
95 | ||
96 | static::assertSame(200, $result->getStatusCode()); | |
97 | static::assertSame('export.bookmarks', (string) $result->getBody()); | |
98 | static::assertSame(['text/html; charset=utf-8'], $result->getHeader('content-type')); | |
99 | static::assertRegExp( | |
100 | '/attachment; filename=bookmarks_all_[\d]{8}_[\d]{6}\.html/', | |
101 | $result->getHeader('content-disposition')[0] | |
102 | ); | |
103 | ||
104 | static::assertNotEmpty($assignedVariables['date']); | |
105 | static::assertSame(PHP_EOL, $assignedVariables['eol']); | |
106 | static::assertSame('all', $assignedVariables['selection']); | |
107 | static::assertSame($bookmarks, $assignedVariables['links']); | |
108 | } | |
109 | ||
110 | /** | |
111 | * Test posting an export request - without selection parameter | |
112 | */ | |
113 | public function testExportSelectionMissing(): void | |
114 | { | |
115 | $request = $this->createMock(Request::class); | |
116 | $response = new Response(); | |
117 | ||
c70ff64a A |
118 | $this->container->sessionManager |
119 | ->expects(static::once()) | |
120 | ->method('setSessionParameter') | |
121 | ->with(SessionManager::KEY_ERROR_MESSAGES, ['Please select an export mode.']) | |
122 | ; | |
123 | ||
124 | $result = $this->controller->export($request, $response); | |
125 | ||
126 | static::assertSame(302, $result->getStatusCode()); | |
127 | static::assertSame(['/subfolder/admin/export'], $result->getHeader('location')); | |
128 | } | |
129 | ||
130 | /** | |
131 | * Test posting an export request - without selection parameter | |
132 | */ | |
133 | public function testExportErrorEncountered(): void | |
134 | { | |
135 | $parameters = [ | |
136 | 'selection' => 'all', | |
137 | ]; | |
138 | ||
139 | $request = $this->createMock(Request::class); | |
140 | $request->method('getParam')->willReturnCallback(function (string $key) use ($parameters) { | |
141 | return $parameters[$key] ?? null; | |
142 | }); | |
143 | $response = new Response(); | |
144 | ||
145 | $this->container->netscapeBookmarkUtils = $this->createMock(NetscapeBookmarkUtils::class); | |
146 | $this->container->netscapeBookmarkUtils | |
147 | ->expects(static::once()) | |
148 | ->method('filterAndFormat') | |
149 | ->willThrowException(new \Exception($message = 'error message')); | |
150 | ; | |
151 | ||
c70ff64a A |
152 | $this->container->sessionManager |
153 | ->expects(static::once()) | |
154 | ->method('setSessionParameter') | |
155 | ->with(SessionManager::KEY_ERROR_MESSAGES, [$message]) | |
156 | ; | |
157 | ||
158 | $result = $this->controller->export($request, $response); | |
159 | ||
160 | static::assertSame(302, $result->getStatusCode()); | |
161 | static::assertSame(['/subfolder/admin/export'], $result->getHeader('location')); | |
162 | } | |
163 | } |