feat(KAN-44): rebuild project repository settings
CI/CD / preconditions (pull_request) Successful in 1s
CI/CD / test_and_check_app (pull_request) Canceled after 0s
CI/CD / Publish immutable image (pull_request) Canceled after 0s

This commit is contained in:
2026-09-16 09:12:39 +02:00
parent b226ee8d48
commit fe4eed227e
3 changed files with 1188 additions and 618 deletions
@@ -63,6 +63,58 @@ class ProjectRepositorySettingsControllerTest extends TestCase
);
}
/**
* Ensure repository discovery distinguishes empty provider results from provider failures.
*/
public function test_repository_settings_expose_personal_access_and_provider_states(): void
{
$user = User::factory()->create();
$project = Project::factory()->create();
$emptyGitConnection = UserGitConnection::factory()->for($user)->create([
'account_login' => 'empty-account',
'base_url' => 'https://empty.git.test',
'provider' => GitProviderKey::Gitea,
]);
UserGitConnection::factory()->for($user)->create([
'account_login' => 'broken-account',
'base_url' => 'https://broken.git.test',
'provider' => GitProviderKey::Gitea,
]);
RepositoryConnection::factory()->for($project)->create([
'base_url' => $emptyGitConnection->base_url,
'provider' => GitProviderKey::Gitea,
]);
$this->syncProjectPermissions($project, $user, ['edit']);
Http::preventStrayRequests();
Http::fake([
'https://empty.git.test/api/v1/user/repos*' => Http::response([]),
'https://broken.git.test/api/v1/user/repos*' => Http::response([], 502),
]);
$this->actingAs($user)
->get(route('projects.settings.repositories', $project))
->assertOk()
->assertInertia(fn (Assert $page) => $page
->component('projects/settings/Repositories')
->has('availableRepositorySources', 2)
->where('availableRepositorySources', function ($sources): bool {
$sourcesByAccount = collect($sources)->keyBy('account_login');
$emptySource = $sourcesByAccount->get('empty-account');
$brokenSource = $sourcesByAccount->get('broken-account');
return data_get($emptySource, 'provider') === GitProviderKey::Gitea->value
&& data_get($emptySource, 'provider_label') === GitProviderKey::Gitea->label()
&& data_get($emptySource, 'repositories') === []
&& data_get($emptySource, 'error') === null
&& data_get($brokenSource, 'repositories') === []
&& data_get($brokenSource, 'error') === config('app.name').' could not load repositories from this Git connection right now.';
})
->where('repositoryConnections.0.has_personal_access', true),
);
}
/**
* Ensure users without edit permission cannot manage repository settings.
*/