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', ]); } }