Skip to content

Commit a2beeb5

Browse files
committed
test: Fix following Testkit tests: Auth basic, Bookmarks, and majority of Session ones
1 parent 3704d08 commit a2beeb5

26 files changed

+176
-99
lines changed

src/Bolt/BoltConnection.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
use Psr\Http\Message\UriInterface;
3939
use Psr\Log\LogLevel;
4040
use Throwable;
41+
use Traversable;
4142
use WeakReference;
4243

4344
/**
@@ -209,12 +210,14 @@ public function reset(): void
209210
* Begins a transaction.
210211
*
211212
* Any of the preconditioned states are: 'READY', 'INTERRUPTED'.
213+
*
214+
* @param iterable<string, scalar|array|null>|null $txMetaData
212215
*/
213-
public function begin(?string $database, ?float $timeout, BookmarkHolder $holder): void
216+
public function begin(?string $database, ?float $timeout, BookmarkHolder $holder, ?iterable $txMetaData): void
214217
{
215218
$this->consumeResults();
216219

217-
$extra = $this->buildRunExtra($database, $timeout, $holder, AccessMode::WRITE());
220+
$extra = $this->buildRunExtra($database, $timeout, $holder, AccessMode::WRITE(), $txMetaData);
218221
$message = $this->messageFactory->createBeginMessage($extra);
219222
$response = $message->send()->getResponse();
220223
$this->assertNoFailure($response);
@@ -248,8 +251,9 @@ public function run(
248251
?float $timeout,
249252
BookmarkHolder $holder,
250253
?AccessMode $mode,
254+
?iterable $tsxMetadata,
251255
): array {
252-
$extra = $this->buildRunExtra($database, $timeout, $holder, $mode);
256+
$extra = $this->buildRunExtra($database, $timeout, $holder, $mode, $tsxMetadata);
253257
$message = $this->messageFactory->createRunMessage($text, $parameters, $extra);
254258
$response = $message->send()->getResponse();
255259
$this->assertNoFailure($response);
@@ -327,7 +331,7 @@ public function close(): void
327331
}
328332
}
329333

