diff --git a/app/Jobs/CheckYearPeriod.php b/app/Jobs/CheckYearPeriod.php new file mode 100644 index 0000000..b6b4d01 --- /dev/null +++ b/app/Jobs/CheckYearPeriod.php @@ -0,0 +1,48 @@ +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 1649f4a..fa7a8d7 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -5,12 +5,21 @@ 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 { public function run(): void { User::factory(10)->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); + } +} diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php deleted file mode 100644 index b98aaab..0000000 --- a/tests/Unit/ExampleTest.php +++ /dev/null @@ -1,15 +0,0 @@ -assertTrue(true); - } -}