clear(); }); it('executes successfully and returns new credentials', function () use ($repository): void { // GIVEN $credentialGenerator = Mockery::mock(ClientCredentialGenerator::class); $dispatcher = Mockery::mock(DomainEventDispatcher::class); $usecase = new RegenerateClientSecret( $repository, $credentialGenerator, $dispatcher ); $clientId = new ClientId(Uuid::uuid7()); $input = new Input($clientId); $clientIdentifier = new ClientIdentifier('arcadia_id_' . str_repeat('a', 32)); $oldSecret = new ClientSecret('arcadia_sec_' . str_repeat('b', 86)); $newSecret = new ClientSecret('arcadia_sec_' . str_repeat('c', 86)); $client = Client::hydrate( id: $clientId, name: new ClientName('Test Client'), identifier: $clientIdentifier, secret: $oldSecret, isActive: true, updatedAt: new \DateTimeImmutable(), ); $repository->add($client); $credentialGenerator->allows('generateSecret') ->andReturn($newSecret); $dispatcher->allows('dispatch'); // WHEN $result = $usecase->execute($input); // THEN expect($result)->toBeInstanceOf(Output::class) ->and($result->newSecret)->toBe($newSecret) ->and($result->clientIdentifier)->toBe($clientIdentifier) ->and($repository->find($clientId)?->secret)->toBe($newSecret); }); it('throws ClientNotFoundException when client does not exist', function () use ($repository): void { // GIVEN $credentialGenerator = Mockery::mock(ClientCredentialGenerator::class); $dispatcher = Mockery::mock(DomainEventDispatcher::class); $usecase = new RegenerateClientSecret( $repository, $credentialGenerator, $dispatcher ); $clientId = new ClientId(Uuid::uuid7()); $input = new Input($clientId); // WHEN $execution = fn () => $usecase->execute($input); // THEN expect($execution)->toThrow(ClientNotFoundException::class); }); });