Skip to content

Commit 5c19d99

Browse files
committed
test: added more tests to improve code coverage
1 parent 193e5e7 commit 5c19d99

5 files changed

Lines changed: 405 additions & 29 deletions

File tree

tests/phpMyFAQ/Controller/Administration/Api/MediaBrowserControllerTest.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use phpMyFAQ\Enums\PermissionType;
1212
use phpMyFAQ\Language;
1313
use phpMyFAQ\Permission\PermissionInterface;
14+
use phpMyFAQ\Session\Token;
1415
use phpMyFAQ\Strings;
1516
use phpMyFAQ\Translation;
1617
use phpMyFAQ\User\CurrentUser;
@@ -163,12 +164,32 @@ public function testIndexRemovesFileWhenFileRemoveActionIsRequested(): void
163164
$this->createdMediaFile = PMF_CONTENT_DIR . '/user/images/' . $fileName;
164165
file_put_contents($this->createdMediaFile, 'fake-image');
165166

167+
$session = new Session(new MockArraySessionStorage());
168+
169+
// Set up a valid CSRF token in the session
170+
Token::resetInstanceForTests();
171+
$csrfToken = md5(base64_encode(random_bytes(32)));
172+
$tokenObj = Token::getInstance($session);
173+
$tokenPage = 'media-browser';
174+
$sessionKey = sprintf('%s.%s', Token::PMF_SESSION_NAME, $tokenPage);
175+
176+
// Use reflection to create a Token object for session storage
177+
$tokenReflection = new \ReflectionClass(Token::class);
178+
$storedToken = $tokenReflection->newInstanceWithoutConstructor();
179+
$storedToken->setPage($tokenPage);
180+
$storedToken->setExpiry(time() + 3600);
181+
$storedToken->setSessionToken($csrfToken);
182+
$storedToken->setCookieToken('');
183+
184+
$session->set($sessionKey, $storedToken);
185+
166186
$controller = new MediaBrowserController();
167-
$controller->setContainer($this->createAuthenticatedContainer());
187+
$controller->setContainer($this->createAuthenticatedContainer($session));
168188

169189
$request = new Request([], [], [], [], [], [], json_encode([
170190
'action' => 'fileRemove',
171191
'name' => $fileName,
192+
'csrfToken' => $csrfToken,
172193
], JSON_THROW_ON_ERROR));
173194

174195
$response = $controller->index($request);
@@ -180,7 +201,7 @@ public function testIndexRemovesFileWhenFileRemoveActionIsRequested(): void
180201
$this->createdMediaFile = '';
181202
}
182203

183-
private function createAuthenticatedContainer(): ContainerInterface
204+
private function createAuthenticatedContainer(?Session $session = null): ContainerInterface
184205
{
185206
$permission = $this->createMock(PermissionInterface::class);
186207
$permission
@@ -197,7 +218,7 @@ private function createAuthenticatedContainer(): ContainerInterface
197218
$currentUser->method('isLoggedIn')->willReturn(true);
198219
$currentUser->method('getUserId')->willReturn(42);
199220

200-
$session = new Session(new MockArraySessionStorage());
221+
$session ??= new Session(new MockArraySessionStorage());
201222

202223
$container = $this->createStub(ContainerInterface::class);
203224
$container

tests/phpMyFAQ/Faq/StatisticsTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ public function testGetTopTenDataWithCategoryFilter(): void
620620
$this->dbMock
621621
->expects($this->once())
622622
->method('query')
623-
->with($this->stringContains("fcr.category_id = 5"))
623+
->with($this->stringContains('fcr.category_id = 5'))
624624
->willReturn($resultMock);
625625
$this->dbMock->method('escape')->willReturn('en');
626626
$this->dbMock->method('fetchObject')->willReturn(null);

tests/phpMyFAQ/Instance/Database/PdoSqlsrvTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,10 @@ public function testCreateTablesWithPrefixOnIndexStatements(): void
187187

188188
$this->pdoSqlsrv->createTables('test_');
189189

190-
$indexQueries = array_filter($executedQueries, fn($q) => str_contains($q, 'CREATE INDEX') || str_contains($q, 'CREATE UNIQUE INDEX'));
190+
$indexQueries = array_filter(
191+
$executedQueries,
192+
fn($q) => str_contains($q, 'CREATE INDEX') || str_contains($q, 'CREATE UNIQUE INDEX'),
193+
);
191194
$this->assertNotEmpty($indexQueries);
192195

193196
foreach ($indexQueries as $query) {

tests/phpMyFAQ/Instance/Search/ElasticsearchTest.php

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ private function createElasticsearchResponse(int $statusCode, array $body): Resp
106106
'Content-Type' => 'application/json',
107107
'X-Elastic-Product' => 'Elasticsearch',
108108
],
109-
json_encode($body)
109+
json_encode($body),
110110
);
111111
}
112112

