Completed
Pull Request — master (#10)
by Gabriel
60:20
created

AddressChangeTest::testReferenceTypeIsValidated()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 4
rs 10
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\Fundraising\AddressChangeContext\Tests\Unit\Domain\Model;
6
7
use Doctrine\ORM\EntityManager;
8
use PHPUnit\Framework\TestCase;
9
use WMDE\Fundraising\AddressChangeContext\Domain\Model\AddressChangeId;
10
use WMDE\Fundraising\AddressChangeContext\Domain\Model\AddressChange;
11
use WMDE\Fundraising\AddressChangeContext\Tests\Data\ValidAddress;
12
use WMDE\Fundraising\AddressChangeContext\Tests\TestEnvironment;
13
14
/**
15
 * @covers \WMDE\Fundraising\AddressChangeContext\Domain\Model\AddressChange
16
 */
17
class AddressChangeTest extends TestCase {
18
19
	private const DUMMY_DONATION_ID = 0;
20
21
	private EntityManager $entityManager;
22
	private AddressChangeId $identifier;
23
	private AddressChangeId $newIdentifier;
24
25
	public function setUp(): void {
26
		$this->entityManager = TestEnvironment::newInstance()->getEntityManager();
27
		$this->identifier = AddressChangeId::fromString( 'c956688a-89e8-41b7-b93e-7e4cf3d6c826' );
28
		$this->newIdentifier = AddressChangeId::fromString( 'e0c4db0b-9049-462c-8c76-c4f6a3a75091' );
29
	}
30
31
	public function testWhenNewAddressChangeIsCreated_itIsNotModified(): void {
32
		$addressChange = new AddressChange( AddressChange::ADDRESS_TYPE_PERSON, AddressChange::EXTERNAL_ID_TYPE_DONATION, self::DUMMY_DONATION_ID, $this->identifier );
33
		$this->assertFalse( $addressChange->isModified() );
34
	}
35
36
	public function testWhenAddressIsUpdated_dataIsProperlyAssigned(): void {
37
		$addressChange = $this->newPersonAddressChange();
38
		$address = ValidAddress::newValidPersonalAddress();
39
40
		$addressChange->performAddressChange( $address, $this->newIdentifier );
41
42
		$this->assertSame( $address, $addressChange->getAddress() );
43
	}
44
45
	private function newPersonAddressChange(): AddressChange {
46
		return $addressChange = new AddressChange(
0 ignored issues
show
Unused Code introduced by
The assignment to $addressChange is dead and can be removed.
Loading history...
47
			AddressChange::ADDRESS_TYPE_PERSON,
48
			AddressChange::EXTERNAL_ID_TYPE_DONATION,
49
			self::DUMMY_DONATION_ID,
50
			$this->identifier,
51
			null,
52
			new \DateTime( '1970-01-01' ),
53
		);
54
	}
55
56
	public function testUpdatingAddressMarksAddressChangeAsModified(): void {
57
		$addressChange = $this->newPersonAddressChange();
58
		$initialIdentifier = $addressChange->getCurrentIdentifier();
59
60
		$addressChange->performAddressChange( ValidAddress::newValidPersonalAddress(), $this->newIdentifier );
61
62
		$this->assertNotSame( $initialIdentifier, $addressChange->getCurrentIdentifier() );
63
		$this->assertSame( $initialIdentifier, $addressChange->getPreviousIdentifier() );
64
		$this->assertTrue( $addressChange->isModified() );
65
	}
66
67
	public function testOptingOutOfReceiptMarksAddressChangeAsModified(): void {
68
		$addressChange = $this->newPersonAddressChange();
69
		$initialIdentifier = $addressChange->getCurrentIdentifier();
70
71
		$addressChange->optOutOfDonationReceipt( $this->newIdentifier );
72
73
		$this->assertNotSame( $initialIdentifier, $addressChange->getCurrentIdentifier() );
74
		$this->assertSame( $initialIdentifier, $addressChange->getPreviousIdentifier() );
75
		$this->assertTrue( $addressChange->isModified() );
76
	}
77
78
	public function testNewAddressChangeIsNotExported(): void {
79
		$addressChange = new AddressChange( AddressChange::ADDRESS_TYPE_PERSON, AddressChange::EXTERNAL_ID_TYPE_DONATION, self::DUMMY_DONATION_ID, $this->identifier );
80
		$this->assertFalse( $addressChange->isExported() );
81
	}
82
83
	public function testAddressChangeCanBeMarkedAsExported(): void {
84
		$addressChange = new AddressChange( AddressChange::ADDRESS_TYPE_PERSON, AddressChange::EXTERNAL_ID_TYPE_DONATION, self::DUMMY_DONATION_ID, $this->identifier );
85
		$addressChange->markAsExported();
86
		$this->assertTrue( $addressChange->isExported() );
87
	}
88
89
	public function testAddressChangeCannotBeExportedTwice(): void {
90
		$addressChange = new AddressChange( AddressChange::ADDRESS_TYPE_PERSON, AddressChange::EXTERNAL_ID_TYPE_DONATION, self::DUMMY_DONATION_ID, $this->identifier );
91
		$addressChange->markAsExported();
92
93
		$this->expectException( \LogicException::class );
94
95
		$addressChange->markAsExported();
96
	}
97
98
	public function testMarkingAsExportedDoesNotChangeModificationDate(): void {
99
		$addressChange = new AddressChange( AddressChange::ADDRESS_TYPE_PERSON, AddressChange::EXTERNAL_ID_TYPE_DONATION, self::DUMMY_DONATION_ID, $this->identifier );
100
		$addressChange->markAsExported();
101
		$this->assertFalse( $addressChange->isModified() );
102
	}
103
104
	public function testWhenAddressChangeIsPerformed_exportStateIsReset(): void {
105
		$addressChange = new AddressChange( AddressChange::ADDRESS_TYPE_PERSON, AddressChange::EXTERNAL_ID_TYPE_DONATION, self::DUMMY_DONATION_ID, $this->identifier );
106
		$addressChange->markAsExported();
107
		$addressChange->performAddressChange( ValidAddress::newValidCompanyAddress(), $this->newIdentifier );
108
109
		$this->assertFalse( $addressChange->isExported() );
110
	}
111
112
	public function testAddressTypeIsValidated(): void {
113
		$this->expectException( \InvalidArgumentException::class );
114
115
		new AddressChange( 'TyPE_Person', AddressChange::EXTERNAL_ID_TYPE_DONATION, self::DUMMY_DONATION_ID, $this->identifier );
116
	}
117
118
	public function testReferenceTypeIsValidated(): void {
119
		$this->expectException( \InvalidArgumentException::class );
120
121
		new AddressChange( AddressChange::ADDRESS_TYPE_PERSON, 'dogs!', self::DUMMY_DONATION_ID, $this->identifier );
122
	}
123
}
124