Expected::never(), ], $this ); $subscriptionUrlFactory = Stub::makeEmpty(SubscriptionUrlFactory::class); $throttling = Stub::makeEmpty(SubscriptionThrottling::class); $fieldNameObfuscator = Stub::makeEmpty(FieldNameObfuscator::class); $requiredCustomFieldValidator = Stub::makeEmpty(RequiredCustomFieldValidator::class); $settings = Stub::makeEmpty(SettingsController::class); $form = Stub::makeEmpty(FormEntity::class); $formsRepository = Stub::makeEmpty( FormsRepository::class, [ 'findOneById' => function() use ($form): FormEntity { return $form; }, ] ); $statisticsFormsRepository = Stub::makeEmpty( StatisticsFormsRepository::class, [ 'subscribe' => Expected::never(), ], $this ); $wp = Stub::make( WPFunctions::class, [ 'doAction' => Expected::never(), ], $this ); $testee = new SubscriberSubscribeController( $subscriptionCaptcha, $captchaSession, $subscriberActions, $subscriptionUrlFactory, $throttling, $fieldNameObfuscator, $requiredCustomFieldValidator, $settings, $formsRepository, $statisticsFormsRepository, $wp ); $this->expectException(UnexpectedValueException::class); $testee->subscribe( [ 'form_id' => 2, 'email' => 'john.doe@gmail.com', ] ); } public function testNoSubscriptionWhenThrottle() { $subscriptionCaptcha = Stub::makeEmpty(Captcha::class); $captchaSession = Stub::makeEmpty(CaptchaSession::class); $subscriberActions = Stub::makeEmpty( SubscriberActions::class, [ 'subscribe' => Expected::never(), ], $this ); $subscriptionUrlFactory = Stub::makeEmpty(SubscriptionUrlFactory::class); $throttling = Stub::makeEmpty( SubscriptionThrottling::class, [ 'throttle' => 1, 'secondsToTimeString' => '1', ] ); $fieldNameObfuscator = Stub::makeEmpty(FieldNameObfuscator::class, [ 'deobfuscateFormPayload' => function($data) { return $data; }, ]); $requiredCustomFieldValidator = Stub::makeEmpty(RequiredCustomFieldValidator::class); $settings = Stub::makeEmpty(SettingsController::class); $submitData = []; $segmentIds = [1]; $form = Stub::makeEmpty( FormEntity::class, [ 'getSettingsSegmentIds' => function() use ($segmentIds): array { return $segmentIds; }, ] ); $formsRepository = Stub::makeEmpty( FormsRepository::class, [ 'findOneById' => function() use ($form): FormEntity { return $form; }, ] ); $statisticsFormsRepository = Stub::makeEmpty( StatisticsFormsRepository::class, [ 'subscribe' => Expected::never(), ], $this ); $wp = Stub::make( WPFunctions::class, [ 'doAction' => Expected::never(), ], $this ); $testee = new SubscriberSubscribeController( $subscriptionCaptcha, $captchaSession, $subscriberActions, $subscriptionUrlFactory, $throttling, $fieldNameObfuscator, $requiredCustomFieldValidator, $settings, $formsRepository, $statisticsFormsRepository, $wp ); $result = $testee->subscribe(array_merge(['form_id' => 1], $submitData)); expect($result)->equals([ 'refresh_captcha' => true, 'error' => 'You need to wait 1 before subscribing again.', ]); } public function testNoSubscriptionWhenActionHookBeforeSubscriptionThrowsError() { $subscriptionCaptcha = Stub::makeEmpty(Captcha::class); $captchaSession = Stub::makeEmpty(CaptchaSession::class); $subscriberActions = Stub::makeEmpty( SubscriberActions::class, [ 'subscribe' => Expected::never(), ], $this ); $subscriptionUrlFactory = Stub::makeEmpty(SubscriptionUrlFactory::class); $throttling = Stub::makeEmpty(SubscriptionThrottling::class); $fieldNameObfuscator = Stub::makeEmpty(FieldNameObfuscator::class, [ 'deobfuscateFormPayload' => function($data) { return $data; }, ]); $requiredCustomFieldValidator = Stub::makeEmpty(RequiredCustomFieldValidator::class); $settings = Stub::makeEmpty(SettingsController::class); $submitData = []; $segmentIds = [1]; $form = Stub::makeEmpty( FormEntity::class, [ 'getSettingsSegmentIds' => function() use ($segmentIds): array { return $segmentIds; }, ] ); $formsRepository = Stub::makeEmpty( FormsRepository::class, [ 'findOneById' => function() use ($form): FormEntity { return $form; }, ] ); $statisticsFormsRepository = Stub::makeEmpty( StatisticsFormsRepository::class, [ 'subscribe' => Expected::never(), ], $this ); $wp = Stub::make( WPFunctions::class, [ 'doAction' => function($hook) { if ($hook === 'mailpoet_subscription_before_subscribe') { throw new \MailPoet\UnexpectedValueException("Value not expected."); } }, ], $this ); $testee = new SubscriberSubscribeController( $subscriptionCaptcha, $captchaSession, $subscriberActions, $subscriptionUrlFactory, $throttling, $fieldNameObfuscator, $requiredCustomFieldValidator, $settings, $formsRepository, $statisticsFormsRepository, $wp ); $this->expectException(UnexpectedValueException::class); $testee->subscribe(array_merge(['form_id' => 1], $submitData)); } public function testBuiltinCaptchaNotFilledOut() { $captchaSessionId = 'captcha_session_id'; $subscriptionCaptcha = Stub::makeEmpty(Captcha::class, [ 'isRequired' => true, ]); $captchaSession = Stub::makeEmpty(CaptchaSession::class, [ 'init' => function($receivedSessionId) use ($captchaSessionId) { expect($receivedSessionId)->equals($captchaSessionId); }, ]); $subscriberActions = Stub::makeEmpty( SubscriberActions::class, [ 'subscribe' => Expected::never(), ], $this ); $expectedRedirectLink = 'redirect'; $subscriptionUrlFactory = Stub::makeEmpty( SubscriptionUrlFactory::class, [ 'getCaptchaUrl' => $expectedRedirectLink, ] ); $throttling = Stub::makeEmpty( SubscriptionThrottling::class, [ 'throttle' => 1, 'secondsToTimeString' => '1', ] ); $fieldNameObfuscator = Stub::makeEmpty(FieldNameObfuscator::class, [ 'deobfuscateFormPayload' => function($data) { return $data; }, ]); $requiredCustomFieldValidator = Stub::makeEmpty(RequiredCustomFieldValidator::class); $captchaSettings = [ 'type' => Captcha::TYPE_BUILTIN, ]; $settings = Stub::makeEmpty(SettingsController::class, [ 'get' => function($value) use ($captchaSettings) { if ($value === 'captcha') { return $captchaSettings; } }, ]); $submitData = [ 'captcha_session_id' => $captchaSessionId, ]; $segmentIds = [1]; $form = Stub::makeEmpty( FormEntity::class, [ 'getSettingsSegmentIds' => function() use ($segmentIds): array { return $segmentIds; }, ] ); $formsRepository = Stub::makeEmpty( FormsRepository::class, [ 'findOneById' => function() use ($form): FormEntity { return $form; }, ] ); $statisticsFormsRepository = Stub::makeEmpty( StatisticsFormsRepository::class, [ 'subscribe' => Expected::never(), ], $this ); $wp = Stub::make( WPFunctions::class, [ 'doAction' => Expected::never(), ], $this ); $testee = new SubscriberSubscribeController( $subscriptionCaptcha, $captchaSession, $subscriberActions, $subscriptionUrlFactory, $throttling, $fieldNameObfuscator, $requiredCustomFieldValidator, $settings, $formsRepository, $statisticsFormsRepository, $wp ); $result = $testee->subscribe(array_merge(['form_id' => 1], $submitData)); expect($result)->equals([ 'redirect_url' => $expectedRedirectLink, 'error' => 'Please fill in the CAPTCHA.', ]); } public function testBuiltinCaptchaNotValid() { $captchaSessionId = 'captcha_session_id'; $subscriptionCaptcha = Stub::makeEmpty(Captcha::class, [ 'isRequired' => true, ]); $captchaSession = Stub::makeEmpty(CaptchaSession::class, [ 'getCaptchaHash' => 'a_string_that_does_not_match', 'init' => function($receivedSessionId) use ($captchaSessionId) { expect($receivedSessionId)->equals($captchaSessionId); }, ]); $subscriberActions = Stub::makeEmpty( SubscriberActions::class, [ 'subscribe' => Expected::never(), ], $this ); $expectedRedirectLink = 'redirect'; $subscriptionUrlFactory = Stub::makeEmpty( SubscriptionUrlFactory::class, [ 'getCaptchaUrl' => $expectedRedirectLink, ] ); $throttling = Stub::makeEmpty( SubscriptionThrottling::class, [ 'throttle' => 1, 'secondsToTimeString' => '1', ] ); $fieldNameObfuscator = Stub::makeEmpty(FieldNameObfuscator::class, [ 'deobfuscateFormPayload' => function($data) { return $data; }, ]); $requiredCustomFieldValidator = Stub::makeEmpty(RequiredCustomFieldValidator::class); $captchaSettings = [ 'type' => Captcha::TYPE_BUILTIN, ]; $settings = Stub::makeEmpty(SettingsController::class, [ 'get' => function($value) use ($captchaSettings) { if ($value === 'captcha') { return $captchaSettings; } }, ]); $submitData = [ 'captcha_session_id' => $captchaSessionId, 'captcha' => 'captcha', ]; $segmentIds = [1]; $form = Stub::makeEmpty( FormEntity::class, [ 'getSettingsSegmentIds' => function() use ($segmentIds): array { return $segmentIds; }, ] ); $formsRepository = Stub::makeEmpty( FormsRepository::class, [ 'findOneById' => function() use ($form): FormEntity { return $form; }, ] ); $statisticsFormsRepository = Stub::makeEmpty( StatisticsFormsRepository::class, [ 'subscribe' => Expected::never(), ], $this ); $wp = Stub::make( WPFunctions::class, [ 'doAction' => Expected::never(), ], $this ); $testee = new SubscriberSubscribeController( $subscriptionCaptcha, $captchaSession, $subscriberActions, $subscriptionUrlFactory, $throttling, $fieldNameObfuscator, $requiredCustomFieldValidator, $settings, $formsRepository, $statisticsFormsRepository, $wp ); $result = $testee->subscribe(array_merge(['form_id' => 1], $submitData)); expect($result)->equals([ 'refresh_captcha' => true, 'error' => 'The characters entered do not match with the previous CAPTCHA.', ]); } public function testSubscribeSuccess() { $captchaSessionId = 'captcha_session_id'; $captcha = 'captcha'; $subscriptionCaptcha = Stub::makeEmpty(Captcha::class, [ 'isRequired' => true, ]); $captchaSession = Stub::makeEmpty(CaptchaSession::class, [ 'getCaptchaHash' => $captcha, 'init' => function($receivedSessionId) use ($captchaSessionId) { expect($receivedSessionId)->equals($captchaSessionId); }, ]); $formFields = [ 'field_a' => 'value_a', 'field_b' => 'value_b', ]; $submitData = array_merge([ 'captcha_session_id' => $captchaSessionId, 'captcha' => $captcha, ], $formFields); $segmentIds = [1]; $form = Stub::makeEmpty( FormEntity::class, [ 'getSettingsSegmentIds' => function() use ($segmentIds): array { return $segmentIds; }, 'getBlocksByTypes' => function() use ($formFields) { $fields = array_values(array_map( function(string $id): array { return [ 'id' => $id, ]; }, array_keys($formFields) )); return $fields; }, ] ); $subscriber = Stub::makeEmpty(SubscriberEntity::class); $subscriberActions = Stub::make( SubscriberActions::class, [ 'subscribe' => function($receivedData, $receivedSegmentIds) use ($formFields, $segmentIds, $subscriber) { expect($receivedData)->equals($formFields); expect($receivedSegmentIds)->equals($segmentIds); return $subscriber; }, ], $this ); $subscriptionUrlFactory = Stub::makeEmpty(SubscriptionUrlFactory::class, [ 'subscribe' => function($receivedSubscriber, $receivedForm) use ($subscriber, $form) { expect($receivedSubscriber)->equals($subscriber); expect($receivedForm)->equals($form); }, ]); $throttling = Stub::makeEmpty(SubscriptionThrottling::class); $fieldNameObfuscator = Stub::makeEmpty(FieldNameObfuscator::class, [ 'deobfuscateFormPayload' => function($data) { return $data; }, ]); $requiredCustomFieldValidator = Stub::makeEmpty(RequiredCustomFieldValidator::class); $settings = Stub::makeEmpty( SettingsController::class, [ 'get' => function($value) { if ($value === 'captcha') { return [ 'type' => Captcha::TYPE_BUILTIN, ]; } }, ] ); $formsRepository = Stub::makeEmpty( FormsRepository::class, [ 'findOneById' => function() use ($form): FormEntity { return $form; }, ] ); $statisticsFormsRepository = Stub::makeEmpty(StatisticsFormsRepository::class); $wp = Stub::make( WPFunctions::class, [ 'doAction' => function($receivedHook, $receivedData, $receivedSegmentIds, $receivedForm) use ($formFields, $segmentIds, $form) { expect($receivedHook)->equals('mailpoet_subscription_before_subscribe'); expect($receivedData)->equals($formFields); expect($receivedSegmentIds)->equals($segmentIds); expect($receivedForm)->equals($form); }, ] ); $testee = new SubscriberSubscribeController( $subscriptionCaptcha, $captchaSession, $subscriberActions, $subscriptionUrlFactory, $throttling, $fieldNameObfuscator, $requiredCustomFieldValidator, $settings, $formsRepository, $statisticsFormsRepository, $wp ); $result = $testee->subscribe(array_merge(['form_id' => 1], $submitData)); expect($result)->equals([]); } }