Skip to content

Commit 4bb4670

Browse files
working tests for bookmarks
1 parent 1b6a907 commit 4bb4670

17 files changed

+137
-36
lines changed

src/Types/CypherList.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,9 @@ public function getAsWGS843DPoint(int $key): WGS843DPoint
338338
return $this->getAsObject($key, WGS843DPoint::class);
339339
}
340340

341-
public function key(): int
341+
public function key(): string
342342
{
343-
/** @var int */
343+
/** @var string */
344344
return $this->cacheKey();
345345
}
346346

src/Types/CypherSequenceTrait.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ public function next(): void
366366

367367
protected function cacheKey(): string|int
368368
{
369-
return $this->keyCache[$this->currentPosition % max($this->cacheLimit, 1)];
369+
return (string) $this->keyCache[$this->currentPosition % max($this->cacheLimit, 1)];
370370
}
371371

372372
/**

testkit-backend/src/Backend.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
use DI\ContainerBuilder;
1717
use Exception;
1818

19+
use Laudis\Neo4j\Exception\Neo4jException;
20+
use Laudis\Neo4j\TestkitBackend\Responses\DriverErrorResponse;
21+
use Laudis\Neo4j\TestkitBackend\Responses\ResultResponse;
1922
use function get_debug_type;
2023
use function json_decode;
2124
use function json_encode;
@@ -88,11 +91,13 @@ public function handle(): void
8891
continue;
8992
}
9093

94+
95+
[$handler, $request] = $this->extractRequest($message);
9196
try {
92-
[$handler, $request] = $this->extractRequest($message);
9397
$this->properSendoff($handler->handle($request));
9498
} catch (Throwable $e) {
9599
$this->logger->error($e->__toString());
100+
96101
$this->properSendoff(new BackendErrorResponse($e->getMessage()));
97102
}
98103
}

testkit-backend/src/Handlers/AbstractRunner.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,8 @@ public function handle($request): ResultResponse
6565
));
6666

6767
return new ResultResponse($id, []);
68-
} catch (\Throwable $exception) {
69-
$this->repository->addRecords($id, new FrontendErrorResponse(
70-
$exception->getMessage()
71-
));
72-
}
68+
} // NOTE: all other exceptions will be caught in the Backend
69+
7370
$this->repository->addRecords($id, $result);
7471

7572
return new ResultResponse($id, $result->isEmpty() ? [] : $result->first()->keys());

testkit-backend/src/Handlers/NewSession.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Laudis\Neo4j\TestkitBackend\Handlers;
1515

16+
use Laudis\Neo4j\Databags\Bookmark;
1617
use Laudis\Neo4j\Databags\SessionConfiguration;
1718
use Laudis\Neo4j\Enum\AccessMode;
1819
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
@@ -44,7 +45,7 @@ public function handle($request): SessionResponse
4445
->withAccessMode($request->accessMode === 'r' ? AccessMode::READ() : AccessMode::WRITE());
4546

4647
if ($request->bookmarks !== null) {
47-
$config = $config->withBookmarks($request->bookmarks);
48+
$config = $config->withBookmarks([new Bookmark($request->bookmarks)]);
4849
}
4950

5051
if ($request->database !== null) {
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace Laudis\Neo4j\TestkitBackend\Handlers;
4+
5+
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
6+
use Laudis\Neo4j\TestkitBackend\Contracts\TestkitResponseInterface;
7+
use Laudis\Neo4j\TestkitBackend\MainRepository;
8+
use Laudis\Neo4j\TestkitBackend\Requests\ResultSingleRequest;
9+
use Laudis\Neo4j\TestkitBackend\Responses\BackendErrorResponse;
10+
use Laudis\Neo4j\TestkitBackend\Responses\RecordResponse;
11+
12+
/**
13+
* Request to expect and return exactly one record in the result stream.
14+
*
15+
* Backend should respond with a Record if exactly one record was found.
16+
* If more or fewer records are left in the result stream, or if any other
17+
* error occurs while retrieving the records, an Error response should be
18+
* returned.
19+
*
20+
* @implements RequestHandlerInterface<ResultSingleRequest>
21+
*/
22+
final class ResultSingle implements RequestHandlerInterface
23+
{
24+
private function __construct(private readonly MainRepository $repository)
25+
{
26+
27+
}
28+
29+
public function handle($request): TestkitResponseInterface
30+
{
31+
$record = $this->repository->getRecords($request->getResultId());
32+
if ($record instanceof TestkitResponseInterface) {
33+
return new BackendErrorResponse('Something went wrong with the result handling');
34+
}
35+
36+
$count = $record->count();
37+
if ($count !== 1) {
38+
return new BackendErrorResponse(sprintf('Found exactly %s result rows, but expected just one.', $count));
39+
}
40+
41+
$values = [];
42+
foreach ($record->getAsCypherMap(0) as $value) {
43+
$values[] = $value;
44+
}
45+
46+
return new RecordResponse($values);
47+
}
48+
}

