diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 73bbf9d6..365428c8 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -109,12 +109,23 @@ + + + namespace]]> + + excludeCalendarList]]> excludeCalendarList]]> + + + namespace]]> + namespace]]> + + getSuccess()]]> diff --git a/src/Client/Schedule/ScheduleOptions.php b/src/Client/Schedule/ScheduleOptions.php index ffdbb0d2..247b8a9f 100644 --- a/src/Client/Schedule/ScheduleOptions.php +++ b/src/Client/Schedule/ScheduleOptions.php @@ -16,20 +16,23 @@ final class ScheduleOptions { use CloneWith; - public readonly string $namespace; - public readonly bool $triggerImmediately; + /** + * @deprecated will be removed in the next major version. + */ + public readonly ?string $namespace; /** * @var list */ public readonly array $backfills; + public readonly bool $triggerImmediately; public readonly EncodedCollection $memo; public readonly EncodedCollection $searchAttributes; private function __construct() { - $this->namespace = 'default'; + $this->namespace = null; $this->triggerImmediately = false; $this->backfills = []; $this->memo = EncodedCollection::empty(); @@ -41,6 +44,10 @@ public static function new(): self return new self(); } + /** + * @deprecated Configure the namespace on the {@see \Temporal\Client\ClientOptions} instead + * when creating the {@see \Temporal\Client\ScheduleClient}. + */ public function withNamespace(string $namespace): self { /** @see self::$namespace */ diff --git a/src/Client/ScheduleClient.php b/src/Client/ScheduleClient.php index aebeb5a3..94c2a9d1 100644 --- a/src/Client/ScheduleClient.php +++ b/src/Client/ScheduleClient.php @@ -81,7 +81,7 @@ public function createSchedule( $request = new CreateScheduleRequest(); $request ->setRequestId(Uuid::v4()) - ->setNamespace($options->namespace) + ->setNamespace($options->namespace ?? $this->clientOptions->namespace) ->setScheduleId($scheduleId) ->setIdentity($this->clientOptions->identity); @@ -123,7 +123,7 @@ public function createSchedule( $this->converter, $this->marshaller, $this->protoConverter, - $options->namespace, + $options->namespace ?? $this->clientOptions->namespace, $scheduleId, ); } diff --git a/tests/Unit/Schedule/ScheduleClientTestCase.php b/tests/Unit/Schedule/ScheduleClientTestCase.php index 66cfbd55..af692a6b 100644 --- a/tests/Unit/Schedule/ScheduleClientTestCase.php +++ b/tests/Unit/Schedule/ScheduleClientTestCase.php @@ -17,6 +17,7 @@ use Temporal\Client\Schedule\Policy\ScheduleOverlapPolicy; use Temporal\Client\Schedule\Policy\SchedulePolicies; use Temporal\Client\Schedule\Schedule; +use Temporal\Client\Schedule\ScheduleOptions; use Temporal\Client\Schedule\Spec\CalendarSpec; use Temporal\Client\Schedule\Spec\Range; use Temporal\Client\Schedule\Spec\ScheduleSpec; @@ -63,6 +64,59 @@ public function testCreateSchedule(): void ); } + public function testCreateScheduleNamespaceFromOptions(): void + { + $testContext = new class { + public CreateScheduleRequest $request; + }; + // Prepare mocks + $clientMock = $this->createMock(ServiceClientInterface::class); + $clientMock->expects($this->once()) + ->method('CreateSchedule') + ->with($this->callback(fn(CreateScheduleRequest $request) => $testContext->request = $request or true)) + ->willReturn((new CreateScheduleResponse())->setConflictToken('test-conflict-token')); + $scheduleClient = $this->createScheduleClient( + client: $clientMock, + ); + $scheduleDto = $this->getScheduleDto(); + + $scheduleClient->createSchedule( + $scheduleDto, + options: ScheduleOptions::new()->withNamespace('test-namespace'), + scheduleId: 'test-id', + ); + + $this->assertTrue(isset($testContext->request)); + $this->assertSame('test-namespace', $testContext->request->getNamespace()); + } + + public function testCreateScheduleNamespaceFromServiceClient(): void + { + $testContext = new class { + public CreateScheduleRequest $request; + }; + // Prepare mocks + $clientMock = $this->createMock(ServiceClientInterface::class); + $clientMock->expects($this->once()) + ->method('CreateSchedule') + ->with($this->callback(fn(CreateScheduleRequest $request) => $testContext->request = $request or true)) + ->willReturn((new CreateScheduleResponse())->setConflictToken('test-conflict-token')); + $scheduleClient = $this->createScheduleClient( + client: $clientMock, + clientOptions: (new ClientOptions())->withNamespace('test-namespace'), + ); + $scheduleDto = $this->getScheduleDto(); + + $scheduleClient->createSchedule( + $scheduleDto, + options: ScheduleOptions::new(), + scheduleId: 'test-id', + ); + + $this->assertTrue(isset($testContext->request)); + $this->assertSame('test-namespace', $testContext->request->getNamespace()); + } + public function testCreateScheduleWithoutWorkflowId(): void { $testContext = new class { diff --git a/tests/Unit/Schedule/ScheduleOptionsTestCase.php b/tests/Unit/Schedule/ScheduleOptionsTestCase.php index 923e75f6..cbb59e11 100644 --- a/tests/Unit/Schedule/ScheduleOptionsTestCase.php +++ b/tests/Unit/Schedule/ScheduleOptionsTestCase.php @@ -22,7 +22,7 @@ public function testWithNamespace(): void $new = $init->withNamespace('foo'); $this->assertNotSame($init, $new, 'immutable method clones object'); - $this->assertSame('default', $init->namespace, 'default value was not changed'); + $this->assertNull($init->namespace, 'default value was not changed'); $this->assertSame('foo', $new->namespace); }