diff --git a/src/Common/Validator/RequestValidator.php b/src/Common/Validator/RequestValidator.php index c0aed04..36b2ff8 100644 --- a/src/Common/Validator/RequestValidator.php +++ b/src/Common/Validator/RequestValidator.php @@ -29,18 +29,9 @@ public function validate(Request $request, string $dtoClass): RequestInterface } $routeParams = $request->attributes->get('_route_params') ?? []; - if (isset($routeParams['subscriberId'])) { - $routeParams['subscriberId'] = (int) $routeParams['subscriberId']; - } - if (isset($routeParams['messageId'])) { - $routeParams['messageId'] = (int) $routeParams['messageId']; - } if (isset($routeParams['listId'])) { $routeParams['listId'] = (int) $routeParams['listId']; } - if (isset($routeParams['administratorId'])) { - $routeParams['administratorId'] = (int) $routeParams['administratorId']; - } $data = array_merge($routeParams, $body ?? []); diff --git a/src/Identity/Controller/AdminAttributeValueController.php b/src/Identity/Controller/AdminAttributeValueController.php index 573608b..b8e1b5a 100644 --- a/src/Identity/Controller/AdminAttributeValueController.php +++ b/src/Identity/Controller/AdminAttributeValueController.php @@ -22,7 +22,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; -#[Route('/administrators/attribute-values', name: 'admin_attribute_value_')] +#[Route('/administrators', name: 'admin_attribute_value_')] class AdminAttributeValueController extends BaseController { private AdminAttributeManager $attributeManager; @@ -46,13 +46,13 @@ public function __construct( } #[Route( - path: '/{adminId}/{definitionId}', + path: '/{adminId}/attributes/{definitionId}', name: 'create', requirements: ['adminId' => '\d+', 'definitionId' => '\d+'], methods: ['POST', 'PUT'], )] #[OA\Post( - path: '/api/v2/administrators/attribute-values/{adminId}/{definitionId}', + path: '/api/v2/administrators/{adminId}/attributes/{definitionId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Returns created/updated admin attribute.', summary: 'Create/update an admin attribute.', @@ -133,13 +133,13 @@ public function createOrUpdate( } #[Route( - path: '/{adminId}/{definitionId}', + path: '/{adminId}/attributes/{definitionId}', name: 'delete', requirements: ['adminId' => '\d+', 'definitionId' => '\d+'], methods: ['DELETE'], )] #[OA\Delete( - path: '/api/v2/administrators/attribute-values/{adminId}/{definitionId}', + path: '/api/v2/administrators/{adminId}/attributes/{definitionId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Deletes a single admin attribute.', summary: 'Deletes an attribute.', @@ -203,9 +203,9 @@ public function delete( return $this->json(null, Response::HTTP_NO_CONTENT); } - #[Route('/{adminId}', name: 'get__list', requirements: ['adminId' => '\d+'], methods: ['GET'])] + #[Route('/{adminId}/attributes', name: 'get_list', requirements: ['adminId' => '\d+'], methods: ['GET'])] #[OA\Get( - path: '/api/v2/administrators/attribute-values/{adminId}', + path: '/api/v2/administrators/{adminId}/attributes', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Returns a JSON list of all admin attributes.', summary: 'Gets a list of all admin attributes.', @@ -260,6 +260,11 @@ public function delete( response: 403, description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') + ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') ) ] )] @@ -276,18 +281,18 @@ public function getPaginated( return $this->json( $this->paginatedDataProvider->getPaginatedList( - $request, - $this->normalizer, - AdminAttributeValue::class, - $filter + request: $request, + normalizer:$this->normalizer, + className: AdminAttributeValue::class, + filter: $filter ), Response::HTTP_OK ); } - #[Route('/{adminId}/{definitionId}', name: 'get_one', methods: ['GET'])] + #[Route('/{adminId}/attributes/{definitionId}', name: 'get_one', methods: ['GET'])] #[OA\Get( - path: '/api/v2/administrators/attribute-values/{adminId}/{definitionId}', + path: '/api/v2/administrators/{adminId}/attributes/{definitionId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Returns a single attribute.', summary: 'Gets admin attribute.', @@ -355,8 +360,6 @@ public function getAttributeDefinition( adminId: $admin->getId(), attributeDefinitionId: $definition->getId() ); - $this->attributeManager->delete($attribute); - $this->entityManager->flush(); return $this->json( $this->normalizer->normalize($attribute), diff --git a/src/Identity/Controller/AdministratorController.php b/src/Identity/Controller/AdministratorController.php index 365cf12..c1f173f 100644 --- a/src/Identity/Controller/AdministratorController.php +++ b/src/Identity/Controller/AdministratorController.php @@ -157,16 +157,16 @@ public function createAdministrator( return $this->json($json, Response::HTTP_CREATED); } - #[Route('/{administratorId}', name: 'get_one', requirements: ['administratorId' => '\d+'], methods: ['GET'])] + #[Route('/{adminId}', name: 'get_one', requirements: ['adminId' => '\d+'], methods: ['GET'])] #[OA\Get( - path: '/api/v2/administrators/{administratorId}', + path: '/api/v2/administrators/{adminId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Get administrator by ID.', summary: 'Get Administrator', tags: ['administrators'], parameters: [ new OA\Parameter( - name: 'administratorId', + name: 'adminId', description: 'Administrator ID', in: 'path', required: true, @@ -194,7 +194,7 @@ public function createAdministrator( )] public function getAdministrator( Request $request, - #[MapEntity(mapping: ['administratorId' => 'id'])] ?Administrator $administrator, + #[MapEntity(mapping: ['adminId' => 'id'])] ?Administrator $administrator, ): JsonResponse { $this->requireAuthentication($request); @@ -206,9 +206,9 @@ public function getAdministrator( return $this->json($json, Response::HTTP_OK); } - #[Route('/{administratorId}', name: 'update', requirements: ['administratorId' => '\d+'], methods: ['PUT'])] + #[Route('/{adminId}', name: 'update', requirements: ['adminId' => '\d+'], methods: ['PUT'])] #[OA\Put( - path: '/api/v2/administrators/{administratorId}', + path: '/api/v2/administrators/{adminId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Update an administrator.', summary: 'Update Administrator', @@ -220,7 +220,7 @@ public function getAdministrator( tags: ['administrators'], parameters: [ new OA\Parameter( - name: 'administratorId', + name: 'adminId', description: 'Administrator ID', in: 'path', required: true, @@ -248,7 +248,7 @@ public function getAdministrator( )] public function updateAdministrator( Request $request, - #[MapEntity(mapping: ['administratorId' => 'id'])] ?Administrator $administrator, + #[MapEntity(mapping: ['adminId' => 'id'])] ?Administrator $administrator, ): JsonResponse { $this->requireAuthentication($request); @@ -263,16 +263,16 @@ public function updateAdministrator( return $this->json($this->normalizer->normalize($administrator), Response::HTTP_OK); } - #[Route('/{administratorId}', name: 'delete', requirements: ['administratorId' => '\d+'], methods: ['DELETE'])] + #[Route('/{adminId}', name: 'delete', requirements: ['adminId' => '\d+'], methods: ['DELETE'])] #[OA\Delete( - path: '/api/v2/administrators/{administratorId}', + path: '/api/v2/administrators/{adminId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Delete an administrator.', summary: 'Delete Administrator', tags: ['administrators'], parameters: [ new OA\Parameter( - name: 'administratorId', + name: 'adminId', description: 'Administrator ID', in: 'path', required: true, @@ -299,7 +299,7 @@ public function updateAdministrator( )] public function deleteAdministrator( Request $request, - #[MapEntity(mapping: ['administratorId' => 'id'])] ?Administrator $administrator + #[MapEntity(mapping: ['adminId' => 'id'])] ?Administrator $administrator ): JsonResponse { $this->requireAuthentication($request); diff --git a/src/Identity/Request/UpdateAdministratorRequest.php b/src/Identity/Request/UpdateAdministratorRequest.php index f1432d4..b1c2450 100644 --- a/src/Identity/Request/UpdateAdministratorRequest.php +++ b/src/Identity/Request/UpdateAdministratorRequest.php @@ -58,8 +58,6 @@ )] class UpdateAdministratorRequest implements RequestInterface { - public int $administratorId; - #[Assert\Length(min: 3, max: 255)] #[UniqueLoginName] public ?string $loginName = null; @@ -89,7 +87,6 @@ class UpdateAdministratorRequest implements RequestInterface public function getDto(): UpdateAdministratorDto { return new UpdateAdministratorDto( - administratorId: $this->administratorId, loginName: $this->loginName, password: $this->password, email: $this->email, diff --git a/src/Messaging/Controller/CampaignController.php b/src/Messaging/Controller/CampaignController.php index b1b8e80..a047c9c 100644 --- a/src/Messaging/Controller/CampaignController.php +++ b/src/Messaging/Controller/CampaignController.php @@ -144,6 +144,11 @@ public function getMessages(Request $request): JsonResponse response: 403, description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') + ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') ) ] )] @@ -151,6 +156,9 @@ public function getMessage( Request $request, #[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null ): JsonResponse { + if ($message === null) { + throw $this->createNotFoundException('Campaign not found.'); + } $this->requireAuthentication($request); return $this->json($this->campaignService->getMessage($message), Response::HTTP_OK); @@ -271,6 +279,11 @@ public function createMessage(Request $request): JsonResponse description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') + ), new OA\Response( response: 422, description: 'Failure', @@ -282,6 +295,9 @@ public function updateMessage( Request $request, #[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null, ): JsonResponse { + if ($message === null) { + throw $this->createNotFoundException('Campaign not found.'); + } $authUser = $this->requireAuthentication($request); /** @var UpdateMessageRequest $updateMessageRequest */ diff --git a/src/Messaging/Controller/TemplateController.php b/src/Messaging/Controller/TemplateController.php index bc24a02..92179a4 100644 --- a/src/Messaging/Controller/TemplateController.php +++ b/src/Messaging/Controller/TemplateController.php @@ -105,9 +105,9 @@ public function getTemplates(Request $request): JsonResponse return $this->json( $this->paginatedDataProvider->getPaginatedList( - $request, - $this->normalizer, - Template::class, + request: $request, + normalizer: $this->normalizer, + className: Template::class, ), Response::HTTP_OK ); @@ -178,51 +178,7 @@ public function getTemplate( required: true, content: new OA\MediaType( mediaType: 'multipart/form-data', - schema: new OA\Schema( - required: ['title'], - properties: [ - new OA\Property( - property: 'title', - type: 'string', - example: 'Newsletter Template' - ), - new OA\Property( - property: 'content', - type: 'string', - example: '[CONTENT]' - ), - new OA\Property( - property: 'text', - type: 'string', - example: '[CONTENT]' - ), - new OA\Property( - property: 'file', - description: 'Optional file upload for HTML content', - type: 'string', - format: 'binary' - ), - new OA\Property( - property: 'check_links', - description: 'Check that all links have full URLs', - type: 'boolean', - example: true - ), - new OA\Property( - property: 'check_images', - description: 'Check that all images have full URLs', - type: 'boolean', - example: false - ), - new OA\Property( - property: 'check_external_images', - description: 'Check that all external images exist', - type: 'boolean', - example: true - ), - ], - type: 'object' - ) + schema: new OA\Schema(ref: '#/components/schemas/CreateTemplateRequest') ) ), tags: ['templates'], diff --git a/src/Messaging/Request/CreateTemplateRequest.php b/src/Messaging/Request/CreateTemplateRequest.php index 9ab4c6c..683ca8f 100644 --- a/src/Messaging/Request/CreateTemplateRequest.php +++ b/src/Messaging/Request/CreateTemplateRequest.php @@ -4,21 +4,60 @@ namespace PhpList\RestBundle\Messaging\Request; +use OpenApi\Attributes as OA; use PhpList\Core\Domain\Messaging\Model\Dto\CreateTemplateDto; use PhpList\RestBundle\Common\Request\RequestInterface; use PhpList\RestBundle\Messaging\Validator\Constraint\ContainsPlaceholder; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\Validator\Constraints as Assert; +#[OA\Schema( + schema: 'CreateTemplateRequest', + required: ['title'], + properties: [ + new OA\Property(property: 'title', type: 'string', example: 'Newsletter Template'), + new OA\Property( + property: 'content', + type: 'string', + example: '[CONTENT]', + nullable: true + ), + new OA\Property(property: 'text', type: 'string', example: '[CONTENT]'), + new OA\Property( + property: 'file', + description: 'Optional file upload for HTML content', + type: 'string', + format: 'binary' + ), + new OA\Property( + property: 'check_links', + description: 'Check that all links have full URLs', + type: 'boolean', + example: true + ), + new OA\Property( + property: 'check_images', + description: 'Check that all images have full URLs', + type: 'boolean', + example: false + ), + new OA\Property( + property: 'check_external_images', + description: 'Check that all external images exist', + type: 'boolean', + example: true + ), + ], + type: 'object' +)] class CreateTemplateRequest implements RequestInterface { #[Assert\NotBlank(normalizer: 'trim')] #[Assert\NotNull] public string $title; - #[Assert\NotBlank] #[ContainsPlaceholder] - public string $content; + public ?string $content = null; #[ContainsPlaceholder] public ?string $text = null; diff --git a/src/Messaging/Request/UpdateMessageRequest.php b/src/Messaging/Request/UpdateMessageRequest.php index 3f20dc2..7c754e6 100644 --- a/src/Messaging/Request/UpdateMessageRequest.php +++ b/src/Messaging/Request/UpdateMessageRequest.php @@ -9,12 +9,9 @@ class UpdateMessageRequest extends CreateMessageRequest { - public int $messageId; - public function getDto(): MessageDtoInterface { return new UpdateMessageDto( - messageId: $this->messageId, content: $this->content->getDto(), format: $this->format->getDto(), metadata: $this->metadata->getDto(), diff --git a/src/Subscription/Controller/ListMembersController.php b/src/Subscription/Controller/ListMembersController.php index 80bafa8..2677da8 100644 --- a/src/Subscription/Controller/ListMembersController.php +++ b/src/Subscription/Controller/ListMembersController.php @@ -113,10 +113,10 @@ public function getListMembers( return $this->json( $this->paginatedProvider->getPaginatedList( - $request, - $this->subscriberNormalizer, - Subscriber::class, - new SubscriberFilter($list->getId()) + request: $request, + normalizer: $this->subscriberNormalizer, + className: Subscriber::class, + filter: new SubscriberFilter($list->getId()) ), Response::HTTP_OK ); @@ -164,6 +164,11 @@ public function getListMembers( response: 403, description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') + ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') ) ] )] diff --git a/src/Subscription/Controller/SubscriberController.php b/src/Subscription/Controller/SubscriberController.php index e144e20..cfd18d5 100644 --- a/src/Subscription/Controller/SubscriberController.php +++ b/src/Subscription/Controller/SubscriberController.php @@ -169,7 +169,11 @@ public function updateSubscriber( } /** @var UpdateSubscriberRequest $updateSubscriberRequest */ $updateSubscriberRequest = $this->validator->validate($request, UpdateSubscriberRequest::class); - $subscriber = $this->subscriberManager->updateSubscriber($updateSubscriberRequest->getDto(), $admin); + $subscriber = $this->subscriberManager->updateSubscriber( + subscriber: $subscriber, + subscriberDto: $updateSubscriberRequest->getDto(), + admin: $admin + ); $this->entityManager->flush(); $subscriberData = $this->subscriberNormalizer->normalize($subscriber, 'json'); diff --git a/src/Subscription/Request/UpdateSubscriberRequest.php b/src/Subscription/Request/UpdateSubscriberRequest.php index 4628cca..8a4a16f 100644 --- a/src/Subscription/Request/UpdateSubscriberRequest.php +++ b/src/Subscription/Request/UpdateSubscriberRequest.php @@ -26,8 +26,6 @@ )] class UpdateSubscriberRequest implements RequestInterface { - public int $subscriberId; - #[Assert\NotBlank] #[Assert\Email] #[UniqueEmail(entityClass: Subscriber::class)] @@ -51,7 +49,6 @@ class UpdateSubscriberRequest implements RequestInterface public function getDto(): UpdateSubscriberDto { return new UpdateSubscriberDto( - subscriberId: $this->subscriberId, email: $this->email, confirmed: $this->confirmed, blacklisted: $this->blacklisted, diff --git a/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php b/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php index f350315..adf59a6 100644 --- a/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php +++ b/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php @@ -28,7 +28,7 @@ public function testCreateOrUpdateAttributeValueWithValidDataReturnsCreated(): v $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId, + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId, [], [], [], @@ -54,7 +54,7 @@ public function testUpdateAttributeValueReturnsOk(): void $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId, + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId, [], [], [], @@ -78,7 +78,7 @@ public function testDeleteAttributeValueReturnsNoContent(): void $this->authenticatedJsonRequest( 'delete', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId ); $this->assertHttpNoContent(); } @@ -92,7 +92,7 @@ public function testGetPaginatedReturnsOk(): void ]); $adminId = 1; - $this->authenticatedJsonRequest('get', '/api/v2/administrators/attribute-values/' . $adminId); + $this->authenticatedJsonRequest('get', '/api/v2/administrators/' . $adminId . '/attributes'); $this->assertHttpOkay(); $data = $this->getDecodedJsonResponseContent(); self::assertArrayHasKey('items', $data); @@ -112,7 +112,7 @@ public function testGetAttributeValueReturnsData(): void $this->authenticatedJsonRequest( 'get', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId ); $this->assertHttpOkay(); $data = $this->getDecodedJsonResponseContent(); @@ -126,7 +126,7 @@ public function testGetAttributeValueNotFound(): void $this->authenticatedJsonRequest( 'get', - '/api/v2/administrators/attribute-values/' . $adminId . '/999999' + '/api/v2/administrators/' . $adminId . '/attributes/999999' ); $this->assertHttpNotFound(); } @@ -142,7 +142,7 @@ public function testCreateAttributeValueWithInvalidJsonReturns400(): void $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId, + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId, [], [], [], @@ -158,7 +158,7 @@ public function testCreateAttributeValueWithInvalidDefinitionIdReturns404(): voi $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/999999', + '/api/v2/administrators/' . $adminId . '/attributes/999999', [], [], [], @@ -174,7 +174,7 @@ public function testCreateAttributeValueWithInvalidAdminIdReturns404(): void $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/999999/' . $definitionId, + '/api/v2/administrators/999999/attributes/' . $definitionId, [], [], [], diff --git a/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php b/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php index c8b9c73..7880cb3 100644 --- a/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php +++ b/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php @@ -13,7 +13,6 @@ class UpdateAdministratorRequestTest extends TestCase public function testGetDtoReturnsCorrectDto(): void { $request = new UpdateAdministratorRequest(); - $request->administratorId = 123; $request->loginName = 'testuser'; $request->password = 'password123'; $request->email = 'test@example.com'; @@ -27,7 +26,6 @@ public function testGetDtoReturnsCorrectDto(): void $dto = $request->getDto(); - $this->assertEquals(123, $dto->administratorId); $this->assertEquals('testuser', $dto->loginName); $this->assertEquals('password123', $dto->password); $this->assertEquals('test@example.com', $dto->email); @@ -43,11 +41,9 @@ public function testGetDtoReturnsCorrectDto(): void public function testGetDtoWithNullValues(): void { $request = new UpdateAdministratorRequest(); - $request->administratorId = 456; $dto = $request->getDto(); - $this->assertEquals(456, $dto->administratorId); $this->assertNull($dto->loginName); $this->assertNull($dto->password); $this->assertNull($dto->email); diff --git a/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php b/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php index 1b24254..62ebdc3 100644 --- a/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php +++ b/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php @@ -53,7 +53,6 @@ protected function setUp(): void $scheduleRequest->method('getDto')->willReturn($this->scheduleDto); $this->request = new UpdateMessageRequest(); - $this->request->messageId = 123; $this->request->content = $contentRequest; $this->request->format = $formatRequest; $this->request->metadata = $metadataRequest; @@ -68,7 +67,6 @@ public function testGetDtoReturnsCorrectDto(): void $dto = $this->request->getDto(); $this->assertInstanceOf(UpdateMessageDto::class, $dto); - $this->assertEquals(123, $dto->messageId); $this->assertSame($this->contentDto, $dto->content); $this->assertSame($this->formatDto, $dto->format); $this->assertSame($this->metadataDto, $dto->metadata); @@ -84,7 +82,6 @@ public function testGetDtoWithNullTemplateId(): void $dto = $this->request->getDto(); $this->assertInstanceOf(UpdateMessageDto::class, $dto); - $this->assertEquals(123, $dto->messageId); $this->assertSame($this->contentDto, $dto->content); $this->assertSame($this->formatDto, $dto->format); $this->assertSame($this->metadataDto, $dto->metadata); diff --git a/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php b/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php index 16e5257..87158e1 100644 --- a/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php +++ b/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php @@ -13,7 +13,6 @@ class UpdateSubscriberRequestTest extends TestCase public function testGetDtoReturnsCorrectDto(): void { $request = new UpdateSubscriberRequest(); - $request->subscriberId = 123; $request->email = 'subscriber@example.com'; $request->confirmed = true; $request->blacklisted = false; @@ -24,7 +23,6 @@ public function testGetDtoReturnsCorrectDto(): void $dto = $request->getDto(); $this->assertInstanceOf(UpdateSubscriberDto::class, $dto); - $this->assertEquals(123, $dto->subscriberId); $this->assertEquals('subscriber@example.com', $dto->email); $this->assertTrue($dto->confirmed); $this->assertFalse($dto->blacklisted);