diff --git a/composer.json b/composer.json index 5c175720..961b76fb 100644 --- a/composer.json +++ b/composer.json @@ -84,6 +84,6 @@ "scripts": { "fix-cs": "./vendor/bin/php-cs-fixer fix", "check-cs": "./vendor/bin/php-cs-fixer fix --dry-run", - "psalm": "./vendor/bin/psalm" + "psalm": "./vendor/bin/psalm --show-info" } } diff --git a/src/Bolt/BoltConnection.php b/src/Bolt/BoltConnection.php index 70f7cdfe..f1fdd6f0 100644 --- a/src/Bolt/BoltConnection.php +++ b/src/Bolt/BoltConnection.php @@ -128,7 +128,7 @@ public function getProtocol(): ConnectionProtocol /** * @psalm-mutation-free */ - public function getAccessMode(): AccessMode + public function getAccessMode(): ?AccessMode { return $this->config->getAccessMode(); } @@ -217,7 +217,7 @@ public function begin(?string $database, ?float $timeout, BookmarkHolder $holder { $this->consumeResults(); - $extra = $this->buildRunExtra($database, $timeout, $holder, AccessMode::WRITE(), $txMetaData); + $extra = $this->buildRunExtra($database, $timeout, $holder, null, $txMetaData); $message = $this->messageFactory->createBeginMessage($extra); $response = $message->send()->getResponse(); $this->assertNoFailure($response); @@ -249,7 +249,7 @@ public function run( array $parameters, ?string $database, ?float $timeout, - BookmarkHolder $holder, + ?BookmarkHolder $holder, ?AccessMode $mode, ?iterable $tsxMetadata, ): array { @@ -295,7 +295,6 @@ public function protocol(): V4_4|V5|V5_1|V5_2|V5_3|V5_4 public function pull(?int $qid, ?int $fetchSize): array { $extra = $this->buildResultExtra($fetchSize, $qid); - $this->logger?->log(LogLevel::DEBUG, 'PULL', $extra); $tbr = []; $message = $this->messageFactory->createPullMessage($extra); @@ -331,7 +330,7 @@ public function close(): void } } - private function buildRunExtra(?string $database, ?float $timeout, BookmarkHolder $holder, ?AccessMode $mode, ?iterable $metadata): array + private function buildRunExtra(?string $database, ?float $timeout, ?BookmarkHolder $holder, ?AccessMode $mode, ?iterable $metadata): array { $extra = []; if ($database !== null) { @@ -341,7 +340,7 @@ private function buildRunExtra(?string $database, ?float $timeout, BookmarkHolde $extra['tx_timeout'] = (int) ($timeout * 1000); } - if (!$holder->getBookmark()->isEmpty()) { + if ($holder && !$holder->getBookmark()->isEmpty()) { $extra['bookmarks'] = $holder->getBookmark()->values(); } @@ -366,7 +365,7 @@ private function buildResultExtra(?int $fetchSize, ?int $qid): array $extra['n'] = $fetchSize; } - if ($qid !== null) { + if ($qid !== null && $qid >= 0) { $extra['qid'] = $qid; } @@ -420,6 +419,10 @@ public function assertNoFailure(Response $response): void */ public function discardUnconsumedResults(): void { + if (!in_array($this->protocol()->serverState, [ServerState::STREAMING, ServerState::TX_STREAMING], true)) { + return; + } + $this->logger?->log(LogLevel::DEBUG, 'Discarding unconsumed results'); $this->subscribedResults = array_values(array_filter( diff --git a/src/Bolt/BoltUnmanagedTransaction.php b/src/Bolt/BoltUnmanagedTransaction.php index adaa5614..a4108d87 100644 --- a/src/Bolt/BoltUnmanagedTransaction.php +++ b/src/Bolt/BoltUnmanagedTransaction.php @@ -52,6 +52,7 @@ public function __construct( private readonly TransactionConfiguration $tsxConfig, private readonly BookmarkHolder $bookmarkHolder, private readonly BoltMessageFactory $messageFactory, + private readonly bool $isInstantTransaction, ) { } @@ -147,8 +148,8 @@ public function runStatement(Statement $statement): SummarizedResult $parameters->toArray(), $this->database, $this->tsxConfig->getTimeout(), - $this->bookmarkHolder, - $this->config->getAccessMode(), + $this->isInstantTransaction ? $this->bookmarkHolder : null, // let the begin transaction pass the bookmarks if it is a managed transaction + $this->isInstantTransaction ? $this->config->getAccessMode() : null, // let the begin transaction decide if it is a managed transaction $this->tsxConfig->getMetaData() ); } catch (Throwable $e) { diff --git a/src/Bolt/Session.php b/src/Bolt/Session.php index 388e7cff..92ced82a 100644 --- a/src/Bolt/Session.php +++ b/src/Bolt/Session.php @@ -195,6 +195,7 @@ private function beginInstantTransaction( $tsxConfig, $this->bookmarkHolder, new BoltMessageFactory($connection, $this->getLogger()), + true, ); } @@ -246,6 +247,7 @@ private function startTransaction(TransactionConfiguration $config, SessionConfi $config, $this->bookmarkHolder, new BoltMessageFactory($connection, $this->getLogger()), + false ); } diff --git a/src/Client.php b/src/Client.php index 4a114f66..121bb81a 100644 --- a/src/Client.php +++ b/src/Client.php @@ -130,7 +130,8 @@ private function startSession(?string $alias, SessionConfiguration $configuratio public function writeTransaction(callable $tsxHandler, ?string $alias = null, ?TransactionConfiguration $config = null) { - if ($this->defaultSessionConfiguration->getAccessMode() === AccessMode::WRITE()) { + $accessMode = $this->defaultSessionConfiguration->getAccessMode(); + if ($accessMode === null || $accessMode === AccessMode::WRITE()) { $session = $this->getSession($alias); } else { $sessionConfig = $this->defaultSessionConfiguration->withAccessMode(AccessMode::WRITE()); diff --git a/src/Common/ConnectionConfiguration.php b/src/Common/ConnectionConfiguration.php index 3a458f91..babcb818 100644 --- a/src/Common/ConnectionConfiguration.php +++ b/src/Common/ConnectionConfiguration.php @@ -27,7 +27,7 @@ public function __construct( private string $serverAgent, private readonly UriInterface $serverAddress, private readonly ConnectionProtocol $protocol, - private readonly AccessMode $accessMode, + private readonly ?AccessMode $accessMode, private readonly ?DatabaseInfo $databaseInfo, private readonly string $encryptionLevel, ) { @@ -54,7 +54,7 @@ public function getProtocol(): ConnectionProtocol return $this->protocol; } - public function getAccessMode(): AccessMode + public function getAccessMode(): ?AccessMode { return $this->accessMode; } diff --git a/src/Contracts/ConnectionInterface.php b/src/Contracts/ConnectionInterface.php index e95988b6..8a1f2883 100644 --- a/src/Contracts/ConnectionInterface.php +++ b/src/Contracts/ConnectionInterface.php @@ -75,7 +75,7 @@ public function getProtocol(): ConnectionProtocol; * * @psalm-mutation-free */ - public function getAccessMode(): AccessMode; + public function getAccessMode(): ?AccessMode; /** * Returns the information about the database the connection reaches. diff --git a/src/Databags/SessionConfiguration.php b/src/Databags/SessionConfiguration.php index 397e864a..aa32a81d 100644 --- a/src/Databags/SessionConfiguration.php +++ b/src/Databags/SessionConfiguration.php @@ -117,9 +117,9 @@ public function getFetchSize(): int * * @psalm-suppress ImpureMethodCall */ - public function getAccessMode(): AccessMode + public function getAccessMode(): ?AccessMode { - return $this->accessMode ?? AccessMode::WRITE(); + return $this->accessMode; } /** diff --git a/src/Neo4j/Neo4jConnectionPool.php b/src/Neo4j/Neo4jConnectionPool.php index 4074d03a..b69b0b63 100644 --- a/src/Neo4j/Neo4jConnectionPool.php +++ b/src/Neo4j/Neo4jConnectionPool.php @@ -185,9 +185,9 @@ public function getLogger(): ?Neo4jLogger /** * @throws Exception */ - private function getNextServer(RoutingTable $table, AccessMode $mode): Uri + private function getNextServer(RoutingTable $table, ?AccessMode $mode): Uri { - if (AccessMode::WRITE() === $mode) { + if ($mode === null || AccessMode::WRITE() === $mode) { $servers = $table->getWithRole(RoutingRoles::LEADER()); } else { $servers = $table->getWithRole(RoutingRoles::FOLLOWER()); diff --git a/testkit-backend/src/Handlers/NewSession.php b/testkit-backend/src/Handlers/NewSession.php index 72ba4040..88ea8162 100644 --- a/testkit-backend/src/Handlers/NewSession.php +++ b/testkit-backend/src/Handlers/NewSession.php @@ -41,8 +41,13 @@ public function handle($request): SessionResponse { $driver = $this->repository->getDriver($request->driverId); - $config = SessionConfiguration::default() - ->withAccessMode($request->accessMode === 'r' ? AccessMode::READ() : AccessMode::WRITE()); + $config = SessionConfiguration::default(); + + if ($request->accessMode === 'r') { + $config = $config->withAccessMode(AccessMode::READ()); + } elseif ($request->accessMode === 'w') { + $config = $config->withAccessMode(AccessMode::WRITE()); + } if ($request->bookmarks !== null) { $config = $config->withBookmarks([new Bookmark($request->bookmarks)]); @@ -52,7 +57,9 @@ public function handle($request): SessionResponse $config = $config->withDatabase($request->database); } - $config = $config->withFetchSize($request->fetchSize ?? 1); + if ($request->fetchSize !== null) { + $config = $config->withFetchSize($request->fetchSize); + } $session = $driver->createSession($config); $id = Uuid::v4(); diff --git a/testkit-backend/src/Requests/SessionBeginTransactionRequest.php b/testkit-backend/src/Requests/SessionBeginTransactionRequest.php index 8e9025d3..a8242624 100644 --- a/testkit-backend/src/Requests/SessionBeginTransactionRequest.php +++ b/testkit-backend/src/Requests/SessionBeginTransactionRequest.php @@ -13,7 +13,6 @@ namespace Laudis\Neo4j\TestkitBackend\Requests; -use Laudis\Neo4j\Databags\TransactionConfiguration; use Symfony\Component\Uid\Uuid; final class SessionBeginTransactionRequest @@ -49,8 +48,8 @@ public function getTxMeta(): iterable return $this->txMeta ?? []; } - public function getTimeout(): int + public function getTimeout(): ?int { - return (int) ($this->timeout ?? TransactionConfiguration::DEFAULT_TIMEOUT); + return $this->timeout; } } diff --git a/testkit-backend/testkit.sh b/testkit-backend/testkit.sh index 89cfa136..d949e50a 100755 --- a/testkit-backend/testkit.sh +++ b/testkit-backend/testkit.sh @@ -30,109 +30,121 @@ fi cd testkit || (echo 'cannot cd into testkit' && exit 1) python3 -m venv venv source venv/bin/activate -pip install -r requirements.txt - -# python3 main.py --tests UNIT_TESTS - -echo "Starting tests..." - -EXIT_CODE=0 -##neo4j -#test_authentication -python3 -m unittest tests.neo4j.test_authentication.TestAuthenticationBasic|| EXIT_CODE=1 - -#test_bookmarks -python3 -m unittest tests.neo4j.test_bookmarks.TestBookmarks.test_can_obtain_bookmark_after_commit || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_bookmarks.TestBookmarks.test_can_pass_bookmark_into_next_session || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_bookmarks.TestBookmarks.test_no_bookmark_after_rollback || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_bookmarks.TestBookmarks.test_fails_on_invalid_bookmark || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_bookmarks.TestBookmarks.test_fails_on_invalid_bookmark_using_tx_func || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_bookmarks.TestBookmarks.test_can_handle_multiple_bookmarks || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_bookmarks.TestBookmarks.test_can_pass_write_bookmark_into_write_session || EXIT_CODE=1 - -###test_session_run -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_iteration_smaller_than_fetch_size || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_can_return_node || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_can_return_relationship || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_can_return_path || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_autocommit_transactions_should_support_metadata || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_regex_in_parameter || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_regex_inline || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_iteration_larger_than_fetch_size || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_partial_iteration || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_simple_query || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_session_reuse || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_iteration_nested || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_recover_from_invalid_query || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_updates_last_bookmark || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_fails_on_bad_syntax || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_fails_on_missing_parameter || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_session_run.TestSessionRun.test_long_string || EXIT_CODE=1 -### -###test_direct_driver -python3 -m unittest tests.neo4j.test_direct_driver.TestDirectDriver.test_custom_resolver|| EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_direct_driver.TestDirectDriver.test_fail_nicely_when_using_http_port|| EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_direct_driver.TestDirectDriver.test_supports_multi_db|| EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_direct_driver.TestDirectDriver.test_multi_db_non_existing || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_direct_driver.TestDirectDriver.test_multi_db || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_direct_driver.TestDirectDriver.test_multi_db_various_databases|| EXIT_CODE=1 -## -###test_summary -python3 -m unittest tests.neo4j.test_summary.TestSummary -## -## -####test_tx_run -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_simple_query || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_can_commit_transaction || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_can_rollback_transaction || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_updates_last_bookmark_on_commit || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_does_not_update_last_bookmark_on_rollback || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_does_not_update_last_bookmark_on_failure || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_be_able_to_rollback_a_failure || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_not_commit_a_failure || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_not_rollback_a_rollbacked_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_not_rollback_a_commited_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_not_commit_a_commited_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_not_allow_run_on_a_commited_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_not_allow_run_on_a_rollbacked_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_not_run_valid_query_in_invalid_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_fail_run_in_a_commited_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_fail_run_in_a_rollbacked_tx || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_should_fail_to_run_query_for_invalid_bookmark || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_broken_transaction_should_not_break_session || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_tx_configuration || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_consume_after_commit || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_parallel_queries || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_run.TestTxRun.test_unconsumed_result || EXIT_CODE=1 -## -####test_tx_func_run -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_simple_query || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_parameter || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_meta_data || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_iteration_nested || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_updates_last_bookmark_on_commit || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_does_not_update_last_bookmark_on_rollback || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_client_exception_rolls_back_change || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_tx_func_configuration || EXIT_CODE=1 -python3 -m unittest tests.neo4j.test_tx_func_run.TestTxFuncRun.test_tx_timeout || EXIT_CODE=1 - - -####stub -####test-basic-query -python3 -m unittest tests.stub.basic_query.test_basic_query.TestBasicQuery.test_5x0_populates_path_element_ids_with_string || EXIT_CODE=1 -python3 -m unittest tests.stub.basic_query.test_basic_query.TestBasicQuery.test_4x4_populates_node_element_id_with_id || EXIT_CODE=1 -python3 -m unittest tests.stub.basic_query.test_basic_query.TestBasicQuery.test_5x0_populates_node_element_id_with_string || EXIT_CODE=1 -python3 -m unittest tests.stub.basic_query.test_basic_query.TestBasicQuery.test_4x4_populates_rel_element_id_with_id || EXIT_CODE=1 -python3 -m unittest tests.stub.basic_query.test_basic_query.TestBasicQuery.test_4x4_populates_path_element_ids_with_long || EXIT_CODE=1 - - -## -###test-session-run -python3 -m unittest tests.stub.session_run.test_session_run.TestSessionRun.test_discard_on_session_close_untouched_result || EXIT_CODE=1 -python3 -m unittest tests.stub.session_run.test_session_run.TestSessionRun.test_discard_on_session_close_unfinished_result || EXIT_CODE=1 -python3 -m unittest tests.stub.session_run.test_session_run.TestSessionRun.test_no_discard_on_session_close_finished_result || EXIT_CODE=1 -python3 -m unittest tests.stub.session_run.test_session_run.TestSessionRun.test_raises_error_on_session_run || EXIT_CODE=1 - +pip install -r requirements.txt > /dev/null 2>&1 + +echo "" +echo "╔════════════════════════════════════════════════════════════════════════════╗" +echo "║ Neo4j PHP Driver TestKit Suite ║" +echo "╚════════════════════════════════════════════════════════════════════════════╝" +echo "" + + + + +## Run all tests in a single command with verbose output +python3 -m unittest -v \ + tests.neo4j.test_authentication.TestAuthenticationBasic \ +\ + tests.neo4j.test_bookmarks.TestBookmarks.test_can_handle_multiple_bookmarks \ + tests.neo4j.test_bookmarks.TestBookmarks.test_can_obtain_bookmark_after_commit \ + tests.neo4j.test_bookmarks.TestBookmarks.test_can_pass_bookmark_into_next_session \ + tests.neo4j.test_bookmarks.TestBookmarks.test_can_pass_write_bookmark_into_write_session \ + tests.neo4j.test_bookmarks.TestBookmarks.test_fails_on_invalid_bookmark \ + tests.neo4j.test_bookmarks.TestBookmarks.test_fails_on_invalid_bookmark_using_tx_func \ + tests.neo4j.test_bookmarks.TestBookmarks.test_no_bookmark_after_rollback \ +\ + tests.neo4j.test_direct_driver.TestDirectDriver.test_custom_resolver \ + tests.neo4j.test_direct_driver.TestDirectDriver.test_fail_nicely_when_using_http_port \ + tests.neo4j.test_direct_driver.TestDirectDriver.test_multi_db \ + tests.neo4j.test_direct_driver.TestDirectDriver.test_multi_db_non_existing \ + tests.neo4j.test_direct_driver.TestDirectDriver.test_multi_db_various_databases \ + tests.neo4j.test_direct_driver.TestDirectDriver.test_supports_multi_db \ +\ + tests.neo4j.test_session_run.TestSessionRun.test_autocommit_transactions_should_support_metadata \ + tests.neo4j.test_session_run.TestSessionRun.test_can_return_node \ + tests.neo4j.test_session_run.TestSessionRun.test_can_return_path \ + tests.neo4j.test_session_run.TestSessionRun.test_can_return_relationship \ + tests.neo4j.test_session_run.TestSessionRun.test_fails_on_bad_syntax \ + tests.neo4j.test_session_run.TestSessionRun.test_fails_on_missing_parameter \ + tests.neo4j.test_session_run.TestSessionRun.test_iteration_larger_than_fetch_size \ + tests.neo4j.test_session_run.TestSessionRun.test_iteration_nested \ + tests.neo4j.test_session_run.TestSessionRun.test_iteration_smaller_than_fetch_size \ + tests.neo4j.test_session_run.TestSessionRun.test_long_string \ + tests.neo4j.test_session_run.TestSessionRun.test_partial_iteration \ + tests.neo4j.test_session_run.TestSessionRun.test_recover_from_invalid_query \ + tests.neo4j.test_session_run.TestSessionRun.test_regex_in_parameter \ + tests.neo4j.test_session_run.TestSessionRun.test_regex_inline \ + tests.neo4j.test_session_run.TestSessionRun.test_session_reuse \ + tests.neo4j.test_session_run.TestSessionRun.test_simple_query \ + tests.neo4j.test_session_run.TestSessionRun.test_updates_last_bookmark \ +\ + tests.neo4j.test_summary.TestSummary \ +\ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_client_exception_rolls_back_change \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_does_not_update_last_bookmark_on_rollback \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_iteration_nested \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_meta_data \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_parameter \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_simple_query \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_tx_func_configuration \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_tx_timeout \ + tests.neo4j.test_tx_func_run.TestTxFuncRun.test_updates_last_bookmark_on_commit \ + tests.neo4j.test_tx_run.TestTxRun.test_broken_transaction_should_not_break_session \ + tests.neo4j.test_tx_run.TestTxRun.test_can_commit_transaction \ + tests.neo4j.test_tx_run.TestTxRun.test_can_rollback_transaction \ + tests.neo4j.test_tx_run.TestTxRun.test_consume_after_commit \ + tests.neo4j.test_tx_run.TestTxRun.test_does_not_update_last_bookmark_on_failure \ + tests.neo4j.test_tx_run.TestTxRun.test_does_not_update_last_bookmark_on_rollback \ + tests.neo4j.test_tx_run.TestTxRun.test_parallel_queries \ + tests.neo4j.test_tx_run.TestTxRun.test_should_be_able_to_rollback_a_failure \ + tests.neo4j.test_tx_run.TestTxRun.test_should_not_allow_run_on_a_commited_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_not_allow_run_on_a_rollbacked_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_not_commit_a_commited_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_not_commit_a_failure \ + tests.neo4j.test_tx_run.TestTxRun.test_should_not_rollback_a_commited_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_not_rollback_a_rollbacked_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_not_run_valid_query_in_invalid_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_fail_run_in_a_commited_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_fail_run_in_a_rollbacked_tx \ + tests.neo4j.test_tx_run.TestTxRun.test_should_fail_to_run_query_for_invalid_bookmark \ + tests.neo4j.test_tx_run.TestTxRun.test_simple_query \ + tests.neo4j.test_tx_run.TestTxRun.test_tx_configuration \ + tests.neo4j.test_tx_run.TestTxRun.test_unconsumed_result \ + tests.neo4j.test_tx_run.TestTxRun.test_updates_last_bookmark_on_commit \ +\ + tests.stub.basic_query.test_basic_query.TestBasicQuery.test_4x4_populates_node_element_id_with_id \ + tests.stub.basic_query.test_basic_query.TestBasicQuery.test_4x4_populates_path_element_ids_with_long \ + tests.stub.basic_query.test_basic_query.TestBasicQuery.test_4x4_populates_rel_element_id_with_id \ + tests.stub.basic_query.test_basic_query.TestBasicQuery.test_5x0_populates_node_element_id_with_string \ + tests.stub.basic_query.test_basic_query.TestBasicQuery.test_5x0_populates_path_element_ids_with_string \ +\ + tests.stub.session_run.test_session_run.TestSessionRun.test_discard_on_session_close_unfinished_result \ + tests.stub.session_run.test_session_run.TestSessionRun.test_discard_on_session_close_untouched_result \ + tests.stub.session_run.test_session_run.TestSessionRun.test_no_discard_on_session_close_finished_result \ + tests.stub.session_run.test_session_run.TestSessionRun.test_raises_error_on_session_run \ +\ + tests.stub.bookmarks.test_bookmarks_v4.TestBookmarksV4.test_bookmarks_on_unused_sessions_are_returned \ + tests.stub.bookmarks.test_bookmarks_v4.TestBookmarksV4.test_bookmarks_session_run \ + tests.stub.bookmarks.test_bookmarks_v4.TestBookmarksV4.test_sequence_of_writing_and_reading_tx \ +\ + tests.stub.bookmarks.test_bookmarks_v5.TestBookmarksV5.test_bookmarks_can_be_set \ + tests.stub.bookmarks.test_bookmarks_v5.TestBookmarksV5.test_last_bookmark \ + tests.stub.bookmarks.test_bookmarks_v5.TestBookmarksV5.test_sequence_of_writing_and_reading_tx \ + tests.stub.bookmarks.test_bookmarks_v5.TestBookmarksV5.test_send_and_receive_bookmarks_write_tx \ + tests.stub.bookmarks.test_bookmarks_v5.TestBookmarksV5.test_send_and_receive_multiple_bookmarks_write_tx + +EXIT_CODE=$? + +echo "" +if [ $EXIT_CODE -eq 0 ]; then + echo "╔════════════════════════════════════════════════════════════════════════════╗" + echo "║ ✓ ALL TESTS PASSED ║" + echo "╚════════════════════════════════════════════════════════════════════════════╝" +else + echo "╔════════════════════════════════════════════════════════════════════════════╗" + echo "║ ✗ SOME TESTS FAILED ║" + echo "╚════════════════════════════════════════════════════════════════════════════╝" +fi +echo "" exit $EXIT_CODE - diff --git a/tests/Integration/Neo4jLoggerTest.php b/tests/Integration/Neo4jLoggerTest.php index 45411b0c..58df8bd4 100644 --- a/tests/Integration/Neo4jLoggerTest.php +++ b/tests/Integration/Neo4jLoggerTest.php @@ -62,7 +62,7 @@ public function testLogger(): void $expectedDebug = [ ['HELLO', ['user_agent' => 'neo4j-php-client/2']], ['LOGON', ['scheme' => 'basic', 'principal' => 'neo4j']], - ['RUN', ['text' => 'RETURN 1 as test', 'parameters' => [], 'extra' => ['mode' => 'w']]], + ['RUN', ['text' => 'RETURN 1 as test', 'parameters' => [], 'extra' => []]], ['DISCARD', []], ]; if ($this->getUri()->getScheme() === 'neo4j') { @@ -70,6 +70,7 @@ public function testLogger(): void ['HELLO', ['user_agent' => 'neo4j-php-client/2']], ['LOGON', ['scheme' => 'basic', 'principal' => 'neo4j']], ['ROUTE', ['db' => null]], + ['DISCARD', []], ['GOODBYE', []], ]); }