diff --git a/app/Http/Controllers/ServiceController.php b/app/Http/Controllers/ServiceController.php index a0e69e2..4bdaf83 100644 --- a/app/Http/Controllers/ServiceController.php +++ b/app/Http/Controllers/ServiceController.php @@ -79,7 +79,7 @@ public function link(Request $request): RedirectResponse ); Log::info( - get_class($this) . ': ' . $service->name . ' service could not be linked to user ' . $user->username, + get_class($this) . ': ' . ($service?->name ?? 'The requested') . ' service could not be linked to user ' . $user->username, [$e->getMessage()], ); } diff --git a/storage/everestpass-private.key.test b/storage/everestpass-private.key.test new file mode 100644 index 0000000..c599de6 --- /dev/null +++ b/storage/everestpass-private.key.test @@ -0,0 +1,179 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +W7u7b6lws0L1ggaBuIpTb/i8QJVkTIl1Cs8CnA== +=eRJ8 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/Feature/ServiceTest.php b/tests/Feature/ServiceTest.php new file mode 100644 index 0000000..848f346 --- /dev/null +++ b/tests/Feature/ServiceTest.php @@ -0,0 +1,262 @@ +user = User::factory()->create(); + $this->service = Service::factory()->create(); + } + + private function postLinkService(int $serviceId): TestResponse + { + return $this->post(route('services.link', [ + 'serviceId' => $serviceId, + ])); + } + + public function test_guest_user_redirected_to_login_screen(): void + { + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect('/login'); + } + + public function test_user_cannot_link_disabled_service(): void + { + Event::fake(); + + $this->service->is_enabled = false; + $this->service->save(); + + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect('/'); + + Event::assertDispatched( + MessageLogged::class, + fn (MessageLogged $event) => + $event->level === 'info' && + Str::endsWith($event->message, 'The requested service could not be linked to user ' . $this->user->username), + ); + } + + public function test_user_cannot_link_private_service_when_they_are_not_an_admin(): void + { + Event::fake(); + + $this->service->is_public = false; + $this->service->save(); + + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect('/'); + + Event::assertDispatched( + MessageLogged::class, + fn (MessageLogged $event) => + $event->level === 'info' && + Str::endsWith($event->message, 'The requested service could not be linked to user ' . $this->user->username), + ); + } + + public function test_user_can_link_basic_service(): void + { + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect('/'); + + $this->assertSame($this->service->id, $this->user->services()->first()->id); + } + + public function test_user_can_link_private_service_when_they_are_an_admin(): void + { + $this->user->is_admin = true; + $this->user->save(); + + $this->service->is_public = false; + $this->service->save(); + + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect('/'); + + $this->assertSame($this->service->id, $this->user->services()->first()->id); + } + + public function test_user_can_link_everest_cloud_service(): void + { + $this->service->name = 'EverestCloud'; + $this->service->save(); + + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect($this->service->link . '/apps/sociallogin/custom_oauth2/everestserver'); + } + + public function test_user_can_link_everest_git_service(): void + { + $this->service->name = 'EverestGit'; + $this->service->save(); + + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect($this->service->link . '/-/profile/account'); + } + + public function test_user_can_link_everest_pass_service_when_they_already_have_an_account(): void + { + Event::fake(); + + Http::preventStrayRequests(); + Http::fake([ + 'https://pass.everestserver.test/users.json*' => Http::response([ + 'header' => [ + 'action' => 'd7bc9044-a64e-5421-a4d7-7a94eaa39d37', + 'code' => Response::HTTP_OK, + 'id' => 'e0d97447-5c53-4b32-a1b2-fc845b297233', + 'message' => 'The operation was successful.', + 'pagination' => [ + 'count' => 1, + 'limit' => null, + 'page' => 1 + ], + 'servertime' => 1718455537, + 'status' => 'success', + 'url' => '/users.json?filter%5Bsearch%5D=test%40test.com', + ], + 'body' => [ + 'id' => 'ea1b1541-cce2-4b51-8df6-ea38b86845be', + 'username' => 'test@test.com', + ], + ], Response::HTTP_OK), + ]); + + Config::set('services.everestpass.private_key.path', storage_path('everestpass-private.key.test')); + Config::set('services.everestpass.private_key.passphrase', 'zaq1@WSX'); + + Cache::set(EverestPassClient::SESSION_CACHE_KEY, Str::random(26), 600); + Cache::set(EverestPassClient::CSRF_TOKEN_CACHE_KEY, Str::random(128), 600); + + $this->service->name = 'EverestPass'; + $this->service->link = 'https://pass.everestserver.test'; + $this->service->save(); + + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect('/'); + + $this->assertSame($this->service->id, $this->user->services()->first()->id); + $this->assertSame($this->user->email, $this->user->services()->first()->pivot->identifier); + + Event::assertDispatched( + MessageLogged::class, + fn (MessageLogged $event) => $event->level === 'info' && Str::endsWith($event->message, 'EverestPass account found'), + ); + } + + public function test_user_can_link_everest_pass_service_when_they_do_not_have_an_account_yet(): void + { + Event::fake(); + + Http::preventStrayRequests(); + Http::fake([ + 'https://pass.everestserver.test/users.json*' => Http::sequence() + ->push([ + 'header' => [ + 'action' => 'd7bc9044-a64e-5421-a4d7-7a94eaa39d37', + 'code' => Response::HTTP_OK, + 'id' => 'e0d97447-5c53-4b32-a1b2-fc845b297233', + 'message' => 'The operation was successful.', + 'pagination' => [ + 'count' => 0, + 'limit' => null, + 'page' => 1, + ], + 'servertime' => 1718455537, + 'status' => 'success', + 'url' => '/users.json?filter%5Bsearch%5D=test%40test.com', + ], + 'body' => [], + ], Response::HTTP_OK) + ->push([ + 'header' => [ + 'action' => 'a1a15b91-72f6-5708-8d7f-6940e51d8595', + 'code' => Response::HTTP_OK, + 'id' => 'ba3771c4-b343-4c27-8e62-6a606d2af9ff', + 'message' => 'The user was successfully added. This user now need to complete the setup.', + 'servertime' => 1718456839, + 'status' => 'success', + 'url' => '/users.json', + ], + 'body' => [ + 'id' => '4e1a73f8-9299-4f01-be5c-a9d608b21c93', + 'username' => 'test@test.com', + ], + ], Response::HTTP_OK), + ]); + + Config::set('services.everestpass.private_key.path', storage_path('everestpass-private.key.test')); + Config::set('services.everestpass.private_key.passphrase', 'zaq1@WSX'); + + Cache::set(EverestPassClient::SESSION_CACHE_KEY, Str::random(26), 600); + Cache::set(EverestPassClient::CSRF_TOKEN_CACHE_KEY, Str::random(128), 600); + + $this->service->name = 'EverestPass'; + $this->service->link = 'https://pass.everestserver.test'; + $this->service->save(); + + $this->actingAs($this->user); + + $response = $this->postLinkService($this->service->id); + + $response->assertRedirect('/'); + + $this->assertSame($this->service->id, $this->user->services()->first()->id); + $this->assertSame($this->user->email, $this->user->services()->first()->pivot->identifier); + + Event::assertDispatched( + MessageLogged::class, + fn (MessageLogged $event) => $event->level === 'info' && Str::endsWith($event->message, 'EverestPass account created'), + ); + } +}