after('class="application-details-card">') ->before('') ->toString(); expect($applicationDetails) ->toContain('') ->toContain('x-on:click="$wire.dispatch(\'loadCompose\', false)"') ->toContain('Reload compose'); }); test('docker compose heading separates its title and action', function () { $view = file_get_contents(resource_path('views/livewire/project/application/general.blade.php')); expect($view) ->toContain('
') ->toContain('
'); }); test('unsaved changes ignore compose initialization state', function () { $view = file_get_contents(resource_path('views/livewire/project/application/general.blade.php')); $unsavedBar = str($view) ->after('before('/>') ->toString(); expect($unsavedBar) ->toContain('targets="') ->toContain('name,description') ->not->toContain('initLoadingCompose') ->not->toContain('dockerComposeRaw') ->not->toContain('dockerCompose,'); }); test('onboarding uses the reusable advanced settings component', function () { $view = file_get_contents(resource_path('views/livewire/project/application/general.blade.php')); $onboarding = file_get_contents(resource_path('views/livewire/boarding/index.blade.php')); expect($view) ->toContain('id="dockerComposeCustomBuildCommand"') ->not->toContain('') ->not->toContain('The following commands are for advanced use cases.') ->and($onboarding) ->toContain('