| <?php | |
| 
 | |
| namespace Tests\Feature\Http; | |
| 
 | |
| use Illuminate\Testing\Fluent\AssertableJson; | |
| use Tests\TestCase; | |
| 
 | |
| class CalculateDurationTest extends TestCase | |
| { | |
|     public function testCanCalulateDurationViaApi(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'start' => [ | |
|                     'date' => '2024-08-10', | |
|                 ], | |
|                 'end' => [ | |
|                     'date' => '2024-08-21' | |
|                 ], | |
|             ]) | |
|             ->assertSuccessful() | |
|             ->assertJson(fn (AssertableJson $json) => $json | |
|                 ->has('data', fn (AssertableJson $json) => $json | |
|                     ->where('days', 12) | |
|                     ->where('weeks', 1) | |
|                     ->where('week_days', 8))); | |
|     } | |
| 
 | |
|     public function testCanCalulateDurationViaApiWithSecondsModifier(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'start' => [ | |
|                     'date' => '2024-08-10', | |
|                 ], | |
|                 'end' => [ | |
|                     'date' => '2024-08-21' | |
|                 ], | |
|                 'convert_to' => 'second', | |
|             ]) | |
|             ->assertSuccessful() | |
|             ->assertJson(fn (AssertableJson $json) => $json | |
|                 ->has('data', fn (AssertableJson $json) => $json | |
|                     ->where('days', 1036800) | |
|                     ->where('weeks', 604800) | |
|                     ->where('week_days', 691200))); | |
|     } | |
| 
 | |
|     public function testCanCalulateDurationViaApiWithHoursModifier(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'start' => [ | |
|                     'date' => '2024-08-10', | |
|                 ], | |
|                 'end' => [ | |
|                     'date' => '2024-08-21' | |
|                 ], | |
|                 'convert_to' => 'hour', | |
|             ]) | |
|             ->assertSuccessful() | |
|             ->assertJson(fn (AssertableJson $json) => $json | |
|                 ->has('data', fn (AssertableJson $json) => $json | |
|                     ->where('days', 288) | |
|                     ->where('weeks', 168) | |
|                     ->where('week_days', 192))); | |
|     } | |
| 
 | |
|     public function testCanCalulateDurationViaApiWithMinutesModifier(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'start' => [ | |
|                     'date' => '2024-08-10', | |
|                 ], | |
|                 'end' => [ | |
|                     'date' => '2024-08-21' | |
|                 ], | |
|                 'convert_to' => 'minute', | |
|             ]) | |
|             ->assertSuccessful() | |
|             ->assertJson(fn (AssertableJson $json) => $json | |
|                 ->has('data', fn (AssertableJson $json) => $json | |
|                     ->where('days', 17280) | |
|                     ->where('weeks', 10080) | |
|                     ->where('week_days', 11520))); | |
|     } | |
| 
 | |
|     public function testCanCalulateDurationViaApiWithYearsModifier(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'start' => [ | |
|                     'date' => '2024-08-10', | |
|                 ], | |
|                 'end' => [ | |
|                     'date' => '2024-08-21' | |
|                 ], | |
|                 'convert_to' => 'year', | |
|             ]) | |
|             ->assertSuccessful() | |
|             ->assertJson(fn (AssertableJson $json) => $json | |
|                 ->has('data', fn (AssertableJson $json) => $json | |
|                     ->where('days', 0.03288) | |
|                     ->where('weeks', 0.01918) | |
|                     ->where('week_days', 0.02192))); | |
|     } | |
| 
 | |
|     public function testCalculateDurationValidatesTimeFormat(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'start' => [ | |
|                     'date' => 'not valid', | |
|                 ], | |
|                 'end' => [ | |
|                     'date' => '10-09-1998', | |
|                 ], | |
|             ]) | |
|             ->assertStatus(422) | |
|             ->assertJsonValidationErrors([ | |
|                 'start.date' => 'match the format', | |
|                 'end.date' => 'match the format', | |
|             ]); | |
|     } | |
| 
 | |
|     public function testCalculateDurationValidatesTimeZones(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'start' => [ | |
|                     'timezone' => 'not valid', | |
|                 ], | |
|                 'end' => [ | |
|                     'timezone' => 'Australia/adelaide-but-misspelled-or-something', | |
|                 ], | |
|             ]) | |
|             ->assertStatus(422) | |
|             ->assertJsonValidationErrors([ | |
|                 'start.timezone' => 'valid timezone', | |
|                 'end.timezone' => 'valid timezone', | |
|             ]); | |
|     } | |
| 
 | |
|     public function testCalculateDurationValidatesConvertToValid(): void | |
|     { | |
|         $this | |
|             ->postJson('/calculate-duration', [ | |
|                 'convert_to' => 'invalid value', | |
|             ]) | |
|             ->assertStatus(422) | |
|             ->assertJsonValidationErrors([ | |
|                 'convert_to' => 'invalid', | |
|             ]); | |
|     } | |
| }
 |