@@ -324,10 +324,12 @@ public function testIndexFaqSendsCorrectParams(): void
324324
->method('sendRequest')
325325
->with($this->callback(function ($request) {
326326
$body = json_decode((string) $request->getBody(), true);
327-
return str_contains($request->getUri()->getPath(), '/_doc/42')
327+
return (
328+
str_contains($request->getUri()->getPath(), '/_doc/42')
328329
&& $body['question'] === 'What is phpMyFAQ?'
329330
&& $body['answer'] === 'A FAQ tool'
330-
&& $body['content_type'] === 'faq';
331+
&& $body['content_type'] === 'faq'
332+
);
331333
}))
332334
->willReturn($this->createElasticsearchResponse(200, ['result' => 'created']));
333335

@@ -378,9 +380,11 @@ public function testUpdateFaqSendsCorrectParams(): void
378380
->method('sendRequest')
379381
->with($this->callback(function ($request) {
380382
$body = json_decode((string) $request->getBody(), true);
381-
return str_contains($request->getUri()->getPath(), '/_update/42')
383+
return (
384+
str_contains($request->getUri()->getPath(), '/_update/42')
382385
&& $body['doc']['answer'] === 'Updated answer'
383-
&& $body['doc']['content_type'] === 'faq';
386+
&& $body['doc']['content_type'] === 'faq'
387+
);
384388
}))
385389
->willReturn($this->createElasticsearchResponse(200, ['result' => 'updated']));
386390

@@ -418,7 +422,7 @@ public function testDeleteFaqSendsCorrectParams(): void
418422
->method('sendRequest')
419423
->with($this->callback(function ($request) {
420424
return $request->getMethod() === 'DELETE'
421-
&& str_contains($request->getUri()->getPath(), '/phpmyfaq_test/_doc/42');
425+
&& str_contains($request->getUri()->getPath(), '/phpmyfaq_test/_doc/42');
422426
}))
423427
->willReturn($this->createElasticsearchResponse(200, ['result' => 'deleted']));
424428

@@ -441,9 +445,7 @@ public function testDeleteFaqReturnsErrorOnException(): void
441445

442446
public function testIsAvailableReturnsTrueOnPing(): void
443447
{
444-
$this->httpClientMock
445-
->method('sendRequest')
446-
->willReturn($this->createElasticsearchResponse(200, []));
448+
$this->httpClientMock->method('sendRequest')->willReturn($this->createElasticsearchResponse(200, []));
447449

448450
$this->assertTrue($this->elasticsearch->isAvailable());
449451
}
@@ -493,8 +495,7 @@ public function testBulkIndexSkipsInactiveFaqs(): void
493495
->with($this->callback(function ($request) {
494496
$body = (string) $request->getBody();
495497
// NDJSON: should only contain solution_id 2, not 1
496-
return str_contains($body, '"_id":"2"')
497-
&& !str_contains($body, '"_id":"1"');
498+
return str_contains($body, '"_id":"2"') && !str_contains($body, '"_id":"1"');
498499
}))
499500
->willReturn($this->createElasticsearchResponse(200, ['errors' => false, 'items' => []]));
500501

