diff --git a/tests/unit/Domain/Package/PackageTest.php b/tests/unit/Domain/Package/PackageTest.php index 1328cc46..ca87c9fa 100644 --- a/tests/unit/Domain/Package/PackageTest.php +++ b/tests/unit/Domain/Package/PackageTest.php @@ -8,16 +8,19 @@ use PHPUnit\Framework\TestCase; final class PackageTest extends TestCase { + private array $packageAttributes; private Package $package; private DateTimeImmutable $createdAt; public function setUp(): void { - $this->package = new Package( - name: 'vendor/project', - description: 'An awesome package description', - latestVersion: '1.0', - url: 'http://' - ); + $this->packageAttributes = [ + 'name' => 'vendor/project', + 'description' => 'An awesome package description', + 'latestVersion' => '1.0', + 'url' => 'http://' + ]; + + $this->package = new Package(...$this->packageAttributes); $this->createdAt = $this->package->getCreatedAt(); } @@ -51,11 +54,24 @@ public function testDescriptionHasBeenUpdated(): void { $this->assertInstanceOf(DateTimeImmutable::class, $this->package->getUpdatedAt()); } + public function testDescriptionDoesNotUpdateWhenItsTheSame(): void { + $this->assertInstanceOf(DateTimeImmutable::class, $this->package->getCreatedAt()); + $this->assertFalse($this->package->isDirty()); + $this->assertNull($this->package->getUpdatedAt()); + + $this->package = $this->package->withDescription('An awesome package description'); + + $this->assertFalse($this->package->isDirty()); + $this->assertSame('An awesome package description', $this->package->getDescription()); + $this->assertSame($this->createdAt, $this->package->getCreatedAt()); + $this->assertNull($this->package->getUpdatedAt()); + } + public function testLatestVersion(): void { $this->assertSame('1.0', $this->package->getLatestVersion()); } - public function testLatestversionHasBeenUpdated(): void { + public function testLatestVersionHasBeenUpdated(): void { $this->assertInstanceOf(DateTimeImmutable::class, $this->package->getCreatedAt()); $this->assertFalse($this->package->isDirty()); $this->assertNull($this->package->getUpdatedAt()); @@ -68,6 +84,19 @@ public function testLatestversionHasBeenUpdated(): void { $this->assertInstanceOf(DateTimeImmutable::class, $this->package->getUpdatedAt()); } + public function testLatestVersionDoesNotUpdateWhenItsTheSame(): void { + $this->assertInstanceOf(DateTimeImmutable::class, $this->package->getCreatedAt()); + $this->assertFalse($this->package->isDirty()); + $this->assertNull($this->package->getUpdatedAt()); + + $this->package = $this->package->withLatestVersion('1.0'); + + $this->assertFalse($this->package->isDirty()); + $this->assertSame('1.0', $this->package->getLatestVersion()); + $this->assertSame($this->createdAt, $this->package->getCreatedAt()); + $this->assertNull($this->package->getUpdatedAt()); + } + public function testUrl(): void { $this->assertSame('http://', $this->package->getUrl()); } @@ -84,4 +113,46 @@ public function testUrlHasBeenUpdated(): void { $this->assertSame($this->createdAt, $this->package->getCreatedAt()); $this->assertInstanceOf(DateTimeImmutable::class, $this->package->getUpdatedAt()); } + + public function testUrlDoesNotUpdateWhenItsTheSame(): void { + $this->assertInstanceOf(DateTimeImmutable::class, $this->package->getCreatedAt()); + $this->assertFalse($this->package->isDirty()); + $this->assertNull($this->package->getUpdatedAt()); + + $this->package = $this->package->withUrl('http://'); + + $this->assertFalse($this->package->isDirty()); + $this->assertSame('http://', $this->package->getUrl()); + $this->assertSame($this->createdAt, $this->package->getCreatedAt()); + $this->assertNull($this->package->getUpdatedAt()); + } + + public function testJsonSerializeWhenPackageWasNotUpdated() { + $packageWasNotUpdated = array_merge( + $this->packageAttributes, + [ + 'createdAt' => $this->createdAt, + 'updatedAt' => null + ] + ); + + $this->assertIsArray($this->package->jsonSerialize()); + $this->assertSame($packageWasNotUpdated, $this->package->jsonSerialize()); + } + + public function testJsonSerializeWhenPackageWasUpdated(): void { + $this->package = $this->package->withLatestVersion('1.0.1'); + + $packageWasUpdated = array_merge( + $this->packageAttributes, + [ + 'latestVersion' => '1.0.1', + 'createdAt' => $this->createdAt, + 'updatedAt' => $this->package->getUpdatedAt() + ] + ); + + $this->assertIsArray($this->package->jsonSerialize()); + $this->assertSame($packageWasUpdated, $this->package->jsonSerialize()); + } }