diff --git a/lib/fbe/octo.rb b/lib/fbe/octo.rb index ee0ce178..4f5e072d 100644 --- a/lib/fbe/octo.rb +++ b/lib/fbe/octo.rb @@ -220,7 +220,7 @@ def user_name_by_id(id) # rubocop:disable Layout/EmptyLineBetweenDefs name = json[:login].downcase @loog.debug("GitHub user ##{id} has a name: @#{name}") name - rescue Octokit::NotFound, Octokit::Forbidden => e + rescue Octokit::NotFound, Octokit::Forbidden, Octokit::UnavailableForLegalReasons, Octokit::Deprecated => e raise(Fbe::Error, "GitHub user ##{id} is not accessible: #{e.message}") end def repo_id_by_name(name) # rubocop:disable Layout/EmptyLineBetweenDefs @@ -230,7 +230,7 @@ def repo_id_by_name(name) # rubocop:disable Layout/EmptyLineBetweenDefs raise(Fbe::Error, "Repository #{name} not found") if id.nil? @loog.debug("GitHub repository #{name.inspect} has an ID: ##{id}") id - rescue Octokit::NotFound, Octokit::Forbidden => e + rescue Octokit::NotFound, Octokit::Forbidden, Octokit::UnavailableForLegalReasons, Octokit::Deprecated => e raise(Fbe::Error, "GitHub repository #{name.inspect} is not accessible: #{e.message}") end def repo_name_by_id(id) # rubocop:disable Layout/EmptyLineBetweenDefs @@ -240,7 +240,7 @@ def repo_name_by_id(id) # rubocop:disable Layout/EmptyLineBetweenDefs name = json[:full_name].downcase @loog.debug("GitHub repository ##{id} has a name: #{name}") name - rescue Octokit::NotFound, Octokit::Forbidden => e + rescue Octokit::NotFound, Octokit::Forbidden, Octokit::UnavailableForLegalReasons, Octokit::Deprecated => e raise(Fbe::Error, "GitHub repository ##{id} is not accessible: #{e.message}") end # Disable auto pagination for octokit client called in block diff --git a/test/fbe/test_octo.rb b/test/fbe/test_octo.rb index 9efa8b8a..d5b9caf2 100644 --- a/test/fbe/test_octo.rb +++ b/test/fbe/test_octo.rb @@ -1672,4 +1672,48 @@ def test_fake_workflow_run_always_has_status refute_nil(result[:repository], "for workflow run #{id}") end end + + def test_repo_id_by_name_raises_on_legal_block + o = unreachable('repos/foo/dmca', 451) + assert_raises(Fbe::Error, 'raw error escapes for a repo blocked by law') { o.repo_id_by_name('foo/dmca') } + end + + def test_repo_id_by_name_raises_on_gone + o = unreachable('repos/foo/gone', 410) + assert_raises(Fbe::Error, 'raw error escapes for a gone repo') { o.repo_id_by_name('foo/gone') } + end + + def test_repo_name_by_id_raises_on_legal_block + o = unreachable('repositories/777', 451) + assert_raises(Fbe::Error, 'raw error escapes for a repo id blocked by law') { o.repo_name_by_id(777) } + end + + def test_repo_name_by_id_raises_on_gone + o = unreachable('repositories/778', 410) + assert_raises(Fbe::Error, 'raw error escapes for a gone repo id') { o.repo_name_by_id(778) } + end + + def test_user_name_by_id_raises_on_gone + o = unreachable('user/888', 410) + assert_raises(Fbe::Error, 'raw error escapes for a gone user') { o.user_name_by_id(888) } + end + + def test_user_name_by_id_raises_on_legal_block + o = unreachable('user/889', 451) + assert_raises(Fbe::Error, 'raw error escapes for a user blocked by law') { o.user_name_by_id(889) } + end + + private + + def unreachable(path, status) + WebMock.disable_net_connect! + stub_request(:get, 'https://api.github.com/rate_limit').to_return( + body: '{"rate":{"remaining":4000}}', + headers: { 'Content-Type' => 'application/json', 'X-RateLimit-Remaining' => '4000' } + ) + stub_request(:get, "https://api.github.com/#{path}").to_return( + status:, body: '{"message":"Ω blocked"}', headers: { 'Content-Type' => 'application/json' } + ) + Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new({ 'github_token' => '' })) + end end