function ( $post_id, $key, $single = false ) use ( $provider_meta ) { return $provider_meta[ $key ] ?? ''; }, 'get_option' => function ( $key, $default = '' ) use ( $options ) { return $options[ $key ] ?? $default; }, ] ); } public function test_defaults_to_github_when_provider_meta_missing(): void { $this->stub_meta( [ '_projects_portfolio_github_url' => 'https://github.com/owner/repo', ] ); $provider = projects_portfolio_get_provider( 42 ); $this->assertSame( 'github', $provider->get_id() ); $this->assertSame( 'https://github.com/owner/repo', $provider->get_repo_browse_url() ); } public function test_uses_repo_url_when_provider_explicit(): void { $this->stub_meta( [ '_projects_portfolio_provider' => 'gitea', '_projects_portfolio_repo_url' => 'https://codeberg.org/owner/repo', ], [ 'projects_portfolio_default_gitea_base_url' => 'https://codeberg.org', 'projects_portfolio_gitea_api_token' => 'gitea-token', ] ); $provider = projects_portfolio_get_provider( 7 ); $this->assertSame( 'gitea', $provider->get_id() ); } public function test_per_project_gitea_base_overrides_global(): void { $this->stub_meta( [ '_projects_portfolio_provider' => 'gitea', '_projects_portfolio_repo_url' => 'https://git.example.org/owner/repo', '_projects_portfolio_gitea_base_url' => 'https://git.example.org', ], [ 'projects_portfolio_default_gitea_base_url' => 'https://codeberg.org', ] ); $provider = projects_portfolio_get_provider( 7 ); $this->assertSame( 'https://git.example.org/owner/repo', $provider->get_repo_browse_url() ); } }