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); + } +}