Completed
Pull Request — master (#649)
by Jeroen De
50:49
created

testPersonalInfoWithLongFields_validationFails()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 26
rs 8.8571
cc 1
eloc 23
nc 1
nop 0
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\Fundraising\Frontend\DonatingContext\Tests\Integration\UseCases\AddDonation;
6
7
use WMDE\Euro\Euro;
8
use WMDE\Fundraising\Frontend\DonatingContext\Domain\Model\DonorName;
9
use WMDE\Fundraising\Frontend\DonatingContext\UseCases\AddDonation\AddDonationValidationResult;
10
use WMDE\Fundraising\Frontend\DonatingContext\UseCases\AddDonation\AddDonationValidator;
11
use WMDE\Fundraising\Frontend\PaymentContext\Domain\Model\BankData;
12
use WMDE\Fundraising\Frontend\PaymentContext\Domain\Model\Iban;
13
use WMDE\Fundraising\Frontend\Tests\Data\ValidAddDonationRequest;
14
use WMDE\Fundraising\Frontend\Tests\Unit\Validation\ValidatorTestCase;
15
use WMDE\Fundraising\Frontend\Validation\PaymentDataValidator;
16
use WMDE\Fundraising\Frontend\Validation\BankDataValidator;
17
use WMDE\Fundraising\Frontend\Validation\EmailValidator;
18
use WMDE\Fundraising\Frontend\Validation\IbanValidator;
19
use WMDE\Fundraising\Frontend\Validation\ValidationResult;
20
21
/**
22
 * @covers WMDE\Fundraising\Frontend\DonatingContext\UseCases\AddDonation\AddDonationValidator
23
 *
24
 * @licence GNU GPL v2+
25
 * @author Kai Nissen < [email protected] >
26
 * @author Gabriel Birke < [email protected] >
27
 */
28
class AddDonationValidatorTest extends ValidatorTestCase {
29
30
	/** @var AddDonationValidator */
31
	private $donationValidator;
32
33
	public function setUp() {
34
		$this->donationValidator = $this->newDonationValidator();
35
	}
36
37
	public function testGivenValidDonation_validationIsSuccessful() {
38
		$request = ValidAddDonationRequest::getRequest();
39
		$this->assertEmpty( $this->donationValidator->validate( $request )->getViolations() );
40
	}
41
42
	public function testGivenAnonymousDonorAndEmptyAddressFields_validatorReturnsNoViolations() {
43
		$request = ValidAddDonationRequest::getRequest();
44
45
		$request->setDonorType( DonorName::PERSON_ANONYMOUS );
46
		$request->setDonorSalutation( '' );
47
		$request->setDonorTitle( '' );
48
		$request->setDonorCompany( '' );
49
		$request->setDonorFirstName( '' );
50
		$request->setDonorLastName( '' );
51
		$request->setDonorStreetAddress( '' );
52
		$request->setDonorPostalCode( '' );
53
		$request->setDonorCity( '' );
54
		$request->setDonorCountryCode( '' );
55
		$request->setDonorEmailAddress( '' );
56
57
		$this->assertEmpty( $this->donationValidator->validate( $request )->getViolations() );
58
	}
59
60
	public function testGivenNoPaymentType_validatorReturnsFalse() {
61
		$request = ValidAddDonationRequest::getRequest();
62
		$request->setPaymentType( '' );
63
64
		$this->assertFalse( $this->donationValidator->validate( $request )->isSuccessful() );
65
66
		$this->assertConstraintWasViolated(
67
			$this->donationValidator->validate( $request ),
68
			AddDonationValidationResult::SOURCE_PAYMENT_TYPE
69
		);
70
	}
71
72
	public function testGivenUnsupportedPaymentType_validatorReturnsFalse() {
73
		$request = ValidAddDonationRequest::getRequest();
74
		$request->setPaymentType( 'KaiCoin' );
75
76
		$this->assertFalse( $this->donationValidator->validate( $request )->isSuccessful() );
77
78
		$this->assertConstraintWasViolated(
79
			$this->donationValidator->validate( $request ),
80
			AddDonationValidationResult::SOURCE_PAYMENT_TYPE
81
		);
82
	}
83
84
	public function testPersonalInfoValidationFails_validatorReturnsFalse() {
85
		$request = ValidAddDonationRequest::getRequest();
86
		$request->setDonorType( DonorName::PERSON_COMPANY );
87
		$request->setDonorCompany( '' );
88
89
		$this->assertFalse( $this->donationValidator->validate( $request )->isSuccessful() );
90
91
		$this->assertConstraintWasViolated(
92
			$this->donationValidator->validate( $request ),
93
			AddDonationValidationResult::SOURCE_DONOR_COMPANY
94
		);
95
	}
96
97
	public function testDirectDebitMissingBankData_validatorReturnsFalse() {
98
		$bankData = new BankData();
99
		$bankData->setIban( new Iban( '' ) );
100
		$bankData->setBic( '' );
101
		$bankData->setBankName( '' );
102
		$request = ValidAddDonationRequest::getRequest();
103
		$request->setBankData( $bankData );
104
105
		$result = $this->donationValidator->validate( $request );
106
		$this->assertFalse( $result->isSuccessful() );
107
108
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_IBAN );
109
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_BIC );
110
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_BANK_NAME );
111
	}