testkit-backend/src/Handlers/SessionBeginTransaction.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@
1414
namespace Laudis\Neo4j\TestkitBackend\Handlers;
1515

1616
use Laudis\Neo4j\Databags\TransactionConfiguration;
17+
use Laudis\Neo4j\Exception\Neo4jException;
1718
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
1819
use Laudis\Neo4j\TestkitBackend\Contracts\TestkitResponseInterface;
1920
use Laudis\Neo4j\TestkitBackend\MainRepository;
2021
use Laudis\Neo4j\TestkitBackend\Requests\SessionBeginTransactionRequest;
22+
use Laudis\Neo4j\TestkitBackend\Responses\DriverErrorResponse;
2123
use Laudis\Neo4j\TestkitBackend\Responses\TransactionResponse;
24+
use Psr\Log\LoggerInterface;
2225
use Symfony\Component\Uid\Uuid;
2326

2427
/**
@@ -27,10 +30,12 @@
2730
final class SessionBeginTransaction implements RequestHandlerInterface
2831
{
2932
private MainRepository $repository;
33+
private LoggerInterface $logger;
3034

31-
public function __construct(MainRepository $repository)
35+
public function __construct(MainRepository $repository, LoggerInterface $logger)
3236
{
3337
$this->repository = $repository;
38+
$this->logger = $logger;
3439
}
3540

3641
/**
@@ -51,7 +56,13 @@ public function handle($request): TestkitResponseInterface
5156
}
5257

5358
// TODO - Create beginReadTransaction and beginWriteTransaction
54-
$transaction = $session->beginTransaction(null, $config);
59+
try {
60+
$transaction = $session->beginTransaction(null, $config);
61+
} catch (Neo4jException $exception) {
62+
$this->logger->debug($exception->__toString());
63+
64+
return new DriverErrorResponse($request->getSessionId(), $exception);
65+
}
5566
$id = Uuid::v4();
5667

5768
$this->repository->addTransaction($id, $transaction);

testkit-backend/src/Handlers/SessionLastBookmarks.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,38 @@
1515

1616
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
1717
use Laudis\Neo4j\TestkitBackend\Contracts\TestkitResponseInterface;
18+
use Laudis\Neo4j\TestkitBackend\MainRepository;
1819
use Laudis\Neo4j\TestkitBackend\Requests\SessionLastBookmarksRequest;
20+
use Laudis\Neo4j\TestkitBackend\Responses\BookmarksResponse;
1921
use Laudis\Neo4j\TestkitBackend\Responses\SkipTestResponse;
22+
use Monolog\Handler\AbstractHandler;
23+
use Symfony\Component\Uid\Uuid;
2024

2125
/**
22-
* @implements RequestHandlerInterface<SessionLastBookmarksRequest>
26+
* @implements AbstractRunner<SessionLastBookmarksRequest>
2327
*/
2428
final class SessionLastBookmarks implements RequestHandlerInterface
2529
{
30+
public function __construct(private readonly MainRepository $repository)
31+
{
32+
}
33+
2634
/**
2735
* @param SessionLastBookmarksRequest $request
36+
*
37+
* @return TestkitResponseInterface<BookmarksResponse>
2838
*/
2939
public function handle($request): TestkitResponseInterface
3040
{
31-
return new SkipTestResponse('Bookmarks not implemented yet');
41+
$session = $this->repository->getSession($request->getSessionId());
42+
43+
$bookmarks = $session->getLastBookmark()->values();
44+
45+
return new BookmarksResponse($bookmarks);
46+
}
47+
48+
protected function getId($request): Uuid
49+
{
50+
return $request->getSessionId();
3251
}
3352
}

testkit-backend/src/Handlers/SessionReadTransaction.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,5 @@ public function handle($request): TestkitResponseInterface
7373

7474
return new RetryableTryResponse($id);
7575
}
76+
// f1aa000cede64d6a8879513c97633777
7677
}

testkit-backend/src/Handlers/SessionWriteTransaction.php

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,9 @@ public function handle($request): TestkitResponseInterface
4040
{
4141
$session = $this->repository->getSession($request->getSessionId());
4242

43-
$config = TransactionConfiguration::default();
44-
45-
if ($request->getTimeout()) {
46-
$config = $config->withTimeout($request->getTimeout());
47-
}
48-
49-
if ($request->getTxMeta()) {
50-
$config = $config->withMetaData($request->getTxMeta());
51-
}
52-
53-
// TODO - Create beginReadTransaction and beginWriteTransaction
54-
$transaction = $session->beginTransaction(null, $config);
5543
$id = Uuid::v4();
5644

57-
$this->repository->addTransaction($id, $transaction);
45+
$this->repository->addTransaction($id, $session);
5846
$this->repository->bindTransactionToSession($request->getSessionId(), $id);
5947

6048
return new RetryableTryResponse($id);

0 commit comments

Comments
 (0)