From d19f56424288a2f2ead9e3212495c74283de8ef0 Mon Sep 17 00:00:00 2001 From: Yash Sahu <54198301+yash30201@users.noreply.github.com> Date: Wed, 15 May 2024 15:04:04 +0530 Subject: [PATCH] Upgrade BeginTransaction API (#7313) * Enable credential config settings * Upgrade BatchGetDocuments API and their tests * Update migration guide for BatchGetDocuments * Update documentation for BeginTransaction API * Upgrade BeginTransaction API + testing * Self Review --- Firestore/src/FirestoreClient.php | 36 ++-- Firestore/src/FirestoreSessionHandler.php | 28 ++- Firestore/src/test.php | 3 - .../tests/Snippet/FirestoreClientTest.php | 10 +- .../Snippet/FirestoreSessionHandlerTest.php | 40 ++-- Firestore/tests/Snippet/TransactionTest.php | 16 +- Firestore/tests/Unit/ConformanceTest.php | 2 +- Firestore/tests/Unit/FirestoreClientTest.php | 69 +++++-- .../Unit/FirestoreSessionHandlerTest.php | 174 +++++++++++++----- 9 files changed, 273 insertions(+), 105 deletions(-) delete mode 100644 Firestore/src/test.php diff --git a/Firestore/src/FirestoreClient.php b/Firestore/src/FirestoreClient.php index 42b28b65633..cca896cd911 100644 --- a/Firestore/src/FirestoreClient.php +++ b/Firestore/src/FirestoreClient.php @@ -33,7 +33,8 @@ use Google\Cloud\Core\Retry; use Google\Cloud\Core\ValidateTrait; use Google\Cloud\Firestore\Connection\Grpc; -use Google\Cloud\Firestore\V1\Client\FirestoreClient as ClientFirestoreClient; +use Google\Cloud\Firestore\V1\BeginTransactionRequest; +use Google\Cloud\Firestore\V1\Client\FirestoreClient as V1FirestoreClient; use Psr\Cache\CacheItemPoolInterface; use Psr\Http\Message\StreamInterface; @@ -93,14 +94,6 @@ class FirestoreClient const MAX_RETRIES = 5; - /** - * Keeping this consistent with veneer libraries where - * multiple clients are present. - */ - private const GAPIC_KEYS = [ - ClientFirestoreClient::class - ]; - /** * @var Connection\ConnectionInterface * @internal @@ -215,7 +208,7 @@ public function __construct(array $config = []) $this->requestHandler = new RequestHandler( $this->serializer, - self::GAPIC_KEYS, + [V1FirestoreClient::class], $config ); @@ -573,9 +566,9 @@ public function collectionGroup($id) * ``` * * @codingStandardsIgnoreStart - * @see https://cloud.google.com/firestore/docs/reference/rpc/google.firestore.v1beta1#google.firestore.v1beta1.Firestore.BeginTransaction BeginTransaction - * @see https://cloud.google.com/firestore/docs/reference/rpc/google.firestore.v1beta1#google.firestore.v1beta1.Firestore.Commit Commit - * @see https://cloud.google.com/firestore/docs/reference/rpc/google.firestore.v1beta1#google.firestore.v1beta1.Firestore.Rollback Rollback + * @see https://cloud.google.com/firestore/docs/reference/rpc/google.firestore.v1#google.firestore.v1.Firestore.BeginTransaction BeginTransaction + * @see https://cloud.google.com/firestore/docs/reference/rpc/google.firestore.v1#google.firestore.v1.Firestore.Commit Commit + * @see https://cloud.google.com/firestore/docs/reference/rpc/google.firestore.v1#google.firestore.v1.Firestore.Rollback Rollback * @codingStandardsIgnoreEnd * * @param callable $callable A callable function, allowing atomic operations @@ -631,10 +624,19 @@ public function runTransaction(callable $callable, array $options = []) ) use (&$transactionId) { $database = $this->databaseName($this->projectId, $this->database); - $beginTransaction = $this->connection->beginTransaction(array_filter([ - 'database' => $database, - 'retryTransaction' => $transactionId, - ]) + $options['begin']); + list($data, $optionalArgs) = $this->splitOptionalArgs($options['begin']); + if ($transactionId) { + $data['options']['readWrite']['retryTransaction'] = $transactionId; + } + $data['database'] = $database; + + $request = $this->serializer->decodeMessage(new BeginTransactionRequest(), $data); + $beginTransaction = $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + $request, + $optionalArgs + ); $transactionId = $beginTransaction['transaction']; diff --git a/Firestore/src/FirestoreSessionHandler.php b/Firestore/src/FirestoreSessionHandler.php index 45ec4961cc2..73699e104ce 100644 --- a/Firestore/src/FirestoreSessionHandler.php +++ b/Firestore/src/FirestoreSessionHandler.php @@ -21,6 +21,8 @@ use Google\Cloud\Core\RequestHandler; use SessionHandlerInterface; use Google\Cloud\Firestore\Connection\ConnectionInterface; +use Google\Cloud\Firestore\V1\BeginTransactionRequest; +use Google\Cloud\Firestore\V1\Client\FirestoreClient as V1FirestoreClient; /** * Custom session handler backed by Cloud Firestore. @@ -242,9 +244,16 @@ public function open($savePath, $sessionName) $database = $this->databaseName($this->projectId, $this->database); try { - $beginTransaction = $this->connection->beginTransaction([ - 'database' => $database - ] + $this->options['begin']); + list($data, $optionalArgs) = $this->splitOptionalArgs($this->options['begin']); + $data['database'] = $database; + + $request = $this->serializer->decodeMessage(new BeginTransactionRequest(), $data); + $beginTransaction = $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + $request, + $optionalArgs + ); } catch (ServiceException $e) { trigger_error( sprintf('Firestore beginTransaction failed: %s', $e->getMessage()), @@ -385,9 +394,16 @@ public function gc($maxlifetime) $deleteCount = 0; try { $database = $this->databaseName($this->projectId, $this->database); - $beginTransaction = $this->connection->beginTransaction([ - 'database' => $database - ] + $this->options['begin']); + list($data, $optionalArgs) = $this->splitOptionalArgs($this->options['begin']); + $data['database'] = $database; + + $request = $this->serializer->decodeMessage(new BeginTransactionRequest(), $data); + $beginTransaction = $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + $request, + $optionalArgs + ); $transaction = new Transaction( $this->connection, diff --git a/Firestore/src/test.php b/Firestore/src/test.php deleted file mode 100644 index 6c8c4f51b94..00000000000 --- a/Firestore/src/test.php +++ /dev/null @@ -1,3 +0,0 @@ -connection->beginTransaction(Argument::any()) - ->shouldBeCalled() - ->willReturn(['transaction' => 'foo']); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::type(BeginTransactionRequest::class), + Argument::cetera() + )->shouldBeCalled()->willReturn(['transaction' => 'foo']); $this->requestHandler->sendRequest( V1FirestoreClient::class, diff --git a/Firestore/tests/Snippet/FirestoreSessionHandlerTest.php b/Firestore/tests/Snippet/FirestoreSessionHandlerTest.php index 9727b651207..2e73a16f059 100644 --- a/Firestore/tests/Snippet/FirestoreSessionHandlerTest.php +++ b/Firestore/tests/Snippet/FirestoreSessionHandlerTest.php @@ -26,6 +26,7 @@ use Google\Cloud\Firestore\FirestoreClient; use Google\Cloud\Firestore\FirestoreSessionHandler; use Google\Cloud\Firestore\V1\BatchGetDocumentsRequest; +use Google\Cloud\Firestore\V1\BeginTransactionRequest; use Google\Cloud\Firestore\V1\Client\FirestoreClient as V1FirestoreClient; use Prophecy\Argument; use Prophecy\PhpUnit\ProphecyTrait; @@ -93,11 +94,14 @@ public function testClass() ] ])); - $this->connection->beginTransaction(Argument::any()) - ->shouldBeCalled() - ->willReturn([ - 'transaction' => self::TRANSACTION - ]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::type(BeginTransactionRequest::class), + Argument::cetera() + )->shouldBeCalled()->willReturn([ + 'transaction' => self::TRANSACTION + ]); $value = 'name|' . serialize('Bob'); $this->connection->commit(Argument::allOf( @@ -139,11 +143,14 @@ public function testSessionHandlerMethod() ] ])); - $this->connection->beginTransaction(Argument::any()) - ->shouldBeCalled() - ->willReturn([ - 'transaction' => self::TRANSACTION - ]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::type(BeginTransactionRequest::class), + Argument::cetera() + )->shouldBeCalled()->willReturn([ + 'transaction' => self::TRANSACTION + ]); $value = 'name|' . serialize('Bob'); $this->connection->commit(Argument::allOf( @@ -188,11 +195,14 @@ public function testClassErrorHandler() ] ])); - $this->connection->beginTransaction(Argument::any()) - ->shouldBeCalled() - ->willReturn([ - 'transaction' => self::TRANSACTION - ]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::type(BeginTransactionRequest::class), + Argument::cetera() + )->shouldBeCalled()->willReturn([ + 'transaction' => self::TRANSACTION + ]); $this->connection->commit(Argument::any()) ->shouldBeCalled() diff --git a/Firestore/tests/Snippet/TransactionTest.php b/Firestore/tests/Snippet/TransactionTest.php index ff802356911..eb29e449d58 100644 --- a/Firestore/tests/Snippet/TransactionTest.php +++ b/Firestore/tests/Snippet/TransactionTest.php @@ -36,6 +36,7 @@ use Google\Cloud\Firestore\QuerySnapshot; use Google\Cloud\Firestore\Transaction; use Google\Cloud\Firestore\V1\BatchGetDocumentsRequest; +use Google\Cloud\Firestore\V1\BeginTransactionRequest; use Google\Cloud\Firestore\V1\Client\FirestoreClient as V1FirestoreClient; use Google\Cloud\Firestore\ValueMapper; use Google\Cloud\Firestore\WriteBatch; @@ -95,14 +96,21 @@ public function testClass() { $this->checkAndSkipGrpcTests(); - $this->connection->beginTransaction(Argument::any()) - ->shouldBeCalled() - ->willReturn(['transaction' => self::TRANSACTION]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::type(BeginTransactionRequest::class), + Argument::cetera() + )->shouldBeCalled()->willReturn(['transaction' => self::TRANSACTION]); $this->connection->rollback(Argument::any()) ->shouldBeCalled(); - $client = TestHelpers::stub(FirestoreClient::class); + $client = TestHelpers::stub(FirestoreClient::class, [], [ + 'connection', + 'requestHandler' + ]); + $client->___setProperty('requestHandler', $this->requestHandler->reveal()); $client->___setProperty('connection', $this->connection->reveal()); $snippet = $this->snippetFromClass(Transaction::class); diff --git a/Firestore/tests/Unit/ConformanceTest.php b/Firestore/tests/Unit/ConformanceTest.php index ab6fa8dccff..eda6620878d 100644 --- a/Firestore/tests/Unit/ConformanceTest.php +++ b/Firestore/tests/Unit/ConformanceTest.php @@ -91,7 +91,7 @@ public function setUp(): void [ 'projectId' => 'projectID' ] - ], ['requestHandler']); + ], ['requestHandler', 'connection']); $this->connection = $this->prophesize(ConnectionInterface::class); $this->requestHandler = $this->prophesize(RequestHandler::class); diff --git a/Firestore/tests/Unit/FirestoreClientTest.php b/Firestore/tests/Unit/FirestoreClientTest.php index 165150731f7..6c7d02d724d 100644 --- a/Firestore/tests/Unit/FirestoreClientTest.php +++ b/Firestore/tests/Unit/FirestoreClientTest.php @@ -33,7 +33,9 @@ use Google\Cloud\Firestore\FirestoreClient; use Google\Cloud\Firestore\FirestoreSessionHandler; use Google\Cloud\Firestore\Query; +use Google\Cloud\Firestore\V1\BeginTransactionRequest; use Google\Cloud\Firestore\V1\Client\FirestoreClient as V1FirestoreClient; +use Google\Cloud\Firestore\V1\FirestoreClient as V1FirestoreGapicClient; use Google\Cloud\Firestore\WriteBatch; use InvalidArgumentException; use PHPUnit\Framework\TestCase; @@ -390,9 +392,15 @@ public function testRunTransaction() $transactionId = 'foobar'; $timestamp = new Timestamp(new \DateTimeImmutable); - $this->connection->beginTransaction([ - 'database' => 'projects/'. self::PROJECT .'/databases/'. self::DATABASE - ])->shouldBeCalled()->willReturn([ + $databaseName = V1FirestoreGapicClient::databaseRootName(self::PROJECT, self::DATABASE); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) use ($databaseName) { + return $request->getDatabase() == $databaseName; + }), + Argument::cetera() + )->shouldBeCalled()->willReturn([ 'transaction' => $transactionId ]); @@ -402,6 +410,7 @@ public function testRunTransaction() ])->shouldBeCalled(); $this->client->___setProperty('connection', $this->connection->reveal()); + $this->client->___setProperty('requestHandler', $this->requestHandler->reveal()); $this->client->runTransaction($this->noop()); } @@ -412,12 +421,24 @@ public function testRunTransactionRetryable() $transactionId2 = 'barfoo'; $timestamp = new Timestamp(new \DateTimeImmutable); - $this->connection->beginTransaction([ - 'database' => 'projects/'. self::PROJECT .'/databases/'. self::DATABASE - ])->shouldBeCalled()->will(function ($args, $mock) use ($transactionId, $transactionId2) { - $mock->beginTransaction(Argument::withEntry('retryTransaction', $transactionId))->willReturn([ - 'transaction' => $transactionId2 - ]); + $databaseName = V1FirestoreGapicClient::databaseRootName(self::PROJECT, self::DATABASE); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) use ($databaseName) { + return $request->getDatabase() == $databaseName + && !$request->hasOptions(); + }), + Argument::cetera() + )->shouldBeCalledOnce()->will(function ($args, $mock) use ($transactionId, $transactionId2) { + $mock->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($req) use ($transactionId) { + return $req->getOptions()->getReadWrite()->getRetryTransaction() == $transactionId; + }), + Argument::cetera() + )->willReturn(['transaction' => $transactionId2]); return [ 'transaction' => $transactionId @@ -444,6 +465,7 @@ public function testRunTransactionRetryable() ])->shouldBeCalledTimes(1); $this->client->___setProperty('connection', $this->connection->reveal()); + $this->client->___setProperty('requestHandler', $this->requestHandler->reveal()); $res = $this->client->runTransaction(function ($t) { $doc = $this->prophesize(DocumentReference::class); @@ -463,9 +485,15 @@ public function testRunTransactionNotRetryable() $transactionId = 'foobar'; $timestamp = new Timestamp(new \DateTimeImmutable); - $this->connection->beginTransaction([ - 'database' => 'projects/'. self::PROJECT .'/databases/'. self::DATABASE - ])->shouldBeCalled()->willReturn([ + $databaseName = V1FirestoreGapicClient::databaseRootName(self::PROJECT, self::DATABASE); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) use ($databaseName) { + return $request->getDatabase() == $databaseName; + }), + Argument::cetera() + )->shouldBeCalled()->willReturn([ 'transaction' => $transactionId ]); @@ -477,6 +505,7 @@ public function testRunTransactionNotRetryable() ])->shouldBeCalledTimes(1); $this->client->___setProperty('connection', $this->connection->reveal()); + $this->client->___setProperty('requestHandler', $this->requestHandler->reveal()); $res = $this->client->runTransaction(function ($t) { throw new \RangeException('foo'); @@ -490,7 +519,12 @@ public function testRunTransactionExceedsMaxRetries() $transactionId = 'foobar'; $timestamp = new Timestamp(new \DateTimeImmutable); - $this->connection->beginTransaction(Argument::any())->shouldBeCalledTimes(6)->willReturn([ + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::type(BeginTransactionRequest::class), + Argument::cetera() + )->shouldBeCalledTimes(6)->willReturn([ 'transaction' => $transactionId ]); @@ -501,6 +535,7 @@ public function testRunTransactionExceedsMaxRetries() $this->connection->rollback(Argument::any())->shouldBeCalledTimes(6); $this->client->___setProperty('connection', $this->connection->reveal()); + $this->client->___setProperty('requestHandler', $this->requestHandler->reveal()); $res = $this->client->runTransaction(function ($t) { $doc = $this->prophesize(DocumentReference::class); @@ -516,7 +551,12 @@ public function testRunTransactionExceedsMaxRetriesLowerLimit() $transactionId = 'foobar'; $timestamp = new Timestamp(new \DateTimeImmutable); - $this->connection->beginTransaction(Argument::any())->shouldBeCalledTimes(3)->willReturn([ + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::type(BeginTransactionRequest::class), + Argument::cetera() + )->shouldBeCalledTimes(3)->willReturn([ 'transaction' => $transactionId ]); @@ -527,6 +567,7 @@ public function testRunTransactionExceedsMaxRetriesLowerLimit() $this->connection->rollback(Argument::any())->shouldBeCalledTimes(3); $this->client->___setProperty('connection', $this->connection->reveal()); + $this->client->___setProperty('requestHandler', $this->requestHandler->reveal()); $res = $this->client->runTransaction(function ($t) { $doc = $this->prophesize(DocumentReference::class); diff --git a/Firestore/tests/Unit/FirestoreSessionHandlerTest.php b/Firestore/tests/Unit/FirestoreSessionHandlerTest.php index fca21cc0ec9..f3cd6653603 100644 --- a/Firestore/tests/Unit/FirestoreSessionHandlerTest.php +++ b/Firestore/tests/Unit/FirestoreSessionHandlerTest.php @@ -26,6 +26,7 @@ use Google\Cloud\Firestore\FirestoreSessionHandler; use Google\Cloud\Firestore\V1\BatchGetDocumentsRequest; use Google\Cloud\Firestore\V1\Client\FirestoreClient as V1FirestoreClient; +use Google\Cloud\Firestore\V1\FirestoreClient as V1FirestoreGapicClient; use InvalidArgumentException; use Iterator; use PHPUnit\Framework\TestCase; @@ -63,9 +64,15 @@ public function setUp(): void public function testOpen() { - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => null]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => null]); + $firestoreSessionHandler = new FirestoreSessionHandler( $this->connection->reveal(), $this->requestHandler->reveal(), @@ -82,9 +89,15 @@ public function testOpenWithException() { $this->expectWarningUsingErrorhandler(); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willThrow(new ServiceException('')); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willThrow(new ServiceException('')); + $firestoreSessionHandler = new FirestoreSessionHandler( $this->connection->reveal(), $this->requestHandler->reveal(), @@ -101,9 +114,15 @@ public function testReadNotAllowed() { $this->expectException(InvalidArgumentException::class); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => null]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => null]); + $firestoreSessionHandler = new FirestoreSessionHandler( $this->connection->reveal(), $this->requestHandler->reveal(), @@ -118,9 +137,15 @@ public function testReadNotAllowed() public function testClose() { - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => 123]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => 123]); + $this->connection->rollback(Argument::any()) ->shouldBeCalledTimes(1); $firestoreSessionHandler = new FirestoreSessionHandler( @@ -141,9 +166,16 @@ public function testReadNothing() $this->documents->current() ->shouldBeCalledTimes(1) ->willReturn(null); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => null]); + + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => null]); + $this->requestHandler->sendRequest( V1FirestoreClient::class, 'batchGetDocuments', @@ -173,9 +205,15 @@ public function testReadWithException() { $this->expectWarningUsingErrorhandler(); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => null]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => null]); + $this->requestHandler->sendRequest( V1FirestoreClient::class, 'batchGetDocuments', @@ -216,9 +254,16 @@ public function testReadEntity() $this->valueMapper->decodeValues(['data' => 'sessiondata']) ->shouldBeCalledTimes(1) ->willReturn(['data' => 'sessiondata']); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => null]); + + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => null]); + $this->requestHandler->sendRequest( V1FirestoreClient::class, 'batchGetDocuments', @@ -254,9 +299,16 @@ public function testWrite() $phpunit->assertTrue(is_int($args[0]['t'])); return ['data' => ['stringValue' => 'sessiondata']]; }); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => null]); + + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => null]); + $this->connection->commit([ 'database' => $this->dbName(), 'writes' => [ @@ -297,9 +349,16 @@ public function testWriteWithException() $phpunit->assertTrue(is_int($args[0]['t'])); return ['data' => ['stringValue' => 'sessiondata']]; }); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => 123]); + + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => 123]); + $this->connection->rollback([ 'database' => $this->dbName(), 'transaction' => 123 @@ -326,9 +385,15 @@ public function testWriteWithException() public function testDestroy() { - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => 123]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => 123]); + $this->connection->commit([ 'database' => $this->dbName(), 'writes' => [ @@ -358,9 +423,15 @@ public function testDestroyWithException() { $this->expectWarningUsingErrorhandler(); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => 123]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => 123]); + $this->connection->commit(Argument::any()) ->shouldBeCalledTimes(1) ->willThrow(new ServiceException('')); @@ -386,9 +457,15 @@ public function testDestroyWithException() public function testDefaultGcDoesNothing() { - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(1) - ->willReturn(['transaction' => 123]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(1)->willReturn(['transaction' => 123]); + $this->connection->commit()->shouldNotBeCalled(); $firestoreSessionHandler = new FirestoreSessionHandler( $this->connection->reveal(), @@ -423,9 +500,16 @@ public function testGc() ]); $this->documents->next() ->shouldBeCalledTimes(1); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(2) - ->willReturn(['transaction' => 123]); + + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(2)->willReturn(['transaction' => 123]); + $this->connection->runQuery(Argument::any()) ->shouldBeCalledTimes(1) ->will(function ($args) use ($phpunit) { @@ -477,9 +561,15 @@ public function testGcWithException() { $this->expectWarningUsingErrorhandler(); - $this->connection->beginTransaction(['database' => $this->dbName()]) - ->shouldBeCalledTimes(2) - ->willReturn(['transaction' => 123]); + $this->requestHandler->sendRequest( + V1FirestoreClient::class, + 'beginTransaction', + Argument::that(function ($request) { + return $request->getDatabase() == $this->dbName(); + }), + Argument::cetera() + )->shouldBeCalledTimes(2)->willReturn(['transaction' => 123]); + $this->connection->runQuery(Argument::any()) ->shouldBeCalledTimes(1) ->willThrow(new ServiceException(''));