mirror of
https://github.com/coollabsio/coolify.git
synced 2026-11-04 10:42:23 +00:00
97 lines
3.6 KiB
PHP
97 lines
3.6 KiB
PHP
<?php
|
|
|
|
use App\Jobs\ProcessGithubPullRequestWebhook;
|
|
use App\Models\Application;
|
|
use App\Models\Environment;
|
|
use App\Models\GiteaApp;
|
|
use App\Models\GithubApp;
|
|
use App\Models\Project;
|
|
use App\Models\Server;
|
|
use App\Models\Team;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Facades\Queue;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
Server::flushIdentityMap();
|
|
$this->team = Team::factory()->create();
|
|
$this->githubApp = GithubApp::create([
|
|
'name' => 'github-app',
|
|
'api_url' => 'https://api.github.com',
|
|
'html_url' => 'https://github.com',
|
|
'app_id' => 1234567890,
|
|
'webhook_secret' => 'test-secret',
|
|
'is_public' => false,
|
|
'team_id' => $this->team->id,
|
|
]);
|
|
$this->giteaApp = GiteaApp::create([
|
|
'name' => 'gitea-app',
|
|
'api_url' => 'https://gitea.example.com/api/v1',
|
|
'html_url' => 'https://gitea.example.com',
|
|
'team_id' => $this->team->id,
|
|
]);
|
|
// Both sources share the same id, so only source_type tells them apart.
|
|
expect($this->giteaApp->id)->toBe($this->githubApp->id);
|
|
});
|
|
|
|
function createSourceTypeIsolationApplication(Team $team, GiteaApp $source): Application
|
|
{
|
|
$project = Project::factory()->create(['team_id' => $team->id]);
|
|
$environment = Environment::factory()->create(['project_id' => $project->id]);
|
|
$server = Server::factory()->create(['team_id' => $team->id]);
|
|
$server->settings->update(['is_reachable' => true, 'is_usable' => true, 'force_disabled' => false]);
|
|
$destination = $server->standaloneDockers()->firstOrFail();
|
|
|
|
return Application::create([
|
|
'name' => 'gitea-sourced-app',
|
|
'git_repository' => 'test-org/test-repo',
|
|
'git_branch' => 'main',
|
|
'build_pack' => 'nixpacks',
|
|
'ports_exposes' => '3000',
|
|
'repository_project_id' => 987654321,
|
|
'source_id' => $source->id,
|
|
'source_type' => GiteaApp::class,
|
|
'environment_id' => $environment->id,
|
|
'destination_id' => $destination->id,
|
|
'destination_type' => $destination->getMorphClass(),
|
|
]);
|
|
}
|
|
|
|
it('does not route a GitHub App webhook to an application of another source type with the same id', function () {
|
|
Queue::fake();
|
|
createSourceTypeIsolationApplication($this->team, $this->giteaApp);
|
|
|
|
$body = json_encode([
|
|
'action' => 'closed',
|
|
'number' => 42,
|
|
'repository' => ['id' => 987654321, 'full_name' => 'test-org/test-repo'],
|
|
'pull_request' => [
|
|
'html_url' => 'https://github.com/test-org/test-repo/pull/42',
|
|
'title' => 'Change',
|
|
'author_association' => 'OWNER',
|
|
'head' => ['ref' => 'feature', 'sha' => 'e83c5163316f89bfbde7d9ab23ca2e25604af290'],
|
|
'base' => ['ref' => 'main'],
|
|
],
|
|
], JSON_THROW_ON_ERROR);
|
|
|
|
$response = $this->call('POST', '/webhooks/source/github/events', [], [], [], [
|
|
'HTTP_X-GitHub-Event' => 'pull_request',
|
|
'HTTP_X-GitHub-Hook-Installation-Target-Id' => '1234567890',
|
|
'HTTP_X-Hub-Signature-256' => 'sha256='.hash_hmac('sha256', $body, 'test-secret'),
|
|
'CONTENT_TYPE' => 'application/json',
|
|
], $body);
|
|
|
|
$response->assertOk();
|
|
expect($response->getContent())->toContain('Nothing to do');
|
|
Queue::assertNotPushed(ProcessGithubPullRequestWebhook::class);
|
|
});
|
|
|
|
it('does not block GitHub App deletion because of an application of another source type with the same id', function () {
|
|
createSourceTypeIsolationApplication($this->team, $this->giteaApp);
|
|
|
|
$this->githubApp->delete();
|
|
|
|
expect(GithubApp::find($this->githubApp->id))->toBeNull();
|
|
});
|