From c09a1e664a0f1aabc49b814797dd905ecfe0e59f Mon Sep 17 00:00:00 2001 From: EwelinaLasowy Date: Tue, 29 Mar 2022 10:40:51 +0200 Subject: [PATCH 1/6] - added some test --- .../Http/Controllers/GoogleController.php | 2 +- tests/Feature/MonthlyUsageTest.php | 32 ++++ tests/Feature/VacationCalendarTest.php | 33 ++++ tests/Feature/VacationRequestTest.php | 176 ++++++++++++++++++ 4 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/MonthlyUsageTest.php create mode 100644 tests/Feature/VacationCalendarTest.php diff --git a/app/Infrastructure/Http/Controllers/GoogleController.php b/app/Infrastructure/Http/Controllers/GoogleController.php index 6f15e8d..7733e7c 100644 --- a/app/Infrastructure/Http/Controllers/GoogleController.php +++ b/app/Infrastructure/Http/Controllers/GoogleController.php @@ -36,6 +36,6 @@ class GoogleController extends Controller $auth->guard()->login($user, true); - return redirect()->route("dashboard"); + return redirect()->intended(); } } diff --git a/tests/Feature/MonthlyUsageTest.php b/tests/Feature/MonthlyUsageTest.php new file mode 100644 index 0000000..cface61 --- /dev/null +++ b/tests/Feature/MonthlyUsageTest.php @@ -0,0 +1,32 @@ +admin()->createQuietly(); + + $this->actingAs($admin) + ->get("/monthly-usage") + ->assertOk(); + } + + public function testEmployeeCannotSeeVacationsMonthlyUsage(): void + { + $user = User::factory()->createQuietly(); + + $this->actingAs($user) + ->get("/monthly-usage") + ->assertForbidden(); + } +} diff --git a/tests/Feature/VacationCalendarTest.php b/tests/Feature/VacationCalendarTest.php new file mode 100644 index 0000000..e2e6f39 --- /dev/null +++ b/tests/Feature/VacationCalendarTest.php @@ -0,0 +1,33 @@ +createQuietly(); + $administrativeApprover = User::factory()->administrativeApprover()->createQuietly(); + + $this->actingAs($administrativeApprover) + ->get("/timesheet/january") + ->assertOk(); + } + + public function testEmployeeCannotDownloadTimesheet(): void + { + $user = User::factory()->createQuietly(); + + $this->actingAs($user) + ->get("/timesheet/january") + ->assertForbidden(); + } +} diff --git a/tests/Feature/VacationRequestTest.php b/tests/Feature/VacationRequestTest.php index 07bf8a5..9df10de 100644 --- a/tests/Feature/VacationRequestTest.php +++ b/tests/Feature/VacationRequestTest.php @@ -13,6 +13,7 @@ use Tests\FeatureTestCase; use Toby\Domain\Enums\VacationType; use Toby\Domain\PolishHolidaysRetriever; use Toby\Domain\States\VacationRequest\Approved; +use Toby\Domain\States\VacationRequest\Cancelled; use Toby\Domain\States\VacationRequest\Rejected; use Toby\Domain\States\VacationRequest\WaitingForAdministrative; use Toby\Domain\States\VacationRequest\WaitingForTechnical; @@ -430,4 +431,179 @@ class VacationRequestTest extends FeatureTestCase "vacationRequest" => __("The vacation request cannot be created at the turn of the year."), ]); } + + public function testEmployeeCanSeeOnlyHisVacationRequests(): void + { + $user = User::factory()->createQuietly(); + + $currentYearPeriod = YearPeriod::current(); + + VacationRequest::factory() + ->count(10) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + $this->actingAs($user) + ->get("/vacation-requests") + ->assertRedirect("/vacation-requests/me"); + } + + public function testEmployeeCannotCreateVacationRequestForAnotherEmployee(): void + { + $user = User::factory()->createQuietly(); + $anotherUser = User::factory()->createQuietly(); + + $currentYearPeriod = YearPeriod::current(); + + $this->actingAs($user) + ->post("/vacation-requests", [ + "user" => $anotherUser->id, + "type" => VacationType::Vacation->value, + "from" => Carbon::create($currentYearPeriod->year, 2, 7)->toDateString(), + "to" => Carbon::create($currentYearPeriod->year, 2, 11)->toDateString(), + "comment" => "Comment for the vacation request.", + ]) + ->assertForbidden(); + } + + public function testEmployeeCanCancelVacationRequestWithWaitingForAdministrativeStatus(): void + { + $user = User::factory()->createQuietly(); + $currentYearPeriod = YearPeriod::current(); + + VacationLimit::factory([ + "days" => 20, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + /** @var VacationRequest $vacationRequest */ + $vacationRequest = VacationRequest::factory([ + "state" => WaitingForAdministrative::class, + "type" => VacationType::Vacation, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + $this->actingAs($user) + ->post("/vacation-requests/{$vacationRequest->id}/cancel") + ->assertSessionHasNoErrors(); + + $vacationRequest->refresh(); + + $this->assertTrue($vacationRequest->state->equals(Cancelled::class)); + } + + public function testEmployeeCannotCancelVacationRequestWithApprovedStatus(): void + { + $user = User::factory()->createQuietly(); + $currentYearPeriod = YearPeriod::current(); + + VacationLimit::factory([ + "days" => 20, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + /** @var VacationRequest $vacationRequest */ + $vacationRequest = VacationRequest::factory([ + "state" => Approved::class, + "type" => VacationType::Vacation, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + $this->actingAs($user) + ->post("/vacation-requests/{$vacationRequest->id}/cancel") + ->assertStatus(403); + } + + public function testAdministrativeApproverCanCancelVacationRequestWithApprovedStatus(): void + { + $user = User::factory()->createQuietly(); + $administrativeApprover = User::factory()->administrativeApprover()->createQuietly(); + $currentYearPeriod = YearPeriod::current(); + + VacationLimit::factory([ + "days" => 20, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + /** @var VacationRequest $vacationRequest */ + $vacationRequest = VacationRequest::factory([ + "state" => Approved::class, + "type" => VacationType::Vacation, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + $this->actingAs($administrativeApprover) + ->post("/vacation-requests/{$vacationRequest->id}/cancel") + ->assertSessionHasNoErrors(); + + $vacationRequest->refresh(); + + $this->assertTrue($vacationRequest->state->equals(Cancelled::class)); + } + + public function testEmployeeCanDownloadHisVacationRequestAsPdf(): void + { + $user = User::factory()->createQuietly(); + $currentYearPeriod = YearPeriod::current(); + + VacationLimit::factory([ + "days" => 20, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + /** @var VacationRequest $vacationRequest */ + $vacationRequest = VacationRequest::factory([ + "state" => WaitingForTechnical::class, + "type" => VacationType::Vacation, + ]) + ->for($user) + ->for($currentYearPeriod) + ->create(); + + $this->actingAs($user) + ->get("/vacation-requests/{$vacationRequest->id}/download") + ->assertSessionHasNoErrors(); + } + + public function testEmployeeCannotDownloadAnotherEmployeesVacationRequestAsPdf(): void + { + $user = User::factory()->createQuietly(); + $anotherUser = User::factory()->createQuietly(); + $currentYearPeriod = YearPeriod::current(); + + VacationLimit::factory([ + "days" => 20, + ]) + ->for($anotherUser) + ->for($currentYearPeriod) + ->create(); + + /** @var VacationRequest $vacationRequest */ + $vacationRequest = VacationRequest::factory([ + "state" => WaitingForTechnical::class, + "type" => VacationType::Vacation, + ]) + ->for($anotherUser) + ->for($currentYearPeriod) + ->create(); + + $this->actingAs($user) + ->get("/vacation-requests/{$vacationRequest->id}/download") + ->assertForbidden(); + } } -- 2.52.0 From 435158f426edb7b2811ebc52826d408ce89dff1c Mon Sep 17 00:00:00 2001 From: EwelinaLasowy Date: Tue, 29 Mar 2022 10:59:48 +0200 Subject: [PATCH 2/6] - cr fix --- tests/Feature/VacationRequestTest.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/Feature/VacationRequestTest.php b/tests/Feature/VacationRequestTest.php index 9df10de..2612fcb 100644 --- a/tests/Feature/VacationRequestTest.php +++ b/tests/Feature/VacationRequestTest.php @@ -436,14 +436,6 @@ class VacationRequestTest extends FeatureTestCase { $user = User::factory()->createQuietly(); - $currentYearPeriod = YearPeriod::current(); - - VacationRequest::factory() - ->count(10) - ->for($user) - ->for($currentYearPeriod) - ->create(); - $this->actingAs($user) ->get("/vacation-requests") ->assertRedirect("/vacation-requests/me"); @@ -520,7 +512,7 @@ class VacationRequestTest extends FeatureTestCase $this->actingAs($user) ->post("/vacation-requests/{$vacationRequest->id}/cancel") - ->assertStatus(403); + ->assertForbidden(); } public function testAdministrativeApproverCanCancelVacationRequestWithApprovedStatus(): void -- 2.52.0 From 93f0151b14d32677983ddbe5edbf33031ed55151 Mon Sep 17 00:00:00 2001 From: Adrian Hopek Date: Tue, 29 Mar 2022 13:40:56 +0200 Subject: [PATCH 3/6] wip --- app/Eloquent/Helpers/YearPeriodRetriever.php | 8 +- .../Http/Controllers/GoogleController.php | 2 +- resources/js/Composables/yearPeriodInfo.js | 4 +- resources/js/Pages/Calendar.vue | 21 +++-- resources/js/Pages/VacationLimits.vue | 2 +- resources/js/Pages/VacationRequest/Create.vue | 8 +- resources/js/Pages/VacationRequest/Index.vue | 8 +- .../VacationRequest/IndexForApprovers.vue | 10 +-- resources/js/Pages/VacationRequest/Show.vue | 23 +++--- resources/js/Shared/MainMenu.vue | 73 +++++++++-------- .../Widgets/PendingVacationRequests.vue | 4 +- .../Shared/Widgets/UserVacationRequests.vue | 4 +- resources/js/app.js | 2 +- routes/web.php | 78 +++++++++---------- 14 files changed, 126 insertions(+), 121 deletions(-) diff --git a/app/Eloquent/Helpers/YearPeriodRetriever.php b/app/Eloquent/Helpers/YearPeriodRetriever.php index 1cf3999..ad8b98f 100644 --- a/app/Eloquent/Helpers/YearPeriodRetriever.php +++ b/app/Eloquent/Helpers/YearPeriodRetriever.php @@ -30,13 +30,15 @@ class YearPeriodRetriever public function links(): array { - $current = $this->selected(); + $selected = $this->selected(); + $current = $this->current(); - $years = YearPeriod::query()->whereIn("year", $this->offset($current->year))->get(); + $years = YearPeriod::query()->whereIn("year", $this->offset($selected->year))->get(); $navigation = $years->map(fn(YearPeriod $yearPeriod) => $this->toNavigation($yearPeriod)); return [ - "current" => $current->year, + "current" => $this->toNavigation($current), + "selected" => $this->toNavigation($selected), "navigation" => $navigation->toArray(), ]; } diff --git a/app/Infrastructure/Http/Controllers/GoogleController.php b/app/Infrastructure/Http/Controllers/GoogleController.php index 6f15e8d..7733e7c 100644 --- a/app/Infrastructure/Http/Controllers/GoogleController.php +++ b/app/Infrastructure/Http/Controllers/GoogleController.php @@ -36,6 +36,6 @@ class GoogleController extends Controller $auth->guard()->login($user, true); - return redirect()->route("dashboard"); + return redirect()->intended(); } } diff --git a/resources/js/Composables/yearPeriodInfo.js b/resources/js/Composables/yearPeriodInfo.js index ec799da..b62eb05 100644 --- a/resources/js/Composables/yearPeriodInfo.js +++ b/resources/js/Composables/yearPeriodInfo.js @@ -2,8 +2,8 @@ import { computed } from 'vue' import { usePage } from '@inertiajs/inertia-vue3' export default function useCurrentYearPeriodInfo() { - const minDate = computed(() => new Date(usePage().props.value.years.current, 0, 1)) - const maxDate = computed(() => new Date(usePage().props.value.years.current, 11, 31)) + const minDate = computed(() => new Date(usePage().props.value.years.selected.year, 0, 1)) + const maxDate = computed(() => new Date(usePage().props.value.years.selected.year, 11, 31)) return { minDate, diff --git a/resources/js/Pages/Calendar.vue b/resources/js/Pages/Calendar.vue index 812055f..6014f57 100644 --- a/resources/js/Pages/Calendar.vue +++ b/resources/js/Pages/Calendar.vue @@ -10,7 +10,7 @@ @@ -23,7 +23,7 @@