retrospring/spec/lib/use_case/report/create_spec.rb
2025-03-09 19:43:52 +01:00

99 lines
2.7 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
describe UseCase::Report::Create do
subject do
UseCase::Report::Create.call(
reporter_id: reporter.id,
object_id: object_id,
object_type: object_type,
reason: reason,
)
end
let(:reason) { "Inappropriate content" }
shared_examples "creates the report" do
it "creates the report" do
expect { subject }.to change { Report.count }.by(1)
report = Report.last
expect(report.reason).to eq(reason)
expect(report.user_id).to eq(reporter.id)
expect(report.target_id).to eq(object.id)
expect(report.type).to eq("Reports::#{object.class}")
end
end
shared_examples "invalid object type" do
it "raises an error" do
expect { subject }.to raise_error(Errors::BadRequest, "Unknown object type")
end
end
shared_examples "object not found" do
it "raises an error" do
expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
end
end
context "valid object type and existing object" do
let(:reporter) { FactoryBot.create(:user) }
context "object type is 'user'" do
let(:object_type) { "user" }
let(:object) { FactoryBot.create(:user) }
let(:object_id) { object.screen_name }
it_behaves_like "creates the report"
end
context "object type is 'question'" do
let(:object_type) { "question" }
let(:object) { FactoryBot.create(:question) }
let(:object_id) { object.id.to_s }
it_behaves_like "creates the report"
end
context "object type is 'answer'" do
let(:object_type) { "answer" }
let(:object) { FactoryBot.create(:answer, user: FactoryBot.create(:user)) }
let(:object_id) { object.id.to_s }
it_behaves_like "creates the report"
end
context "object type is 'comment'" do
let(:object_type) { "comment" }
let(:object) do
FactoryBot.create(:comment,
answer: FactoryBot.create(:answer, user: FactoryBot.create(:user)),
user: FactoryBot.create(:user),)
end
let(:object_id) { object.id.to_s }
it_behaves_like "creates the report"
end
end
context "invalid object type" do
let(:reporter) { FactoryBot.create(:user) }
let(:object_type) { "invalid_type" }
let(:object_id) { "1" }
it_behaves_like "invalid object type"
end
context "non-existing object" do
let(:reporter) { FactoryBot.create(:user) }
let(:object_type) { "question" }
let(:object_id) { "999" }
before do
allow(Question).to receive(:find).and_raise(ActiveRecord::RecordNotFound)
end
it_behaves_like "object not found"
end
end