createMock(ApiClient::class); $mailjet->expects(self::once()) ->method('createEventCallbackUrl') ->with( 'unsub', 'https://mailjet:secret@my.ep-reisen.de/webhooks/mailjet/newsletter', 2, false, ) ->willReturn([ 'Data' => [ [ 'ID' => 123, ], ], ]); $mailjet->expects(self::never())->method('deleteEventCallbackUrl'); $tester = new CommandTester($this->createCommand($mailjet)); $tester->execute(['action' => 'register']); self::assertSame(Command::SUCCESS, $tester->getStatusCode()); self::assertStringContainsString('Created Mailjet newsletter webhook', $tester->getDisplay()); self::assertStringContainsString('"ID": 123', $tester->getDisplay()); } public function testRemoveDeletesWebhookById(): void { $mailjet = $this->createMock(ApiClient::class); $mailjet->expects(self::never())->method('createEventCallbackUrl'); $mailjet->expects(self::once()) ->method('deleteEventCallbackUrl') ->with(321); $tester = new CommandTester($this->createCommand($mailjet)); $tester->execute(['action' => 'remove', 'callback_id' => 321]); self::assertSame(Command::SUCCESS, $tester->getStatusCode()); self::assertStringContainsString('Deleted Mailjet newsletter webhook callback ID 321', $tester->getDisplay()); } public function testDeactivateUsesRemoveFlow(): void { $mailjet = $this->createMock(ApiClient::class); $mailjet->expects(self::never())->method('createEventCallbackUrl'); $mailjet->expects(self::once()) ->method('deleteEventCallbackUrl') ->with(654); $tester = new CommandTester($this->createCommand($mailjet)); $tester->execute(['action' => 'deactivate', 'callback_id' => '654']); self::assertSame(Command::SUCCESS, $tester->getStatusCode()); self::assertStringContainsString('Deleted Mailjet newsletter webhook callback ID 654', $tester->getDisplay()); } public function testRemoveFailsWithoutCallbackId(): void { $mailjet = $this->createMock(ApiClient::class); $mailjet->expects(self::never())->method('createEventCallbackUrl'); $mailjet->expects(self::never())->method('deleteEventCallbackUrl'); $tester = new CommandTester($this->createCommand($mailjet)); $tester->execute(['action' => 'remove']); self::assertSame(Command::FAILURE, $tester->getStatusCode()); self::assertStringContainsString('A numeric callback ID is required', $tester->getDisplay()); } private function createCommand(ApiClient $mailjetApiClient): MailjetNewsletterWebhookCommand { return new MailjetNewsletterWebhookCommand( $mailjetApiClient, 'https://my.ep-reisen.de', 'secret', $this->createStub(LoggerInterface::class), ); } }