112
113
	public function testAmountTooLow_validatorReturnsFalse() {
114
		$request = ValidAddDonationRequest::getRequest();
115
		$request->setAmount( Euro::newFromCents( 50 ) );
116
117
		$result = $this->donationValidator->validate( $request );
118
		$this->assertFalse( $result->isSuccessful() );
119
120
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_PAYMENT_AMOUNT );
121
	}
122
123
	public function testPersonalInfoWithLongFields_validationFails() {
124
		$longText = str_repeat( 'Cats ', 500 );
125
		$request = ValidAddDonationRequest::getRequest();
126
		$request->setDonorFirstName( $longText );
127
		$request->setDonorLastName( $longText );
128
		$request->setDonorTitle( $longText );
129
		$request->setDonorSalutation( $longText );
130
		$request->setDonorStreetAddress( $longText );
131
		$request->setDonorPostalCode( $longText );
132
		$request->setDonorCity( $longText );
133
		$request->setDonorCountryCode( $longText );
134
		$request->setDonorEmailAddress( str_repeat( 'Cats', 500 ) . '@example.com' );
135
136
		$result = $this->donationValidator->validate( $request );
137
		$this->assertFalse( $result->isSuccessful() );
138
139
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_FIRST_NAME );
140
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_LAST_NAME );
141
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_SALUTATION );
142
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_TITLE );
143
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_STREET_ADDRESS );
144
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_CITY );
145
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_POSTAL_CODE );
146
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_COUNTRY );
147
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_DONOR_EMAIL );
148
	}
149
150
	public function testBankDataWithLongFields_validationFails() {
151
		$longText = str_repeat( 'Cats ', 500 );
152
		$request = ValidAddDonationRequest::getRequest();
153
		$validBankData = $request->getBankData();
154
		$bankData = new BankData();
155
		$bankData->setBic( $longText );
156
		$bankData->setBankName( $longText );
157
		// Other length violations will be caught by IBAN validation
158
		$bankData->setIban( $validBankData->getIban() );
159
		$bankData->setAccount( $validBankData->getAccount() );
160
		$bankData->setBankCode( $validBankData->getBankCode() );
161
		$bankData->freeze();
162
		$request->setBankData( $bankData );
163
164
		$result = $this->donationValidator->validate( $request );
165
		$this->assertFalse( $result->isSuccessful() );
166
167
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_BANK_NAME );
168
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_BIC );
169
	}
170
171
	public function testLongSource_validationFails() {
172
		$request = ValidAddDonationRequest::getRequest();
173
		$request->setSource( 'http://catlady.com/#' . str_repeat( 'Cats ', 500 ) );
174
175
		$result = $this->donationValidator->validate( $request );
176
		$this->assertFalse( $result->isSuccessful() );
177
178
		$this->assertConstraintWasViolated( $result, AddDonationValidationResult::SOURCE_TRACKING_SOURCE );
179
	}
180
181
	private function newDonationValidator(): AddDonationValidator {
182
		return new AddDonationValidator(
183
			new PaymentDataValidator( 1.0, 100000 ),
184
			$this->newBankDataValidator(),
185
			$this->newMockEmailValidator()
186
		);
187
	}
188
189
	private function newBankDataValidator(): BankDataValidator {
190
		$ibanValidatorMock = $this->getMockBuilder( IbanValidator::class )->disableOriginalConstructor()->getMock();
191
		$ibanValidatorMock->method( 'validate' )
192
			->willReturn( new ValidationResult() );
193
194
		return new BankDataValidator( $ibanValidatorMock );
195
	}
196
197
	private function newMockEmailValidator() {
198
		$validator = $this->getMockBuilder( EmailValidator::class )->disableOriginalConstructor()->getMock();
199
		$validator->method( 'validate' )->willReturn( new ValidationResult() );
200
		return $validator;
201
	}
202
}
203