330-
private function buildRunExtra(?string $database, ?float $timeout, BookmarkHolder $holder, ?AccessMode $mode): array
334+
private function buildRunExtra(?string $database, ?float $timeout, BookmarkHolder $holder, ?AccessMode $mode, ?iterable $metadata): array
331335
{
332336
$extra = [];
333337
if ($database !== null) {
@@ -345,6 +349,13 @@ private function buildRunExtra(?string $database, ?float $timeout, BookmarkHolde
345349
$extra['mode'] = AccessMode::WRITE() === $mode ? 'w' : 'r';
346350
}
347351

352+
if ($metadata !== null) {
353+
$metadataArray = $metadata instanceof Traversable ? iterator_to_array($metadata) : $metadata;
354+
if (count($metadataArray) > 0) {
355+
$extra['tx_metadata'] = $metadataArray;
356+
}
357+
}
358+
348359
return $extra;
349360
}
350361

src/Bolt/BoltUnmanagedTransaction.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ public function runStatement(Statement $statement): SummarizedResult
138138
$this->database,
139139
$this->tsxConfig->getTimeout(),
140140
$this->bookmarkHolder,
141-
$this->config->getAccessMode()
141+
$this->config->getAccessMode(),
142+
$this->tsxConfig->getMetaData()
142143
);
143144
} catch (Throwable $e) {
144145
$this->state = TransactionState::TERMINATED;

src/Bolt/Session.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ private function startTransaction(TransactionConfiguration $config, SessionConfi
188188
try {
189189
$connection = $this->acquireConnection($config, $sessionConfig);
190190

191-
$connection->begin($this->config->getDatabase(), $config->getTimeout(), $this->bookmarkHolder);
191+
$connection->begin($this->config->getDatabase(), $config->getTimeout(), $this->bookmarkHolder, $config->getMetaData());
192192
} catch (Neo4jException $e) {
193193
if (isset($connection) && $connection->getServerState() === 'FAILED') {
194194
$connection->reset();

testkit-backend/src/Backend.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
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;
2219
use function get_debug_type;
2320
use function json_decode;
2421
use function json_encode;
@@ -82,16 +79,14 @@ public function handle(): void
8279
{
8380
while (true) {
8481
$message = $this->socket->readMessage();
85-
$this->logger->info("Raw request message: " . $message);
86-
echo "Raw request message: " . $message . PHP_EOL;
87-
82+
$this->logger->info('Raw request message: '.$message);
83+
echo 'Raw request message: '.$message.PHP_EOL;
8884

8985
if ($message === null) {
9086
$this->socket->reset();
9187
continue;
9288
}
9389

94-
9590
[$handler, $request] = $this->extractRequest($message);
9691
try {
9792
$this->properSendoff($handler->handle($request));
@@ -112,7 +107,7 @@ private function loadRequestHandler(string $name): RequestHandlerInterface
112107
RequestHandlerInterface::class,
113108
get_debug_type($action)
114109
);
115-
throw new UnexpectedValueException((string)$str);
110+
throw new UnexpectedValueException((string) $str);
116111
}
117112

118113
return $action;

testkit-backend/src/Handlers/AbstractRunner.php

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
use Laudis\Neo4j\Contracts\SessionInterface;
1717
use Laudis\Neo4j\Contracts\TransactionInterface;
1818
use Laudis\Neo4j\Databags\SummarizedResult;
19-
use Laudis\Neo4j\Exception\InvalidTransactionStateException;
19+
use Laudis\Neo4j\Databags\TransactionConfiguration;
2020
use Laudis\Neo4j\Exception\Neo4jException;
2121
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
2222
use Laudis\Neo4j\TestkitBackend\MainRepository;
23+
use Laudis\Neo4j\TestkitBackend\Requests\SessionRunRequest;
2324
use Laudis\Neo4j\TestkitBackend\Responses\DriverErrorResponse;
24-
use Laudis\Neo4j\TestkitBackend\Responses\FrontendErrorResponse;
2525
use Laudis\Neo4j\TestkitBackend\Responses\ResultResponse;
2626
use Laudis\Neo4j\Types\AbstractCypherObject;
2727
use Laudis\Neo4j\Types\CypherList;
@@ -54,10 +54,30 @@ public function handle($request): ResultResponse
5454

5555
try {
5656
$params = [];
57-
foreach ($request->getParams() as $key => $value) {
58-
$params[$key] = $this->decodeToValue($value);
57+
if ($request->getParams() !== null) {
58+
foreach ($request->getParams() as $key => $value) {
59+
$params[$key] = $this->decodeToValue($value);
60+
}
61+
}
62+
63+
if ($request instanceof SessionRunRequest && $session instanceof SessionInterface) {
64+
$metaData = $request->getTxMeta();
65+
$actualMeta = [];
66+
if ($metaData !== null) {
67+
foreach ($metaData as $key => $meta) {
68+
$actualMeta[$key] = $this->decodeToValue($meta);
69+
}
70+
}
71+
$config = TransactionConfiguration::default()->withMetadata($actualMeta)->withTimeout($request->getTimeout());
72+
73+
$result = $session->run($request->getCypher(), $params, $config);
74+
} else {
75+
$result = $session->run($request->getCypher(), $params);
5976
}
60-
$result = $session->run($request->getCypher(), $params);
77+
78+
$this->repository->addRecords($id, $result);
79+
80+
return new ResultResponse($id, $result->isEmpty() ? [] : $result->first()->keys());
6181
} catch (Neo4jException $exception) {
6282
$this->logger->debug($exception->__toString());
6383
$this->repository->addRecords($id, new DriverErrorResponse(
@@ -67,10 +87,6 @@ public function handle($request): ResultResponse
6787

6888
return new ResultResponse($id, []);
6989
} // NOTE: all other exceptions will be caught in the Backend
70-
71-
$this->repository->addRecords($id, $result);
72-
73-
return new ResultResponse($id, $result->isEmpty() ? [] : $result->first()->keys());
7490
}
7591

7692
/**

testkit-backend/src/Handlers/NewDriver.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Laudis\Neo4j\Authentication\Authenticate;
1717
use Laudis\Neo4j\Databags\DriverConfiguration;
1818
use Laudis\Neo4j\DriverFactory;
19-
use Laudis\Neo4j\Formatter\SummarizedResultFormatter;
2019
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
2120
use Laudis\Neo4j\TestkitBackend\MainRepository;
2221
use Laudis\Neo4j\TestkitBackend\Requests\NewDriverRequest;

testkit-backend/src/Handlers/NewSession.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ public function handle($request): SessionResponse
5252
$config = $config->withDatabase($request->database);
5353
}
5454

55-
if ($request->fetchSize !== null) {
56-
$config = $config->withFetchSize($request->fetchSize);
57-
}
55+
$config = $config->withFetchSize($request->fetchSize ?? 1);
5856

5957
$session = $driver->createSession($config);
6058
$id = Uuid::v4();

testkit-backend/src/Handlers/ResultNext.php

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313

1414
namespace Laudis\Neo4j\TestkitBackend\Handlers;
1515

16+
use Laudis\Neo4j\Exception\Neo4jException;
1617
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
1718
use Laudis\Neo4j\TestkitBackend\Contracts\TestkitResponseInterface;
1819
use Laudis\Neo4j\TestkitBackend\MainRepository;
1920
use Laudis\Neo4j\TestkitBackend\Requests\ResultNextRequest;
21+
use Laudis\Neo4j\TestkitBackend\Responses\DriverErrorResponse;
2022
use Laudis\Neo4j\TestkitBackend\Responses\NullRecordResponse;
2123
use Laudis\Neo4j\TestkitBackend\Responses\RecordResponse;
2224
use Laudis\Neo4j\TestkitBackend\Responses\Types\CypherObject;
@@ -38,26 +40,35 @@ public function __construct(MainRepository $repository)
3840
*/
3941
public function handle($request): TestkitResponseInterface
4042
{
41-
$record = $this->repository->getRecords($request->getResultId());
42-
if ($record instanceof TestkitResponseInterface) {
43-
return $record;
44-
}
43+
try {
44+
$record = $this->repository->getRecords($request->getResultId());
45+
if ($record instanceof TestkitResponseInterface) {
46+
return $record;
47+
}
4548

46-
$iterator = $this->repository->getIterator($request->getResultId());
49+
$iterator = $this->repository->getIterator($request->getResultId());
4750

48-
if (!$iterator->valid()) {
49-
return new NullRecordResponse();
50-
}
51+
if ($this->repository->getIteratorFetchedFirst($request->getResultId()) === true) {
52+
$iterator->next();
53+
}
5154

52-
$current = $iterator->current();
55+
if (!$iterator->valid()) {
56+
return new NullRecordResponse();
57+
}
5358

54-
$iterator->next();
59+
$current = $iterator->current();
60+
$this->repository->setIteratorFetchedFirst($request->getResultId(), true);
5561

56-
$values = [];
57-
foreach ($current as $value) {
58-
$values[] = CypherObject::autoDetect($value);
59-
}
62+
$values = [];
63+
foreach ($current as $value) {
64+
$values[] = CypherObject::autoDetect($value);
65+
}
6066

61-
return new RecordResponse($values);
67+
return new RecordResponse($values);
68+
} catch (Neo4jException $e) {
69+
$this->repository->removeRecords($request->getResultId());
70+
71+
return new DriverErrorResponse($request->getResultId(), $e);
72+
}
6273
}
6374
}

testkit-backend/src/Handlers/ResultSingle.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
<?php
22

3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the Neo4j PHP Client and Driver package.
7+
*
8+
* (c) Nagels <https://nagels.tech>
9+
*
10+
* For the full copyright and license information, please view the LICENSE
11+
* file that was distributed with this source code.
12+
*/
13+
314
namespace Laudis\Neo4j\TestkitBackend\Handlers;
415

516
use Laudis\Neo4j\TestkitBackend\Contracts\RequestHandlerInterface;
@@ -21,9 +32,9 @@
2132
*/
2233
final class ResultSingle implements RequestHandlerInterface
2334
{
24-
private function __construct(private readonly MainRepository $repository)
25-
{
26-
35+
private function __construct(
36+
private readonly MainRepository $repository,
37+
) {
2738
}
2839

2940
public function handle($request): TestkitResponseInterface

testkit-backend/src/Handlers/SessionLastBookmarks.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,16 @@
1818
use Laudis\Neo4j\TestkitBackend\MainRepository;
1919
use Laudis\Neo4j\TestkitBackend\Requests\SessionLastBookmarksRequest;
2020
use Laudis\Neo4j\TestkitBackend\Responses\BookmarksResponse;
21-
use Laudis\Neo4j\TestkitBackend\Responses\SkipTestResponse;
22-
use Monolog\Handler\AbstractHandler;
2321
use Symfony\Component\Uid\Uuid;
2422

2523
/**
2624
* @implements AbstractRunner<SessionLastBookmarksRequest>
2725
*/
2826
final class SessionLastBookmarks implements RequestHandlerInterface
2927
{
30-
public function __construct(private readonly MainRepository $repository)
31-
{
28+
public function __construct(
29+
private readonly MainRepository $repository,
30+
) {
3231
}
3332

3433
/**

0 commit comments

Comments
 (0)