Completed
Push — master ( e6c518...18cdbd )
by Jeroen De
12s
created

testForeignDirectDebitMissingBankData_validationSucceeds()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

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