Compare commits
	
		
			1 Commits
		
	
	
		
			26220f1025
			...
			#17-dusk-t
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 03f1295194 | 
| @@ -19,8 +19,8 @@ DB_PASSWORD=password | |||||||
|  |  | ||||||
| BROADCAST_DRIVER=log | BROADCAST_DRIVER=log | ||||||
| CACHE_DRIVER=array | CACHE_DRIVER=array | ||||||
| QUEUE_CONNECTION=redis | QUEUE_CONNECTION=sync | ||||||
| SESSION_DRIVER=redis | SESSION_DRIVER=file | ||||||
| SESSION_LIFETIME=120 | SESSION_LIFETIME=120 | ||||||
| FILESYSTEM_DISK=local | FILESYSTEM_DISK=local | ||||||
| MAIL_MAILER=array | MAIL_MAILER=array | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								app/Architecture/Providers/DuskServiceProvider.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								app/Architecture/Providers/DuskServiceProvider.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | declare(strict_types=1); | ||||||
|  |  | ||||||
|  | namespace Toby\Architecture\Providers; | ||||||
|  |  | ||||||
|  | use Illuminate\Support\ServiceProvider; | ||||||
|  | use Laravel\Dusk\Browser; | ||||||
|  |  | ||||||
|  | class DuskServiceProvider extends ServiceProvider | ||||||
|  | { | ||||||
|  |     public function boot(): void | ||||||
|  |     { | ||||||
|  |         Browser::macro("fillMonth", function ($month) { | ||||||
|  |             $this->select("div.flatpickr-calendar > div.flatpickr-months select", $month - 1); | ||||||
|  |             return $this; | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         Browser::macro("fillDay", function ($day) { | ||||||
|  |             $this->click("div.flatpickr-calendar.animate.arrowTop.arrowLeft.open > div.flatpickr-innerContainer > div > div.flatpickr-days > div > span:nth-child({$day})"); | ||||||
|  |             return $this; | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -24,12 +24,12 @@ | |||||||
|     }, |     }, | ||||||
|     "require-dev": { |     "require-dev": { | ||||||
|         "blumilksoftware/codestyle": "^0.10.0", |         "blumilksoftware/codestyle": "^0.10.0", | ||||||
|         "spatie/laravel-ignition": "^1.0", |  | ||||||
|         "fakerphp/faker": "^1.9.1", |         "fakerphp/faker": "^1.9.1", | ||||||
|         "laravel/dusk": "^6.21", |         "laravel/dusk": "^6.22", | ||||||
|         "mockery/mockery": "^1.4.4", |         "mockery/mockery": "^1.4.4", | ||||||
|         "nunomaduro/collision": "^6.1", |         "nunomaduro/collision": "^6.1", | ||||||
|         "phpunit/phpunit": "^9.5.10" |         "phpunit/phpunit": "^9.5.10", | ||||||
|  |         "spatie/laravel-ignition": "^1.0" | ||||||
|     }, |     }, | ||||||
|     "autoload": { |     "autoload": { | ||||||
|         "psr-4": { |         "psr-4": { | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", |         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", | ||||||
|         "This file is @generated automatically" |         "This file is @generated automatically" | ||||||
|     ], |     ], | ||||||
|     "content-hash": "937eef6310bd4bb12f1d0ccb623946d1", |     "content-hash": "9dcd821442cec43ff77ef5045cd041c8", | ||||||
|     "packages": [ |     "packages": [ | ||||||
|         { |         { | ||||||
|             "name": "asm89/stack-cors", |             "name": "asm89/stack-cors", | ||||||
| @@ -10986,5 +10986,5 @@ | |||||||
|         "ext-pdo": "*" |         "ext-pdo": "*" | ||||||
|     }, |     }, | ||||||
|     "platform-dev": [], |     "platform-dev": [], | ||||||
|     "plugin-api-version": "2.1.0" |     "plugin-api-version": "2.2.0" | ||||||
| } | } | ||||||
|   | |||||||
| @@ -44,5 +44,6 @@ return [ | |||||||
|         Toby\Architecture\Providers\TelescopeServiceProvider::class, |         Toby\Architecture\Providers\TelescopeServiceProvider::class, | ||||||
|         Toby\Architecture\Providers\ObserverServiceProvider::class, |         Toby\Architecture\Providers\ObserverServiceProvider::class, | ||||||
|         Barryvdh\DomPDF\ServiceProvider::class, |         Barryvdh\DomPDF\ServiceProvider::class, | ||||||
|  |         Toby\Architecture\Providers\DuskServiceProvider::class, | ||||||
|     ], |     ], | ||||||
| ]; | ]; | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
|     "name": "toby", |     "name": "application", | ||||||
|     "lockfileVersion": 2, |     "lockfileVersion": 2, | ||||||
|     "requires": true, |     "requires": true, | ||||||
|     "packages": { |     "packages": { | ||||||
|   | |||||||
| @@ -121,7 +121,7 @@ | |||||||
|                     > |                     > | ||||||
|                   </span> |                   </span> | ||||||
|                   <div class="ml-3"> |                   <div class="ml-3"> | ||||||
|                     <div class="text-sm font-medium text-gray-900"> |                     <div class="text-sm font-medium text-gray-900" dusk="name-input"> | ||||||
|                       {{ auth.user.name }} |                       {{ auth.user.name }} | ||||||
|                     </div> |                     </div> | ||||||
|                   </div> |                   </div> | ||||||
| @@ -139,6 +139,7 @@ | |||||||
|               <div class="mt-1 relative sm:mt-0 sm:col-span-2"> |               <div class="mt-1 relative sm:mt-0 sm:col-span-2"> | ||||||
|                 <ListboxButton |                 <ListboxButton | ||||||
|                   class="bg-white relative w-full max-w-lg border rounded-md shadow-sm pl-3 pr-10 py-2 text-left cursor-default sm:text-sm focus:ring-1" |                   class="bg-white relative w-full max-w-lg border rounded-md shadow-sm pl-3 pr-10 py-2 text-left cursor-default sm:text-sm focus:ring-1" | ||||||
|  |                   dusk="type-select" | ||||||
|                   :class="{ 'border-red-300 text-red-900 focus:outline-none focus:ring-red-500 focus:border-red-500': form.errors.type, 'focus:ring-blumilk-500 focus:border-blumilk-500 sm:text-sm border-gray-300': !form.errors.type }" |                   :class="{ 'border-red-300 text-red-900 focus:outline-none focus:ring-red-500 focus:border-red-500': form.errors.type, 'focus:ring-blumilk-500 focus:border-blumilk-500 sm:text-sm border-gray-300': !form.errors.type }" | ||||||
|                 > |                 > | ||||||
|                   <span class="block truncate">{{ form.type.label }}</span> |                   <span class="block truncate">{{ form.type.label }}</span> | ||||||
| @@ -154,6 +155,7 @@ | |||||||
|                 > |                 > | ||||||
|                   <ListboxOptions |                   <ListboxOptions | ||||||
|                     class="absolute z-10 mt-1 w-full max-w-lg bg-white shadow-lg max-h-60 rounded-md py-1 text-base ring-1 ring-black ring-opacity-5 overflow-auto focus:outline-none sm:text-sm" |                     class="absolute z-10 mt-1 w-full max-w-lg bg-white shadow-lg max-h-60 rounded-md py-1 text-base ring-1 ring-black ring-opacity-5 overflow-auto focus:outline-none sm:text-sm" | ||||||
|  |                     dusk="type-options" | ||||||
|                   > |                   > | ||||||
|                     <ListboxOption |                     <ListboxOption | ||||||
|                       v-for="type in vacationTypes" |                       v-for="type in vacationTypes" | ||||||
| @@ -163,7 +165,7 @@ | |||||||
|                       :value="type" |                       :value="type" | ||||||
|                     > |                     > | ||||||
|                       <li |                       <li | ||||||
|                         :class="[active ? 'text-white bg-blumilk-600' : 'text-gray-900', 'cursor-default select-none relative py-2 pl-3 pr-9']" |                         :class="[active ? 'text-white bg-blumilk-600' : 'text-gray-900', 'cursor-default select-none relative py-2 pl-3 pr-9']" :dusk="type.value" | ||||||
|                       > |                       > | ||||||
|                         <span :class="[selected ? 'font-semibold' : 'font-normal', 'block truncate']"> |                         <span :class="[selected ? 'font-semibold' : 'font-normal', 'block truncate']"> | ||||||
|                           {{ type.label }} |                           {{ type.label }} | ||||||
| @@ -194,7 +196,7 @@ | |||||||
|               > |               > | ||||||
|                 Planowany urlop od |                 Planowany urlop od | ||||||
|               </label> |               </label> | ||||||
|               <div class="mt-1 sm:mt-0 sm:col-span-2"> |               <div class="mt-1 sm:mt-0 sm:col-span-2" dusk="date-from-input"> | ||||||
|                 <FlatPickr |                 <FlatPickr | ||||||
|                   id="date_from" |                   id="date_from" | ||||||
|                   v-model="form.from" |                   v-model="form.from" | ||||||
| @@ -212,7 +214,7 @@ | |||||||
|                 </p> |                 </p> | ||||||
|               </div> |               </div> | ||||||
|             </div> |             </div> | ||||||
|             <div class="sm:grid sm:grid-cols-3 py-4 items-center"> |             <div class="sm:grid sm:grid-cols-3 py-4 items-center" dusk="date-to-input"> | ||||||
|               <label |               <label | ||||||
|                 for="date_from" |                 for="date_from" | ||||||
|                 class="block text-sm font-medium text-gray-700 sm:mt-px" |                 class="block text-sm font-medium text-gray-700 sm:mt-px" | ||||||
| @@ -258,6 +260,7 @@ | |||||||
|                   v-model="form.comment" |                   v-model="form.comment" | ||||||
|                   rows="4" |                   rows="4" | ||||||
|                   class="shadow-sm focus:ring-blumilk-500 focus:border-blumilk-500 block w-full max-w-lg sm:text-sm border-gray-300 rounded-md" |                   class="shadow-sm focus:ring-blumilk-500 focus:border-blumilk-500 block w-full max-w-lg sm:text-sm border-gray-300 rounded-md" | ||||||
|  |                   dusk="comment-input" | ||||||
|                 /> |                 /> | ||||||
|               </div> |               </div> | ||||||
|             </div> |             </div> | ||||||
| @@ -296,6 +299,7 @@ | |||||||
|                 type="submit" |                 type="submit" | ||||||
|                 :disabled="form.processing" |                 :disabled="form.processing" | ||||||
|                 class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blumilk-600 hover:bg-blumilk-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blumilk-500" |                 class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blumilk-600 hover:bg-blumilk-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blumilk-500" | ||||||
|  |                 dusk="save-button" | ||||||
|               > |               > | ||||||
|                 Zapisz |                 Zapisz | ||||||
|               </button> |               </button> | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ | |||||||
|         <InertiaLink |         <InertiaLink | ||||||
|           href="/vacation-requests/create" |           href="/vacation-requests/create" | ||||||
|           class="inline-flex items-center px-4 py-3 border border-transparent text-sm leading-4 font-medium rounded-md shadow-sm text-white bg-blumilk-600 hover:bg-blumilk-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blumilk-500" |           class="inline-flex items-center px-4 py-3 border border-transparent text-sm leading-4 font-medium rounded-md shadow-sm text-white bg-blumilk-600 hover:bg-blumilk-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blumilk-500" | ||||||
|  |           dusk="create-vacation-request-button" | ||||||
|         > |         > | ||||||
|           Dodaj wniosek |           Dodaj wniosek | ||||||
|         </InertiaLink> |         </InertiaLink> | ||||||
|   | |||||||
| @@ -119,6 +119,7 @@ | |||||||
|               v-for="item in navigation" |               v-for="item in navigation" | ||||||
|               :key="item.name" |               :key="item.name" | ||||||
|               :href="item.href" |               :href="item.href" | ||||||
|  |               :dusk="item.dusk" | ||||||
|               :class="[$page.url === item.href ? 'bg-blumilk-800 text-white' : 'text-blumilk-100 hover:text-white hover:bg-blumilk-600', 'group flex items-center px-2 py-2 text-sm leading-6 font-medium rounded-md']" |               :class="[$page.url === item.href ? 'bg-blumilk-800 text-white' : 'text-blumilk-100 hover:text-white hover:bg-blumilk-600', 'group flex items-center px-2 py-2 text-sm leading-6 font-medium rounded-md']" | ||||||
|             > |             > | ||||||
|               <component |               <component | ||||||
| @@ -329,12 +330,12 @@ export default { | |||||||
|  |  | ||||||
|     const navigation = computed(() => |     const navigation = computed(() => | ||||||
|       [ |       [ | ||||||
|         {name: 'Moje wnioski', href: '/vacation-requests/me', icon: DocumentTextIcon, can: true}, |         {name: 'Moje wnioski', href: '/vacation-requests/me', icon: DocumentTextIcon, can: true, dusk: 'my-vacation-requests-menu-item'}, | ||||||
|         {name: 'Wnioski urlopowe', href: '/vacation-requests', icon: CollectionIcon, can: auth.value.can.listAllVacationRequests}, |         {name: 'Wnioski urlopowe', href: '/vacation-requests', icon: CollectionIcon, can: auth.value.can.listAllVacationRequests, dusk: 'vacation-requests-menu-item'}, | ||||||
|         {name: 'Kalendarz urlopów', href: '/vacation-calendar', icon: CalendarIcon, can: true}, |         {name: 'Kalendarz urlopów', href: '/vacation-calendar', icon: CalendarIcon, can: true, dusk: 'vacation-calendar-menu-item'}, | ||||||
|         {name: 'Dni wolne', href: '/holidays', icon: StarIcon, can: true}, |         {name: 'Dni wolne', href: '/holidays', icon: StarIcon, can: true, dusk: 'holidays-menu-item'}, | ||||||
|         {name: 'Limity urlopów', href: '/vacation-limits', icon: SunIcon, can: auth.value.can.manageVacationLimits}, |         {name: 'Limity urlopów', href: '/vacation-limits', icon: SunIcon, can: auth.value.can.manageVacationLimits, dusk: 'vacation-limits-menu-item'}, | ||||||
|         {name: 'Użytkownicy', href: '/users', icon: UserGroupIcon, can: auth.value.can.manageUsers}, |         {name: 'Użytkownicy', href: '/users', icon: UserGroupIcon, can: auth.value.can.manageUsers, dusk: 'users-menu-item'}, | ||||||
|       ].filter(item => item.can)) |       ].filter(item => item.can)) | ||||||
|  |  | ||||||
|     const userNavigation = [ |     const userNavigation = [ | ||||||
|   | |||||||
| @@ -1,39 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| declare(strict_types=1); |  | ||||||
|  |  | ||||||
| namespace Tests\Browser; |  | ||||||
|  |  | ||||||
| use Illuminate\Foundation\Testing\DatabaseMigrations; |  | ||||||
| use Laravel\Dusk\Browser; |  | ||||||
| use Tests\Browser\Pages\HomePage; |  | ||||||
| use Tests\DuskTestCase; |  | ||||||
| use Toby\Eloquent\Models\User; |  | ||||||
|  |  | ||||||
| class AuthenticationTest extends DuskTestCase |  | ||||||
| { |  | ||||||
|     use DatabaseMigrations; |  | ||||||
|  |  | ||||||
|     protected User $user; |  | ||||||
|  |  | ||||||
|     protected function setUp(): void |  | ||||||
|     { |  | ||||||
|         parent::setUp(); |  | ||||||
|         $this->user = User::factory()->create(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public function testUserCanLogout(): void |  | ||||||
|     { |  | ||||||
|         $this->browse(function (Browser $browser): void { |  | ||||||
|             $browser->loginAs($this->user) |  | ||||||
|                 ->visit(new HomePage()) |  | ||||||
|                 ->assertVisible("@user-menu") |  | ||||||
|                 ->click("@user-menu") |  | ||||||
|                 ->assertVisible("@user-menu-list") |  | ||||||
|                 ->assertSee("Sign out") |  | ||||||
|                 ->press("Sign out") |  | ||||||
|                 ->on(new HomePage()) |  | ||||||
|                 ->waitFor("@login-link"); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										84
									
								
								tests/Browser/VacationRequestTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								tests/Browser/VacationRequestTest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | declare(strict_types=1); | ||||||
|  |  | ||||||
|  | namespace Tests\Browser; | ||||||
|  |  | ||||||
|  | use Illuminate\Foundation\Testing\DatabaseMigrations; | ||||||
|  | use Illuminate\Support\Carbon; | ||||||
|  | use Illuminate\Support\Str; | ||||||
|  | use Laravel\Dusk\Browser; | ||||||
|  | use Tests\Browser\Pages\HomePage; | ||||||
|  | use Tests\DuskTestCase; | ||||||
|  | use Tests\Traits\InteractsWithYearPeriods; | ||||||
|  | use Toby\Domain\Enums\EmploymentForm; | ||||||
|  | use Toby\Domain\Enums\Role; | ||||||
|  | use Toby\Eloquent\Models\User; | ||||||
|  | use Toby\Eloquent\Models\VacationLimit; | ||||||
|  | use Toby\Eloquent\Models\VacationRequest; | ||||||
|  | use Toby\Eloquent\Models\YearPeriod; | ||||||
|  |  | ||||||
|  | class VacationRequestTest extends DuskTestCase | ||||||
|  | { | ||||||
|  |     use DatabaseMigrations; | ||||||
|  |     use InteractsWithYearPeriods; | ||||||
|  |  | ||||||
|  |     protected User $employee; | ||||||
|  |  | ||||||
|  |     protected function setUp(): void | ||||||
|  |     { | ||||||
|  |         parent::setUp(); | ||||||
|  |         Carbon::setTestNow(Carbon::createFromDate(2022, 1, 1)); | ||||||
|  |         $this->createCurrentYearPeriod(); | ||||||
|  |  | ||||||
|  |         $currentYearPeriod = YearPeriod::query()->where("year", 2022)->first(); | ||||||
|  |  | ||||||
|  |         $this->employee = User::factory([ | ||||||
|  |             "first_name" => "Jan", | ||||||
|  |             "last_name" => "Kowalski", | ||||||
|  |             "email" => env("LOCAL_EMAIL_FOR_LOGIN_VIA_GOOGLE"), | ||||||
|  |             "employment_form" => EmploymentForm::EmploymentContract, | ||||||
|  |             "position" => "programista", | ||||||
|  |             "role" => Role::Employee, | ||||||
|  |             "employment_date" => Carbon::createFromDate(2022, 01, 03), | ||||||
|  |             "remember_token" => Str::random(10), | ||||||
|  |         ]) | ||||||
|  |             ->create(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         VacationLimit::factory([ | ||||||
|  |             "days" => 26, | ||||||
|  |         ]) | ||||||
|  |             ->for($currentYearPeriod) | ||||||
|  |             ->for($this->employee) | ||||||
|  |             ->create(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public function testUserCanCreateVacationRequest(): void | ||||||
|  |     { | ||||||
|  |         $this->browse(function (Browser $browser): void { | ||||||
|  |             $browser->loginAs($this->employee) | ||||||
|  |                 ->visit(new HomePage()) | ||||||
|  |                 ->click("@my-vacation-requests-menu-item") | ||||||
|  |                 ->waitForLocation("/vacation-requests/me") | ||||||
|  |                 ->click("@create-vacation-request-button") | ||||||
|  |                 ->waitForLocation("/vacation-requests/create") | ||||||
|  |                 ->assertSeeIn("@name-input", $this->employee->fullName) | ||||||
|  |                 ->click("@type-select") | ||||||
|  |                 ->assertVisible("@type-options") | ||||||
|  |                 ->click("@vacation") | ||||||
|  |                 ->click("@date-from-input") | ||||||
|  |                 ->fillMonth("2") | ||||||
|  |                 ->fillDay("22") | ||||||
|  | //                ->clickAndWaitForReload("@save-button"); | ||||||
|  |                 ->press("Zapisz"); | ||||||
|  |  | ||||||
|  | //                ->waitForLocation("/vacation-requests/1") | ||||||
|  | //                ->screenshot("xd") | ||||||
|  | //            ; | ||||||
|  |         }); | ||||||
|  |         $vacationRequest = VacationRequest::query()->first(); | ||||||
|  |         dd($vacationRequest); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								tests/Browser/console/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								tests/Browser/console/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | * | ||||||
|  | !.gitignore | ||||||
		Reference in New Issue
	
	Block a user