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

newCompanyMembershipRequest()   B

Complexity

Conditions 3
Paths 1

Size

Total Lines 30
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 30
rs 8.8571
cc 3
eloc 25
nc 1
nop 1
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\Fundraising\Frontend\MembershipApplicationContext\Tests\Unit\UseCases\ApplyForMembership;
6
7
use WMDE\Euro\Euro;
8
use WMDE\Fundraising\Frontend\MembershipApplicationContext\Domain\Model\ApplicantAddress;
9
use WMDE\Fundraising\Frontend\MembershipApplicationContext\Domain\Model\ApplicantName;
10
use WMDE\Fundraising\Frontend\MembershipApplicationContext\Tracking\MembershipApplicationTrackingInfo;
11
use WMDE\Fundraising\Frontend\MembershipApplicationContext\UseCases\ApplyForMembership\ApplyForMembershipRequest;
12
use WMDE\Fundraising\Frontend\MembershipApplicationContext\UseCases\ApplyForMembership\MembershipApplicationBuilder;
13
use WMDE\Fundraising\Frontend\PaymentContext\Domain\Model\BankData;
14
use WMDE\Fundraising\Frontend\PaymentContext\Domain\Model\Iban;
15
use WMDE\Fundraising\Frontend\Tests\Data\ValidMembershipApplication;
16
17
/**
18
 * @covers WMDE\Fundraising\Frontend\MembershipApplicationContext\UseCases\ApplyForMembership\MembershipApplicationBuilder
19
 *
20
 * @license GNU GPL v2+
21
 * @author Jeroen De Dauw < [email protected] >
22
 */
