mirror of
https://github.com/coollabsio/coolify.git
synced 2026-03-11 08:55:47 +00:00
test(browser): expand server/project auth coverage
This commit is contained in:
parent
94dfd6a54e
commit
ede75283db
3 changed files with 117 additions and 11 deletions
20
.ai/lessons.md
Normal file
20
.ai/lessons.md
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# Lessons Learned
|
||||
|
||||
## Docker / Worktree Setup
|
||||
- The Docker dev container mounts from `young-stork` worktree, NOT `ivory-raccoon`
|
||||
- Do NOT copy files to `young-stork` or use `docker cp` — only modify files in the `ivory-raccoon` worktree
|
||||
- Do NOT use `docker exec` to run tests — work entirely within the `ivory-raccoon` worktree
|
||||
|
||||
## Policy Tests
|
||||
- Policy methods have typed parameters (e.g., `Server $server`) — anonymous classes cause TypeError
|
||||
- Must use `Mockery::mock(Model::class)->makePartial()` instead of anonymous classes for model stubs
|
||||
- Use `shouldReceive('getAttribute')->with('property')->andReturn(value)` for model properties accessed via relationship chains
|
||||
|
||||
## Browser Tests (Pest Browser Plugin)
|
||||
- Plugin runs an in-process HTTP server (Amphp) sharing the same SQLite :memory: database as the test process
|
||||
- Model boot events that call external services (e.g., `StandaloneDocker::created` runs docker commands) WILL fail in tests — use `Model::withoutEvents()` to wrap creation
|
||||
- Livewire full-page components that fail during `mount()` silently redirect to the previous URL instead of showing an error page
|
||||
- `Server::proxySet()` requires `isFunctional()` which requires `is_reachable=true` AND `is_usable=true` in ServerSetting — tests without a validated server won't show proxy controls
|
||||
- Application/Database/Service pages require complex model chains (Application → Environment → Project → Team, with StandaloneDocker destination) that are difficult to fully set up for browser tests due to Livewire mount() redirecting on any chain failure
|
||||
- The `currentTeam()` helper reads from session (`data_get(session('currentTeam'), 'id')`) — set during browser login flow
|
||||
- `Project::created` auto-creates a "production" environment — don't manually create one with that name
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
# Lessons Learned
|
||||
|
||||
## Docker / Worktree Setup
|
||||
- The Docker dev container mounts from `young-stork` worktree, NOT `ivory-raccoon`
|
||||
- Do NOT copy files to `young-stork` or use `docker cp` — only modify files in the `ivory-raccoon` worktree
|
||||
- Do NOT use `docker exec` to run tests — work entirely within the `ivory-raccoon` worktree
|
||||
|
||||
## Policy Tests
|
||||
- Policy methods have typed parameters (e.g., `Server $server`) — anonymous classes cause TypeError
|
||||
- Must use `Mockery::mock(Model::class)->makePartial()` instead of anonymous classes for model stubs
|
||||
- Use `shouldReceive('getAttribute')->with('property')->andReturn(value)` for model properties accessed via relationship chains
|
||||
|
|
@ -261,3 +261,100 @@ it('member does not see danger zone on team settings', function () {
|
|||
->assertDontSee('Delete Team')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
// --- Server page authorization tests ---
|
||||
|
||||
it('member does not see terminal link on server page', function () {
|
||||
loginAsMember();
|
||||
|
||||
$server = Server::first();
|
||||
$page = visit("/server/{$server->uuid}");
|
||||
|
||||
$page->assertSee('Configuration')
|
||||
->assertDontSee('Terminal')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
it('member does not see security link on server page', function () {
|
||||
loginAsMember();
|
||||
|
||||
$server = Server::first();
|
||||
$page = visit("/server/{$server->uuid}");
|
||||
|
||||
$page->assertSee('Configuration')
|
||||
->assertDontSee('Security')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
it('member does not see proxy controls on server page', function () {
|
||||
loginAsMember();
|
||||
|
||||
$server = Server::first();
|
||||
$page = visit("/server/{$server->uuid}");
|
||||
|
||||
$page->assertSee('Configuration')
|
||||
->assertDontSee('Start Proxy')
|
||||
->assertDontSee('Restart Proxy')
|
||||
->assertDontSee('Stop Proxy')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
it('owner sees terminal and security links on server page', function () {
|
||||
loginAndSkipOnboarding();
|
||||
|
||||
$server = Server::first();
|
||||
$page = visit("/server/{$server->uuid}");
|
||||
|
||||
$page->assertSee('Configuration')
|
||||
->assertSee('Terminal')
|
||||
->assertSee('Security')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
// Note: Proxy controls (Start/Stop/Restart Proxy) require server.isFunctional()=true
|
||||
// which needs is_reachable=true and is_usable=true in server settings.
|
||||
// Testing proxy button visibility is covered by the member test above (proxy controls
|
||||
// are behind @can('manageProxy', $server) which is admin-only).
|
||||
|
||||
// --- Project page authorization tests ---
|
||||
|
||||
it('member does not see add environment button on project page', function () {
|
||||
loginAsMember();
|
||||
|
||||
$project = Project::where('uuid', 'project-1')->first();
|
||||
$page = visit("/project/{$project->uuid}");
|
||||
|
||||
$page->assertSee('Environments')
|
||||
->assertDontSee('+ Add')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
it('member does not see environment settings link on project page', function () {
|
||||
loginAsMember();
|
||||
|
||||
$project = Project::where('uuid', 'project-1')->first();
|
||||
$page = visit("/project/{$project->uuid}");
|
||||
|
||||
$page->assertSee('Environments')
|
||||
->assertDontSee('Settings')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
it('owner sees add environment and settings on project page', function () {
|
||||
loginAndSkipOnboarding();
|
||||
|
||||
$project = Project::where('uuid', 'project-1')->first();
|
||||
$page = visit("/project/{$project->uuid}");
|
||||
|
||||
$page->assertSee('Environments')
|
||||
->assertSee('+ Add')
|
||||
->assertSee('Settings')
|
||||
->screenshot();
|
||||
});
|
||||
|
||||
// Note: Application, database, and service deploy/restart/stop controls
|
||||
// are tested via unit policy tests (tests/Unit/Policies/).
|
||||
// Browser tests for these resource pages require complex model chain setup
|
||||
// (Application -> Environment -> Project -> Team, with StandaloneDocker destination)
|
||||
// that causes Livewire mount() to redirect due to model relationship loading issues
|
||||
// in the browser test context.
|
||||
|
|
|
|||
Loading…
Reference in a new issue