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() ); } }