docbrown/spec/models/github_issue_spec.rb
rhymes ae8a58fec2
[deploy] Decouple GitHub authentication from fetching GitHub issues (#7660)
* Improve error handling

* Add tests for Github::Client

* Add GithubIssue validation

* Refactor GithubIssue and fix bug with pull requests

* Improve tests

* Fix PR API URL generation

* Improve logic and get rid of the issue fragment

* Fix disappeared avatar

* Improve rendering

* Activate client side caching using Redis

* Remove unnecessary file

* Add RemoveGithubIssues data update script

* Fix comma

* Forgot to disable the approvals verify text

* Apply PR feedback
2020-05-04 16:17:16 -04:00

105 lines
3.8 KiB
Ruby

require "rails_helper"
RSpec.describe GithubIssue, type: :model, vcr: true do
let(:url_issue) { "https://api.github.com/repos/thepracticaldev/dev.to/issues/7434" }
let(:url_pull_request) { "https://api.github.com/repos/thepracticaldev/dev.to/pulls/7653" }
let(:url_comment) { "https://api.github.com/repos/thepracticaldev/dev.to/issues/comments/621043602" }
let(:url_not_found) { "https://api.github.com/repos/thepracticaldev/dev.to/issues/0" }
it { is_expected.to validate_length_of(:url).is_at_most(400) }
it { is_expected.to validate_inclusion_of(:category).in_array(%w[issue issue_comment]) }
it { is_expected.to validate_presence_of(:url) }
describe ".find_or_fetch" do
context "when retrieving an issue", vcr: { cassette_name: "github_client_issue" } do
it "saves a new issue" do
expect do
described_class.find_or_fetch(url_issue)
end.to change(described_class, :count).by(1)
end
it "retrieves an existing issue" do
created_issue = described_class.find_or_fetch(url_issue)
expect do
found_issue = described_class.find_or_fetch(url_issue)
expect(found_issue.id).to eq(created_issue.id)
end.not_to change(described_class, :count)
end
it "saves the proper fields" do
issue = described_class.find_or_fetch(url_issue)
expect(issue.url).to eq(url_issue)
expect(issue.issue_serialized[:title]).to be_present
expect(issue.category).to eq("issue")
end
end
context "when retrieving a pull request", vcr: { cassette_name: "github_client_pull_request" } do
it "saves a new issue" do
expect do
described_class.find_or_fetch(url_pull_request)
end.to change(described_class, :count).by(1)
end
it "retrieves an existing issue" do
created_issue = described_class.find_or_fetch(url_pull_request)
expect do
found_issue = described_class.find_or_fetch(url_pull_request)
expect(found_issue.id).to eq(created_issue.id)
end.not_to change(described_class, :count)
end
it "saves the proper fields" do
issue = described_class.find_or_fetch(url_pull_request)
expect(issue.url).to eq(url_pull_request)
expect(issue.issue_serialized[:title]).to be_present
expect(issue.category).to eq("issue")
end
end
context "when retrieving a comment", vcr: { cassette_name: "github_client_comment" } do
it "saves a new issue comment" do
expect do
described_class.find_or_fetch(url_comment)
end.to change(described_class, :count).by(1)
end
it "retrieves an existing issue comment" do
created_issue = described_class.find_or_fetch(url_comment)
expect do
found_issue = described_class.find_or_fetch(url_comment)
expect(found_issue.id).to eq(created_issue.id)
end.not_to change(described_class, :count)
end
it "saves the proper fields" do
issue = described_class.find_or_fetch(url_comment)
expect(issue.url).to eq(url_comment)
expect(issue.issue_serialized[:title]).not_to be_present
expect(issue.issue_serialized[:body]).to be_present
expect(issue.category).to eq("issue_comment")
end
end
end
xit "saves HTML in .processed_html" do
VCR.use_cassette("github_client_issue") do
issue = described_class.find_or_fetch(url_issue)
Approvals.verify(issue.processed_html, name: "github_client_issue", format: :html)
end
end
it "raises Github::Errors::NotFound if the issue is not found" do
VCR.use_cassette("github_client_issue_not_found") do
expect do
described_class.find_or_fetch(url_not_found)
end.to raise_error(Github::Errors::NotFound)
end
end
end