115 lines
4.0 KiB
PHP
115 lines
4.0 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../includes/providers/interface-repository-provider.php';
|
|
require_once __DIR__ . '/../includes/providers/class-github-provider.php';
|
|
|
|
/**
|
|
* @covers \GitHub_Provider
|
|
*/
|
|
class GitHub_Provider_Test extends \PHPUnit\Framework\TestCase {
|
|
|
|
protected function setUp(): void {
|
|
\Brain\Monkey\setUp();
|
|
}
|
|
|
|
protected function tearDown(): void {
|
|
\Brain\Monkey\tearDown();
|
|
}
|
|
|
|
private function make( string $token = '' ): GitHub_Provider {
|
|
return new GitHub_Provider( 'https://github.com/owner/repo', $token );
|
|
}
|
|
|
|
public function test_get_id_and_label(): void {
|
|
$p = $this->make();
|
|
$this->assertSame( 'github', $p->get_id() );
|
|
$this->assertSame( 'GitHub', $p->get_label() );
|
|
}
|
|
|
|
public function test_get_repo_data_normalizes_response(): void {
|
|
\Brain\Monkey\Functions\expect( 'wp_remote_get' )
|
|
->once()
|
|
->with( 'https://api.github.com/repos/owner/repo', \Brain\Monkey\Actions\anyArgs() )
|
|
->andReturn( [
|
|
'response' => [ 'code' => 200 ],
|
|
'headers' => [],
|
|
'body' => json_encode( [
|
|
'owner' => [
|
|
'avatar_url' => 'https://avatars.example/owner.png',
|
|
'login' => 'owner',
|
|
'html_url' => 'https://github.com/owner',
|
|
],
|
|
'updated_at' => '2026-01-02T03:04:05Z',
|
|
'language' => 'PHP',
|
|
'license' => [ 'name' => 'MIT' ],
|
|
'stargazers_count' => 42,
|
|
'forks_count' => 7,
|
|
'open_issues_count' => 3,
|
|
] ),
|
|
] );
|
|
|
|
$data = $this->make()->get_repo_data();
|
|
|
|
$this->assertSame( 'owner', $data['owner']['login'] );
|
|
$this->assertSame( 42, $data['stargazers_count'] );
|
|
$this->assertSame( 'MIT', $data['license']['name'] );
|
|
}
|
|
|
|
public function test_release_url_prefers_zip_asset(): void {
|
|
$release_body = json_encode( [
|
|
'tag_name' => 'v1.2.3',
|
|
'assets' => [
|
|
[ 'name' => 'project.tar.gz', 'browser_download_url' => 'https://example/x.tar.gz' ],
|
|
[ 'name' => 'project.zip', 'browser_download_url' => 'https://example/x.zip' ],
|
|
],
|
|
] );
|
|
|
|
\Brain\Monkey\Functions\expect( 'wp_remote_get' )
|
|
->twice()
|
|
->with( 'https://api.github.com/repos/owner/repo/releases/latest', \Brain\Monkey\Actions\anyArgs() )
|
|
->andReturn( [
|
|
'response' => [ 'code' => 200 ],
|
|
'headers' => [],
|
|
'body' => $release_body,
|
|
] );
|
|
|
|
$this->assertSame( 'https://example/x.zip', $this->make()->get_release_url() );
|
|
$this->assertSame( 'v1.2.3', $this->make()->get_latest_version() );
|
|
}
|
|
|
|
public function test_release_url_falls_back_to_zipball(): void {
|
|
$release_body = json_encode( [
|
|
'tag_name' => 'v0.0.1',
|
|
'zipball_url' => 'https://api.github.com/repos/owner/repo/zipball/v0.0.1',
|
|
'assets' => [],
|
|
] );
|
|
|
|
\Brain\Monkey\Functions\expect( 'wp_remote_get' )
|
|
->once()
|
|
->andReturn( [
|
|
'response' => [ 'code' => 200 ],
|
|
'headers' => [],
|
|
'body' => $release_body,
|
|
] );
|
|
|
|
$this->assertSame(
|
|
'https://api.github.com/repos/owner/repo/zipball/v0.0.1',
|
|
$this->make()->get_release_url()
|
|
);
|
|
}
|
|
|
|
public function test_repo_browse_url_returns_input(): void {
|
|
$this->assertSame(
|
|
'https://github.com/owner/repo',
|
|
$this->make()->get_repo_browse_url()
|
|
);
|
|
}
|
|
|
|
public function test_http_failure_returns_null(): void {
|
|
\Brain\Monkey\Functions\expect( 'wp_remote_get' )
|
|
->once()
|
|
->andReturn( new \WP_Error( 'http_error', 'boom' ) );
|
|
|
|
$this->assertNull( $this->make()->get_repo_data() );
|
|
}
|
|
}
|