Files
ubicloud/spec/lib/github_spec.rb
Jeremy Evans eff0bb2b60 Call original Clog.emit message when mocking in the tests
This makes sure to yield to the block and test that there aren't
errors inside of it.
2025-05-31 01:20:38 +09:00

95 lines
4.5 KiB
Ruby

# frozen_string_literal: true
RSpec.describe Github do
it "creates oauth client" do
expect(Octokit::Client).to receive(:new).with(client_id: Config.github_app_client_id, client_secret: Config.github_app_client_secret)
described_class.oauth_client
end
it "creates app client" do
expect(Config).to receive(:github_app_id).and_return("123456")
private_key = instance_double(OpenSSL::PKey::RSA)
expect(private_key).to receive(:is_a?).with(OpenSSL::PKey::RSA).and_return(true)
expect(private_key).to receive(:sign).and_return("signed")
expect(OpenSSL::PKey::RSA).to receive(:new).and_return(private_key)
expect(Octokit::Client).to receive(:new).with(bearer_token: anything)
described_class.app_client
end
it "creates installation client" do
installation_id = 123
app_client = instance_double(Octokit::Client)
expect(described_class).to receive(:app_client).and_return(app_client)
expect(app_client).to receive(:create_app_installation_access_token).with(installation_id).and_return({token: "abcdefg"})
installation_client = instance_double(Octokit::Client)
expect(installation_client).to receive(:auto_paginate=).with(true)
expect(Octokit::Client).to receive(:new).with(access_token: "abcdefg").and_return(installation_client)
described_class.installation_client(installation_id)
end
it "can map alias to actual label" do
labels = described_class.runner_labels
expect(labels["ubicloud"]).to eq(labels["ubicloud-standard-2-ubuntu-2204"])
expect(labels["ubicloud-standard-8"]).to eq(labels["ubicloud-standard-8-ubuntu-2204"])
expect(labels["ubicloud-standard-4-arm"]).to eq(labels["ubicloud-standard-4-arm-ubuntu-2204"])
end
it "can map all aliases to actual tag" do
expect(described_class.runner_labels.values).to be_all
end
it ".failed_deliveries" do
time = Time.now
app_client = instance_double(Octokit::Client)
expect(described_class).to receive(:app_client).and_return(app_client)
expect(app_client).to receive(:get).with("/app/hook/deliveries?per_page=100").and_return([
{guid: "1", status: "Fail", delivered_at: time + 5},
{guid: "2", status: "Fail", delivered_at: time + 4},
{guid: "3", status: "OK", delivered_at: time + 3}
])
next_url = "/app/hook/deliveries?per_page=100&cursor=next_page"
expect(app_client).to receive(:last_response).and_return(instance_double(Sawyer::Response, rels: {next: instance_double(Sawyer::Relation, href: next_url)}))
expect(app_client).to receive(:last_response).and_return(instance_double(Sawyer::Response, rels: {next: nil}))
expect(app_client).to receive(:get).with(next_url).and_return([
{guid: "2", status: "OK", delivered_at: time + 2},
{guid: "4", status: "Fail", delivered_at: time + 2},
{guid: "4", status: "Fail", delivered_at: time + 1},
{guid: "5", status: "Fail", delivered_at: time - 2},
{guid: "6", status: "OK", delivered_at: time - 3}
])
failed_deliveries = described_class.failed_deliveries(time)
expect(failed_deliveries).to eq([
{guid: "1", status: "Fail", delivered_at: time + 5},
{guid: "4", status: "Fail", delivered_at: time + 2}
])
end
it ".failed_deliveries with max page" do
time = Time.now
app_client = instance_double(Octokit::Client)
expect(described_class).to receive(:app_client).and_return(app_client)
expect(app_client).to receive(:get).with("/app/hook/deliveries?per_page=100").and_return([
{guid: "3", status: "Fail", delivered_at: time + 3}
])
expect(app_client).to receive(:last_response).and_return(instance_double(Sawyer::Response, rels: {next: instance_double(Sawyer::Relation, href: "next_url")}))
expect(Clog).to receive(:emit).with("failed deliveries page limit reached").and_call_original
expect(Clog).to receive(:emit).with("fetched deliveries").and_call_original
failed_deliveries = described_class.failed_deliveries(time, 1)
expect(failed_deliveries).to eq([{guid: "3", status: "Fail", delivered_at: time + 3}])
end
it ".redeliver_failed_deliveries" do
time = Time.now
app_client = instance_double(Octokit::Client)
expect(described_class).to receive(:app_client).and_return(app_client)
expect(described_class).to receive(:failed_deliveries).with(time).and_return([{id: "1"}, {id: "2"}])
expect(app_client).to receive(:post).with("/app/hook/deliveries/1/attempts")
expect(app_client).to receive(:post).with("/app/hook/deliveries/2/attempts")
described_class.redeliver_failed_deliveries(time)
end
end