mirror of
https://github.com/coollabsio/coolify.git
synced 2025-12-28 05:34:50 +00:00
Fixed multiple issues with GitHub App source creation and management: 1. **Fixed null property assignment error on component mount** - Changed property types to nullable in Change component (appId, installationId, clientId, etc.) - Updated validation rules to allow nullable values - Allows mounting component with newly created GitHub Apps that don't have these fields set yet 2. **Fixed Livewire morphing error on manual creation** - Modified createGithubAppManually() to redirect after saving - Prevents "Cannot read properties of null" error when view structure changes - Fields now properly populated after manual creation without requiring page refresh 3. **Fixed is_system_wide not being saved on creation** - Removed backwards logic that only saved is_system_wide on cloud instances - Added is_system_wide to GithubApp model casts for proper boolean handling - System-wide checkbox now works correctly on self-hosted instances 4. **Fixed misleading preview deployment checkbox** - Removed instantSave attribute from permission checkboxes in unconfigured state - These are configuration options for GitHub App creation, not database fields - Prevents "GitHub App updated" success message when nothing was actually saved 5. **Added validation for Refetch Permissions button** - Validates App ID and Private Key are set before attempting to fetch - Shows clear error messages: "Cannot fetch permissions. Please set the following required fields first: App ID, Private Key" - Prevents crash when private key is null or invalid 6. **Better error handling for unsupported private key formats** - Detects OpenSSH format keys vs RSA PEM format - Shows helpful message: "Please use an RSA private key in PEM format (BEGIN RSA PRIVATE KEY). OpenSSH format keys are not supported." - GitHub Apps require RSA PEM format, not OpenSSH format 7. **Made GitHub App view mobile responsive** - Updated all flex layouts to stack vertically on mobile (flex-col sm:flex-row) - Form fields, buttons, and sections now properly responsive - No more cut-off fields on small screens Added comprehensive test coverage: - GithubSourceChangeTest.php with 7 tests - GithubSourceCreateTest.php with 6 tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
3.8 KiB
PHP
109 lines
3.8 KiB
PHP
<?php
|
|
|
|
use App\Livewire\Source\Github\Create;
|
|
use App\Models\GithubApp;
|
|
use App\Models\Team;
|
|
use App\Models\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Livewire\Livewire;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
// Create a team with owner
|
|
$this->team = Team::factory()->create();
|
|
$this->user = User::factory()->create();
|
|
$this->team->members()->attach($this->user->id, ['role' => 'owner']);
|
|
|
|
// Set current team
|
|
$this->actingAs($this->user);
|
|
session(['currentTeam' => $this->team]);
|
|
});
|
|
|
|
describe('GitHub Source Create Component', function () {
|
|
test('creates github app with default values', function () {
|
|
Livewire::test(Create::class)
|
|
->assertSuccessful()
|
|
->set('name', 'my-test-app')
|
|
->call('createGitHubApp')
|
|
->assertRedirect();
|
|
|
|
$githubApp = GithubApp::where('name', 'my-test-app')->first();
|
|
|
|
expect($githubApp)->not->toBeNull();
|
|
expect($githubApp->name)->toBe('my-test-app');
|
|
expect($githubApp->api_url)->toBe('https://api.github.com');
|
|
expect($githubApp->html_url)->toBe('https://github.com');
|
|
expect($githubApp->custom_user)->toBe('git');
|
|
expect($githubApp->custom_port)->toBe(22);
|
|
expect($githubApp->is_system_wide)->toBeFalse();
|
|
expect($githubApp->team_id)->toBe($this->team->id);
|
|
});
|
|
|
|
test('creates github app with system wide enabled', function () {
|
|
Livewire::test(Create::class)
|
|
->assertSuccessful()
|
|
->set('name', 'system-wide-app')
|
|
->set('is_system_wide', true)
|
|
->call('createGitHubApp')
|
|
->assertRedirect();
|
|
|
|
$githubApp = GithubApp::where('name', 'system-wide-app')->first();
|
|
|
|
expect($githubApp)->not->toBeNull();
|
|
expect($githubApp->is_system_wide)->toBeTrue();
|
|
});
|
|
|
|
test('creates github app with custom organization', function () {
|
|
Livewire::test(Create::class)
|
|
->assertSuccessful()
|
|
->set('name', 'org-app')
|
|
->set('organization', 'my-org')
|
|
->call('createGitHubApp')
|
|
->assertRedirect();
|
|
|
|
$githubApp = GithubApp::where('name', 'org-app')->first();
|
|
|
|
expect($githubApp)->not->toBeNull();
|
|
expect($githubApp->organization)->toBe('my-org');
|
|
});
|
|
|
|
test('creates github app with custom git settings', function () {
|
|
Livewire::test(Create::class)
|
|
->assertSuccessful()
|
|
->set('name', 'enterprise-app')
|
|
->set('api_url', 'https://github.enterprise.com/api/v3')
|
|
->set('html_url', 'https://github.enterprise.com')
|
|
->set('custom_user', 'git-custom')
|
|
->set('custom_port', 2222)
|
|
->call('createGitHubApp')
|
|
->assertRedirect();
|
|
|
|
$githubApp = GithubApp::where('name', 'enterprise-app')->first();
|
|
|
|
expect($githubApp)->not->toBeNull();
|
|
expect($githubApp->api_url)->toBe('https://github.enterprise.com/api/v3');
|
|
expect($githubApp->html_url)->toBe('https://github.enterprise.com');
|
|
expect($githubApp->custom_user)->toBe('git-custom');
|
|
expect($githubApp->custom_port)->toBe(2222);
|
|
});
|
|
|
|
test('validates required fields', function () {
|
|
Livewire::test(Create::class)
|
|
->assertSuccessful()
|
|
->set('name', '')
|
|
->call('createGitHubApp')
|
|
->assertHasErrors(['name']);
|
|
});
|
|
|
|
test('redirects to github app show page after creation', function () {
|
|
$component = Livewire::test(Create::class)
|
|
->set('name', 'redirect-test')
|
|
->call('createGitHubApp');
|
|
|
|
$githubApp = GithubApp::where('name', 'redirect-test')->first();
|
|
|
|
$component->assertRedirect(route('source.github.show', ['github_app_uuid' => $githubApp->uuid]));
|
|
});
|
|
});
|