@@ -569,10 +570,12 @@ public function testIndexCustomPageWithActivePage(): void
569570
->method('sendRequest')
570571
->with($this->callback(function ($request) {
571572
$body = json_decode((string) $request->getBody(), true);
572-
return str_contains($request->getUri()->getPath(), '/_doc/page_1_en')
573+
return (
574+
str_contains($request->getUri()->getPath(), '/_doc/page_1_en')
573575
&& $body['content_type'] === 'page'
574576
&& $body['slug'] === 'about-us'
575-
&& $body['answer'] === 'AboutInfo';
577+
&& $body['answer'] === 'AboutInfo'
578+
);
576579
}))
577580
->willReturn($this->createElasticsearchResponse(200, ['result' => 'created']));
578581

@@ -597,7 +600,7 @@ public function testIndexCustomPageWithInactivePageCallsDelete(): void
597600
->method('sendRequest')
598601
->with($this->callback(function ($request) {
599602
return $request->getMethod() === 'DELETE'
600-
&& str_contains($request->getUri()->getPath(), '/_doc/page_1_en');
603+
&& str_contains($request->getUri()->getPath(), '/_doc/page_1_en');
601604
}))
602605
->willReturn($this->createElasticsearchResponse(200, ['result' => 'deleted']));
603606

@@ -645,9 +648,11 @@ public function testUpdateCustomPageWithActivePage(): void
645648
->method('sendRequest')
646649
->with($this->callback(function ($request) {
647650
$body = json_decode((string) $request->getBody(), true);
648-
return str_contains($request->getUri()->getPath(), '/_update/page_6_de')
651+
return (
652+
str_contains($request->getUri()->getPath(), '/_update/page_6_de')
649653
&& $body['doc']['content_type'] === 'page'
650-
&& $body['doc']['answer'] === 'Updated content';
654+
&& $body['doc']['answer'] === 'Updated content'
655+
);
651656
}))
652657
->willReturn($this->createElasticsearchResponse(200, ['result' => 'updated']));
653658

@@ -673,7 +678,7 @@ public function testUpdateCustomPageWithInactivePageCallsDelete(): void
673678
->method('sendRequest')
674679
->with($this->callback(function ($request) {
675680
return $request->getMethod() === 'DELETE'
676-
&& str_contains($request->getUri()->getPath(), '/_doc/page_3_en');
681+
&& str_contains($request->getUri()->getPath(), '/_doc/page_3_en');
677682
}))
678683
->willReturn($this->createElasticsearchResponse(200, ['result' => 'deleted']));
679684

@@ -698,10 +703,9 @@ public function testUpdateCustomPageWithDocumentMissingFallsBackToIndex(): void
698703
$callCount++;
699704
if ($callCount === 1) {
700705
// First call (update) returns 404 with document_missing_exception
701-
return $this->createElasticsearchResponse(
702-
404,
703-
['error' => ['type' => 'document_missing_exception']]
704-
);
706+
return $this->createElasticsearchResponse(404, ['error' => [
707+
'type' => 'document_missing_exception',
708+
]]);
705709
}
706710
// Second call (index fallback) returns 200
707711
return $this->createElasticsearchResponse(200, ['result' => 'created']);
@@ -743,7 +747,7 @@ public function testDeleteCustomPage(): void
743747
->method('sendRequest')
744748
->with($this->callback(function ($request) {
745749
return $request->getMethod() === 'DELETE'
746-
&& str_contains($request->getUri()->getPath(), '/_doc/page_5_de');
750+
&& str_contains($request->getUri()->getPath(), '/_doc/page_5_de');
747751
}))
748752
->willReturn($this->createElasticsearchResponse(200, ['result' => 'deleted']));
749753

@@ -790,8 +794,7 @@ public function testBulkIndexCustomPagesWithActivePages(): void
790794
->method('sendRequest')
791795
->with($this->callback(function ($request) {
792796
$body = (string) $request->getBody();
793-
return str_contains($body, 'page_1_en')
794-
&& !str_contains($body, 'page_2_en');
797+
return str_contains($body, 'page_1_en') && !str_contains($body, 'page_2_en');
795798
}))
796799
->willReturn($this->createElasticsearchResponse(200, ['errors' => false]));
797800

0 commit comments

Comments
 (0)