From 652587dbf1e96e8367f0c703c240b2a4930395f4 Mon Sep 17 00:00:00 2001 From: Adrian Hopek Date: Wed, 19 Jan 2022 11:00:17 +0100 Subject: [PATCH] #19 - year periods (#25) * #19 - year periods * #19 - fix --- app/Jobs/CheckYearPeriod.php | 44 ++++++++ app/Models/YearPeriod.php | 30 +++++ database/factories/YearPeriodFactory.php | 17 +++ ...01_19_093320_create_year_periods_table.php | 23 ++++ database/seeders/DatabaseSeeder.php | 9 ++ tests/Unit/CheckYearPeriodTest.php | 105 ++++++++++++++++++ 6 files changed, 228 insertions(+) create mode 100644 app/Jobs/CheckYearPeriod.php create mode 100644 app/Models/YearPeriod.php create mode 100644 database/factories/YearPeriodFactory.php create mode 100644 database/migrations/2022_01_19_093320_create_year_periods_table.php create mode 100644 tests/Unit/CheckYearPeriodTest.php diff --git a/app/Jobs/CheckYearPeriod.php b/app/Jobs/CheckYearPeriod.php new file mode 100644 index 0000000..a4a52b6 --- /dev/null +++ b/app/Jobs/CheckYearPeriod.php @@ -0,0 +1,44 @@ +createCurrentYearPeriod(); + } + + if (YearPeriod::query()->max("year") === Carbon::now()->year) { + $this->createNextYearPeriod(); + } + } + + protected function createCurrentYearPeriod(): void + { + YearPeriod::query()->create([ + "year" => Carbon::now()->year, + ]); + } + + protected function createNextYearPeriod(): void + { + YearPeriod::query()->create([ + "year" => Carbon::now()->year + 1, + ]); + } +} diff --git a/app/Models/YearPeriod.php b/app/Models/YearPeriod.php new file mode 100644 index 0000000..bcf2096 --- /dev/null +++ b/app/Models/YearPeriod.php @@ -0,0 +1,30 @@ +where("year", Carbon::now()->year)->first(); + + return $year; + } +} diff --git a/database/factories/YearPeriodFactory.php b/database/factories/YearPeriodFactory.php new file mode 100644 index 0000000..2437dd3 --- /dev/null +++ b/database/factories/YearPeriodFactory.php @@ -0,0 +1,17 @@ + $this->faker->unique()->year, + ]; + } +} diff --git a/database/migrations/2022_01_19_093320_create_year_periods_table.php b/database/migrations/2022_01_19_093320_create_year_periods_table.php new file mode 100644 index 0000000..bb7f105 --- /dev/null +++ b/database/migrations/2022_01_19_093320_create_year_periods_table.php @@ -0,0 +1,23 @@ +id(); + $table->integer("year")->unique()->index(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists("year_periods"); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index f11b4c8..af2722b 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -5,7 +5,9 @@ declare(strict_types=1); namespace Database\Seeders; use Illuminate\Database\Seeder; +use Illuminate\Support\Carbon; use Toby\Models\User; +use Toby\Models\YearPeriod; class DatabaseSeeder extends Seeder { @@ -15,5 +17,12 @@ class DatabaseSeeder extends Seeder User::factory([ "email" => env("LOCAL_EMAIL_FOR_LOGIN_VIA_GOOGLE"), ])->create(); + + YearPeriod::factory([ + "year" => Carbon::now()->year, + ])->create(); + YearPeriod::factory([ + "year" => Carbon::now()->year + 1, + ])->create(); } } diff --git a/tests/Unit/CheckYearPeriodTest.php b/tests/Unit/CheckYearPeriodTest.php new file mode 100644 index 0000000..a2dda59 --- /dev/null +++ b/tests/Unit/CheckYearPeriodTest.php @@ -0,0 +1,105 @@ +assertDatabaseCount("year_periods", 2); + + $this->assertDatabaseHas("year_periods", [ + "year" => $now->year, + ]); + + $this->assertDatabaseHas("year_periods", [ + "year" => $now->year + 1, + ]); + } + + public function testCurrentYearPeriodIsCreatedWhenDoesntExist(): void + { + $now = Carbon::now(); + Carbon::setTestNow($now); + + $this->assertDatabaseMissing("year_periods", [ + "year" => $now->year, + ]); + + CheckYearPeriod::dispatchSync(); + + $this->assertDatabaseHas("year_periods", [ + "year" => $now->year, + ]); + } + + public function testNextYearPeriodIsCreatedWhenDoesntExist(): void + { + $now = Carbon::now(); + Carbon::setTestNow($now); + + YearPeriod::factory([ + "year" => $now->year, + ]); + + $this->assertDatabaseMissing("year_periods", [ + "year" => $now->year + 1, + ]); + + CheckYearPeriod::dispatchSync(); + + $this->assertDatabaseHas("year_periods", [ + "year" => $now->year + 1, + ]); + } + + public function testYearPeriodsAreNotCreatedWhenExists(): void + { + $now = Carbon::now(); + Carbon::setTestNow($now); + + YearPeriod::factory([ + "year" => $now->year, + ])->create(); + YearPeriod::factory([ + "year" => $now->year + 1, + ])->create(); + + $this->assertDatabaseCount("year_periods", 2); + + CheckYearPeriod::dispatchSync(); + + $this->assertDatabaseCount("year_periods", 2); + } + + public function testYearPeriodsAreNotDuplicatedWhenJobCalledMultipleTimes(): void + { + $now = Carbon::now(); + Carbon::setTestNow($now); + + CheckYearPeriod::dispatchSync(); + $this->assertDatabaseCount("year_periods", 2); + + CheckYearPeriod::dispatchSync(); + CheckYearPeriod::dispatchSync(); + CheckYearPeriod::dispatchSync(); + + $this->assertDatabaseCount("year_periods", 2); + } +}