23
class MembershipApplicationBuilderTest extends \PHPUnit_Framework_TestCase {
24
25
	const COMPANY_NAME = 'Malenfant asteroid mining';
26
	const OMIT_OPTIONAL_FIELDS = true;
27
28
	public function testCompanyMembershipRequestGetsBuildCorrectly() {
29
		$request = $this->newCompanyMembershipRequest();
30
31
		$application = ( new MembershipApplicationBuilder() )->newApplicationFromRequest( $request );
32
33
		$this->assertIsExpectedCompanyPersonName( $application->getApplicant()->getName() );
34
		$this->assertIsExpectedAddress( $application->getApplicant()->getPhysicalAddress() );
35
36
		$this->assertEquals(
37
			Euro::newFromInt( ValidMembershipApplication::PAYMENT_AMOUNT_IN_EURO ),
38
			$application->getPayment()->getAmount()
39
		);
40
	}
41
42
	private function newCompanyMembershipRequest( bool $omitOptionalFields = false ) {
43
		$request = new ApplyForMembershipRequest();
44
45
		$request->setMembershipType( ValidMembershipApplication::MEMBERSHIP_TYPE );
46
		$request->markApplicantAsCompany();
47
		$request->setApplicantCompanyName( self::COMPANY_NAME );
48
		$request->setMembershipType( ValidMembershipApplication::MEMBERSHIP_TYPE );
49
		$request->setApplicantSalutation( ValidMembershipApplication::APPLICANT_SALUTATION );
50
		$request->setApplicantTitle( ValidMembershipApplication::APPLICANT_TITLE );
51
		$request->setApplicantFirstName( ValidMembershipApplication::APPLICANT_FIRST_NAME );
52
		$request->setApplicantLastName( ValidMembershipApplication::APPLICANT_LAST_NAME );
53
		$request->setApplicantStreetAddress( ValidMembershipApplication::APPLICANT_STREET_ADDRESS );
54
		$request->setApplicantPostalCode( ValidMembershipApplication::APPLICANT_POSTAL_CODE );
55
		$request->setApplicantCity( ValidMembershipApplication::APPLICANT_CITY );
56
		$request->setApplicantCountryCode( ValidMembershipApplication::APPLICANT_COUNTRY_CODE );
57
		$request->setApplicantEmailAddress( ValidMembershipApplication::APPLICANT_EMAIL_ADDRESS );
58
		$request->setPaymentIntervalInMonths( ValidMembershipApplication::PAYMENT_PERIOD_IN_MONTHS );
59
		$request->setPaymentAmountInEuros( (string)ValidMembershipApplication::PAYMENT_AMOUNT_IN_EURO );
60
		$request->setPaymentBankData( $this->newValidBankData() );
61
		$request->setApplicantPhoneNumber(
62
			$omitOptionalFields ? '' : ValidMembershipApplication::APPLICANT_PHONE_NUMBER
63
		);
64
		$request->setApplicantDateOfBirth(
65
			$omitOptionalFields ? '' : ValidMembershipApplication::APPLICANT_DATE_OF_BIRTH
66
		);
67
		$request->setTrackingInfo( $this->newTrackingInfo() );
68
		$request->setPiwikTrackingString( 'foo/bar' );
69
70
		return $request->assertNoNullFields()->freeze();
71
	}
72
73
	private function newValidBankData(): BankData {
74
		$bankData = new BankData();
75
76
		$bankData->setIban( new Iban( ValidMembershipApplication::PAYMENT_IBAN ) );
77
		$bankData->setBic( ValidMembershipApplication::PAYMENT_BIC );
78
		$bankData->setAccount( ValidMembershipApplication::PAYMENT_BANK_ACCOUNT );
79
		$bankData->setBankCode( ValidMembershipApplication::PAYMENT_BANK_CODE );
80
		$bankData->setBankName( ValidMembershipApplication::PAYMENT_BANK_NAME );
81
82
		return $bankData->assertNoNullFields()->freeze();
83
	}
84
85
	private function newTrackingInfo(): MembershipApplicationTrackingInfo {
86
		return new MembershipApplicationTrackingInfo(
87
			ValidMembershipApplication::TEMPLATE_CAMPAIGN,
88
			ValidMembershipApplication::TEMPLATE_NAME
89
		);
90
	}
91
92
	private function assertIsExpectedCompanyPersonName( ApplicantName $name ) {
93
		$this->assertEquals(
94
			$this->getCompanyPersonName(),
95
			$name
96
		);
97
	}
98
99
	private function getCompanyPersonName(): ApplicantName {
100
		$name = ApplicantName::newCompanyName();
101
102
		$name->setCompanyName( self::COMPANY_NAME );
103
		$name->setSalutation( ValidMembershipApplication::APPLICANT_SALUTATION );
104
		$name->setTitle( ValidMembershipApplication::APPLICANT_TITLE );
105
		$name->setFirstName( ValidMembershipApplication::APPLICANT_FIRST_NAME );
106
		$name->setLastName( ValidMembershipApplication::APPLICANT_LAST_NAME );
107
108
		return $name->assertNoNullFields()->freeze();
109
	}
110
111
	private function assertIsExpectedAddress( ApplicantAddress $address ) {
112
		$this->assertEquals(
113
			$this->getPhysicalAddress(),
114
			$address
115
		);
116
	}
117
118
	private function getPhysicalAddress(): ApplicantAddress {
119
		$address = new ApplicantAddress();
120
121
		$address->setStreetAddress( ValidMembershipApplication::APPLICANT_STREET_ADDRESS );
122
		$address->setPostalCode( ValidMembershipApplication::APPLICANT_POSTAL_CODE );
123
		$address->setCity( ValidMembershipApplication::APPLICANT_CITY );
124
		$address->setCountryCode( ValidMembershipApplication::APPLICANT_COUNTRY_CODE );
125
126
		return $address->assertNoNullFields()->freeze();
127
	}
128
129
	public function testWhenNoBirthDateAndPhoneNumberIsGiven_membershipApplicationIsStillBuiltCorrectly() {
130
		$request = $this->newCompanyMembershipRequest( self::OMIT_OPTIONAL_FIELDS );
131
132
		$application = ( new MembershipApplicationBuilder() )->newApplicationFromRequest( $request );
133
134
		$this->assertIsExpectedCompanyPersonName( $application->getApplicant()->getName() );
135
		$this->assertIsExpectedAddress( $application->getApplicant()->getPhysicalAddress() );
136
137
		$this->assertEquals(
138
			Euro::newFromInt( ValidMembershipApplication::PAYMENT_AMOUNT_IN_EURO ),
139
			$application->getPayment()->getAmount()
140
		);
141
	}
142
143
}
144