diff --git a/Tests/Request/AbstractRequest.php b/Tests/Request/AbstractRequest.php index 494c550..2e79b64 100644 --- a/Tests/Request/AbstractRequest.php +++ b/Tests/Request/AbstractRequest.php @@ -465,10 +465,55 @@ abstract class AbstractRequest extends ApiTestCase /** * @test * @throws ReflectionException + * @dataProvider setGetSenderAddressTypeDataProvider */ - public function setGetSenderAddressTypeTest() + public function testSetGetSenderAddressType($hasSender, $addressType, $expected) { - $this->checkGetterSetter('fixture', 'setSenderAddressType', 'getSenderAddressType'); + /** @var Request|MockObject $request */ + $request = $this->getMockBuilder($this->testClassName) + ->setConstructorArgs([$this->request->getMessage(), $this->request->getClient()]) + ->onlyMethods(['getSenderAddress']) + ->getMock(); + + if ($hasSender) { + /** @var Sender|MockObject $senderMock */ + $senderMock = $this->getMockBuilder( Sender::class ) + ->disableOriginalConstructor() + ->onlyMethods(['get']) + ->getMock(); + $senderMock->method('get')->willReturn('fixture'); + $request->method('getSenderAddress')->willReturn($senderMock); + } else { + $request->method('getSenderAddress')->willReturn(null); + } + + $this->assertInstanceOf( + Request::class, + $this->callMethod( + $request, + 'setSenderAddressType', + [$addressType] + ) + ); + + $this->assertSame( + $expected, + $this->callMethod( + $request, + 'getSenderAddressType' + ) + ); + } + + /** + * @return array[] + */ + public function setGetSenderAddressTypeDataProvider(): array + { + return [ + 'has no sender' => [false, 'fixture', null], + 'has sender and address type' => [true, 'fixture', 'fixture'], + ]; } /** diff --git a/src/Exceptions/ExceptionMessages.php b/src/Exceptions/ExceptionMessages.php index d2ec7e1..99ae8f9 100644 --- a/src/Exceptions/ExceptionMessages.php +++ b/src/Exceptions/ExceptionMessages.php @@ -17,11 +17,13 @@ namespace D3\LinkmobilityClient\Exceptions; class ExceptionMessages { - public const INVALID_SENDER = 'invalid sender phone number'; + public const INVALID_SENDER = 'invalid sender phone number'; - public const NOK_REQUEST_RETURN = 'request %1$s returns status code %2$s'; + public const NOK_REQUEST_RETURN = 'request %1$s returns status code %2$s'; - public const INVALID_RECIPIENT_PHONE = 'invalid recipient phone number'; + public const INVALID_RECIPIENT_PHONE = 'invalid recipient phone number'; - public const NOT_A_MOBILE_NUMBER = 'not a mobile number'; + public const NOT_A_MOBILE_NUMBER = 'not a mobile number'; + + public const DEBUG_NOSENDERORCOUNTRYCODE= 'no sender number or sender country code defined, use fallback to account default'; } diff --git a/src/Exceptions/NoSenderDefinedException.php b/src/Exceptions/NoSenderDefinedException.php new file mode 100644 index 0000000..e79d27c --- /dev/null +++ b/src/Exceptions/NoSenderDefinedException.php @@ -0,0 +1,21 @@ + + * @link https://www.oxidmodule.com + */ + +declare(strict_types=1); + +namespace D3\LinkmobilityClient\Exceptions; + +class NoSenderDefinedException extends LinkmobilityException +{ + +} \ No newline at end of file diff --git a/src/Request/Request.php b/src/Request/Request.php index c7091b0..3483bfe 100644 --- a/src/Request/Request.php +++ b/src/Request/Request.php @@ -465,7 +465,7 @@ abstract class Request implements RequestInterface */ public function getSenderAddressType() { - return $this->senderAddressType; + return $this->getSenderAddress() && $this->getSenderAddress()->get() ? $this->senderAddressType : null; } /** diff --git a/src/ValueObject/Sender.php b/src/ValueObject/Sender.php index 40fc074..72b06f9 100644 --- a/src/ValueObject/Sender.php +++ b/src/ValueObject/Sender.php @@ -17,7 +17,9 @@ namespace D3\LinkmobilityClient\ValueObject; use Assert\Assert; use D3\LinkmobilityClient\Exceptions\ExceptionMessages; +use D3\LinkmobilityClient\Exceptions\NoSenderDefinedException; use D3\LinkmobilityClient\Exceptions\RecipientException; +use D3\LinkmobilityClient\LoggerHandler; use libphonenumber\NumberParseException; use libphonenumber\PhoneNumberFormat; use libphonenumber\PhoneNumberUtil; @@ -31,20 +33,30 @@ class Sender extends StringValueObject * @throws RecipientException * @throws NumberParseException */ - public function __construct(string $number, string $iso2CountryCode) + public function __construct(string $number = null, string $iso2CountryCode = null) { - Assert::that($iso2CountryCode)->string()->length(2); + try { + if ( is_null( $number ) || is_null( $iso2CountryCode ) ) { + throw new NoSenderDefinedException(); + } - $phoneUtil = $this->getPhoneNumberUtil(); + Assert::that( $iso2CountryCode )->string()->length( 2 ); - $phoneNumber = $phoneUtil->parse($number, strtoupper($iso2CountryCode)); - $number = ltrim($phoneUtil->format($phoneNumber, PhoneNumberFormat::E164), '+'); + $phoneUtil = $this->getPhoneNumberUtil(); - if (false === $phoneUtil->isValidNumber($phoneNumber)) { - throw new RecipientException(ExceptionMessages::INVALID_SENDER); + $phoneNumber = $phoneUtil->parse( $number, strtoupper( $iso2CountryCode ) ); + $number = ltrim( $phoneUtil->format( $phoneNumber, PhoneNumberFormat::E164 ), '+' ); + + if ( false === $phoneUtil->isValidNumber( $phoneNumber ) ) { + throw new RecipientException( ExceptionMessages::INVALID_SENDER ); + } + + parent::__construct( $number ); + } catch (NoSenderDefinedException $e) { + LoggerHandler::getInstance()->getLogger()->debug( + ExceptionMessages::DEBUG_NOSENDERORCOUNTRYCODE + ); } - - parent::__construct($number); } /** @@ -54,12 +66,4 @@ class Sender extends StringValueObject { return PhoneNumberUtil::getInstance(); } - - /** - * @return int - */ - public function getFormatted() - { - return parent::getFormatted(); - } }