From b6a949b0ef31e5f9bb5b8d5767bd94d08dfab1c5 Mon Sep 17 00:00:00 2001 From: Bastian Allgeier Date: Fri, 14 Jun 2024 11:52:11 +0200 Subject: [PATCH] Add unit tests for Version::save and refactor common test setups --- src/Content/Version.php | 2 +- tests/Content/VersionTest.php | 315 +++++++++++++++++++++++++--------- 2 files changed, 232 insertions(+), 85 deletions(-) diff --git a/src/Content/Version.php b/src/Content/Version.php index c359cd0a8e..5c09964b4e 100644 --- a/src/Content/Version.php +++ b/src/Content/Version.php @@ -177,7 +177,7 @@ public function save( bool $overwrite = false ): void { match (true) { - $this->exists() === false + $this->exists($language) === false => $this->create($fields, $language), $overwrite === true => $this->replace($fields, $language), diff --git a/tests/Content/VersionTest.php b/tests/Content/VersionTest.php index f4d2a8cfaa..9e5a95d72f 100644 --- a/tests/Content/VersionTest.php +++ b/tests/Content/VersionTest.php @@ -36,6 +36,43 @@ public function contentFile(string|null $language = null, VersionId|null $versio '.txt'; } + public function createContentMultiLanguage(): array + { + Data::write($fileEN = $this->contentFile('en'), $contentEN = [ + 'title' => 'Title English', + 'subtitle' => 'Subtitle English' + ]); + + Data::write($fileDE = $this->contentFile('de'), $contentDE = [ + 'title' => 'Title Deutsch', + 'subtitle' => 'Subtitle Deutsch' + ]); + + return [ + 'en' => [ + 'content' => $contentEN, + 'file' => $fileEN, + ], + 'de' => [ + 'content' => $contentDE, + 'file' => $fileDE, + ] + ]; + } + + public function createContentSingleLanguage(): array + { + Data::write($file = $this->contentFile(), $content = [ + 'title' => 'Title', + 'subtitle' => 'Subtitle' + ]); + + return [ + 'content' => $content, + 'file' => $file + ]; + } + /** * @covers ::content */ @@ -48,19 +85,13 @@ public function testContentMultiLanguage(): void id: VersionId::published() ); - Data::write($this->contentFile('en'), [ - 'title' => 'Test' - ]); + $expected = $this->createContentMultiLanguage(); - Data::write($this->contentFile('de'), [ - 'title' => 'Töst' - ]); - - $this->assertSame('Test', $version->content('en')->get('title')->value()); - $this->assertSame('Test', $version->content($this->app->language('en'))->get('title')->value()); - $this->assertSame('Test', $version->content()->get('title')->value()); - $this->assertSame('Töst', $version->content('de')->get('title')->value()); - $this->assertSame('Töst', $version->content($this->app->language('de'))->get('title')->value()); + $this->assertSame($expected['en']['content']['title'], $version->content('en')->get('title')->value()); + $this->assertSame($expected['en']['content']['title'], $version->content($this->app->language('en'))->get('title')->value()); + $this->assertSame($expected['en']['content']['title'], $version->content()->get('title')->value()); + $this->assertSame($expected['de']['content']['title'], $version->content('de')->get('title')->value()); + $this->assertSame($expected['de']['content']['title'], $version->content($this->app->language('de'))->get('title')->value()); } /** @@ -75,11 +106,9 @@ public function testContentSingleLanguage(): void id: VersionId::published() ); - Data::write($this->contentFile(), [ - 'title' => 'Test' - ]); + $expected = $this->createContentSingleLanguage(); - $this->assertSame('Test', $version->content()->get('title')->value()); + $this->assertSame($expected['content']['title'], $version->content()->get('title')->value()); } /** @@ -181,13 +210,7 @@ public function testDeleteMultiLanguage(): void $this->assertContentFileDoesNotExist('de'); $this->assertContentFileDoesNotExist('en'); - Data::write($this->contentFile('en'), [ - 'title' => 'Test' - ]); - - Data::write($this->contentFile('de'), [ - 'title' => 'Test' - ]); + $this->createContentMultiLanguage(); $this->assertContentFileExists('en'); $this->assertContentFileExists('de'); @@ -212,9 +235,7 @@ public function testDeleteSingleLanguage(): void $this->assertContentFileDoesNotExist(); - Data::write($this->contentFile(), [ - 'title' => 'Test' - ]); + $this->createContentSingleLanguage(); $this->assertContentFileExists(); @@ -235,9 +256,10 @@ public function testEnsureMultiLanguage(): void id: VersionId::published() ); - Data::write($this->contentFile('de'), [ - 'title' => 'Test' - ]); + $this->createContentMultiLanguage(); + + $this->assertNull($version->ensure('en')); + $this->assertNull($version->ensure($this->app->language('en'))); $this->assertNull($version->ensure('de')); $this->assertNull($version->ensure($this->app->language('de'))); @@ -255,9 +277,7 @@ public function testEnsureSingleLanguage(): void id: VersionId::published() ); - Data::write($this->contentFile(), [ - 'title' => 'Test' - ]); + $this->createContentSingleLanguage(); $this->assertNull($version->ensure()); } @@ -328,10 +348,16 @@ public function testExistsMultiLanguage(): void id: VersionId::published() ); + $this->assertFalse($version->exists('en')); + $this->assertFalse($version->exists($this->app->language('en'))); + $this->assertFalse($version->exists('de')); $this->assertFalse($version->exists($this->app->language('de'))); - Data::write($this->contentFile('de'), []); + $this->createContentMultiLanguage(); + + $this->assertTrue($version->exists('en')); + $this->assertTrue($version->exists($this->app->language('en'))); $this->assertTrue($version->exists('de')); $this->assertTrue($version->exists($this->app->language('de'))); @@ -351,7 +377,7 @@ public function testExistsSingleLanguage(): void $this->assertFalse($version->exists()); - Data::write($this->contentFile(), []); + $this->createContentSingleLanguage(); $this->assertTrue($version->exists()); } @@ -555,18 +581,12 @@ public function testReadMultiLanguage(): void id: VersionId::published() ); - Data::write($this->contentFile('en'), $contentEN = [ - 'title' => 'Test' - ]); + $expected = $this->createContentMultiLanguage(); - Data::write($this->contentFile('de'), $contentDE = [ - 'title' => 'Töst' - ]); - - $this->assertSame($contentEN, $version->read('en')); - $this->assertSame($contentEN, $version->read($this->app->language('en'))); - $this->assertSame($contentDE, $version->read('de')); - $this->assertSame($contentDE, $version->read($this->app->language('de'))); + $this->assertSame($expected['en']['content'], $version->read('en')); + $this->assertSame($expected['en']['content'], $version->read($this->app->language('en'))); + $this->assertSame($expected['de']['content'], $version->read('de')); + $this->assertSame($expected['de']['content'], $version->read($this->app->language('de'))); } /** @@ -581,11 +601,9 @@ public function testReadSingleLanguage(): void id: VersionId::published() ); - Data::write($this->contentFile(), $content = [ - 'title' => 'Test' - ]); + $expected = $this->createContentSingleLanguage(); - $this->assertSame($content, $version->read()); + $this->assertSame($expected['content'], $version->read()); } /** @@ -600,15 +618,7 @@ public function testReplaceMultiLanguage(): void id: VersionId::published() ); - Data::write($fileEN = $this->contentFile('en'), [ - 'title' => 'Test English', - 'subtitle' => 'Subtitle English' - ]); - - Data::write($fileDE = $this->contentFile('de'), [ - 'title' => 'Test Deutsch', - 'subtitle' => 'Subtitle Deutsch' - ]); + $expected = $this->createContentMultiLanguage(); // with Language argument $version->replace([ @@ -620,8 +630,8 @@ public function testReplaceMultiLanguage(): void 'title' => 'Updated Title Deutsch', ], 'de'); - $this->assertSame(['title' => 'Updated Title English'], Data::read($fileEN)); - $this->assertSame(['title' => 'Updated Title Deutsch'], Data::read($fileDE)); + $this->assertSame(['title' => 'Updated Title English'], Data::read($expected['en']['file'])); + $this->assertSame(['title' => 'Updated Title Deutsch'], Data::read($expected['de']['file'])); } /** @@ -636,16 +646,164 @@ public function testReplaceSingleLanguage(): void id: VersionId::published() ); - Data::write($file = $this->contentFile(), $content = [ - 'title' => 'Title', - 'subtitle' => 'Subtitle' - ]); + $expected = $this->createContentSingleLanguage(); $version->replace([ 'title' => 'Updated Title' ]); - $this->assertSame(['title' => 'Updated Title'], Data::read($file)); + $this->assertSame(['title' => 'Updated Title'], Data::read($expected['file'])); + } + + /** + * @covers ::save + */ + public function testSaveExistingMultiLanguage(): void + { + $this->setUpMultiLanguage(); + + $version = new Version( + model: $this->model, + id: VersionId::published() + ); + + $expected = $this->createContentMultiLanguage(); + + // with Language argument + $version->save([ + 'title' => 'Updated Title English' + ], $this->app->language('en')); + + // with string argument + $version->save([ + 'title' => 'Updated Title Deutsch', + ], 'de'); + + $this->assertSame('Updated Title English', Data::read($expected['en']['file'])['title']); + $this->assertSame('Subtitle English', Data::read($expected['en']['file'])['subtitle']); + $this->assertSame('Updated Title Deutsch', Data::read($expected['de']['file'])['title']); + $this->assertSame('Subtitle Deutsch', Data::read($expected['de']['file'])['subtitle']); + } + + /** + * @covers ::save + */ + public function testSaveExistingSingleLanguage(): void + { + $this->setUpSingleLanguage(); + + $version = new Version( + model: $this->model, + id: VersionId::published() + ); + + $expected = $this->createContentSingleLanguage(); + + $version->save([ + 'title' => 'Updated Title' + ]); + + $this->assertSame('Updated Title', Data::read($expected['file'])['title']); + $this->assertSame('Subtitle', Data::read($expected['file'])['subtitle']); + } + + /** + * @covers ::save + */ + public function testSaveNonExistingMultiLanguage(): void + { + $this->setUpMultiLanguage(); + + $version = new Version( + model: $this->model, + id: VersionId::published() + ); + + $this->assertContentFileDoesNotExist('en'); + $this->assertContentFileDoesNotExist('de'); + + // with Language argument + $version->save([ + 'title' => 'Test' + ], $this->app->language('en')); + + // with string argument + $version->save([ + 'title' => 'Test' + ], 'de'); + + $this->assertContentFileExists('en'); + $this->assertContentFileExists('de'); + } + + /** + * @covers ::save + */ + public function testSaveNonExistingSingleLanguage(): void + { + $this->setUpSingleLanguage(); + + $version = new Version( + model: $this->model, + id: VersionId::published() + ); + + $this->assertContentFileDoesNotExist(); + + $version->save([ + 'title' => 'Test' + ]); + + $this->assertContentFileExists(); + } + + /** + * @covers ::save + */ + public function testSaveOverwriteMultiLanguage(): void + { + $this->setUpMultiLanguage(); + + $version = new Version( + model: $this->model, + id: VersionId::published() + ); + + $expected = $this->createContentMultiLanguage(); + + // with Language argument + $version->save([ + 'title' => 'Updated Title English' + ], $this->app->language('en'), true); + + // with string argument + $version->save([ + 'title' => 'Updated Title Deutsch', + ], 'de', true); + + $this->assertSame(['title' => 'Updated Title English'], Data::read($expected['en']['file'])); + $this->assertSame(['title' => 'Updated Title Deutsch'], Data::read($expected['de']['file'])); + } + + /** + * @covers ::save + */ + public function testSaveOverwriteSingleLanguage(): void + { + $this->setUpSingleLanguage(); + + $version = new Version( + model: $this->model, + id: VersionId::published() + ); + + $expected = $this->createContentSingleLanguage(); + + $version->save([ + 'title' => 'Updated Title' + ], 'default', true); + + $this->assertSame(['title' => 'Updated Title'], Data::read($expected['file'])); } /** @@ -716,15 +874,7 @@ public function testUpdateMultiLanguage(): void id: VersionId::published() ); - Data::write($fileEN = $this->contentFile('en'), [ - 'title' => 'Test English', - 'subtitle' => 'Subtitle English' - ]); - - Data::write($fileDE = $this->contentFile('de'), [ - 'title' => 'Test Deutsch', - 'subtitle' => 'Subtitle Deutsch' - ]); + $expected = $this->createContentMultiLanguage(); // with Language argument $version->update([ @@ -736,10 +886,10 @@ public function testUpdateMultiLanguage(): void 'title' => 'Updated Title Deutsch', ], 'de'); - $this->assertSame('Updated Title English', Data::read($fileEN)['title']); - $this->assertSame('Subtitle English', Data::read($fileEN)['subtitle']); - $this->assertSame('Updated Title Deutsch', Data::read($fileDE)['title']); - $this->assertSame('Subtitle Deutsch', Data::read($fileDE)['subtitle']); + $this->assertSame('Updated Title English', Data::read($expected['en']['file'])['title']); + $this->assertSame('Subtitle English', Data::read($expected['en']['file'])['subtitle']); + $this->assertSame('Updated Title Deutsch', Data::read($expected['de']['file'])['title']); + $this->assertSame('Subtitle Deutsch', Data::read($expected['de']['file'])['subtitle']); } /** @@ -754,16 +904,13 @@ public function testUpdateSingleLanguage(): void id: VersionId::published() ); - Data::write($file = $this->contentFile(), $content = [ - 'title' => 'Title', - 'subtitle' => 'Subtitle' - ]); + $expected = $this->createContentSingleLanguage(); $version->update([ 'title' => 'Updated Title' ]); - $this->assertSame('Updated Title', Data::read($file)['title']); - $this->assertSame('Subtitle', Data::read($file)['subtitle']); + $this->assertSame('Updated Title', Data::read($expected['file'])['title']); + $this->assertSame('Subtitle', Data::read($expected['file'])['subtitle']); } }