Files
redux-scraper/spec/jobs/domain/fa/job/user_avatar_job_spec.rb
2025-02-25 19:59:41 +00:00

182 lines
5.0 KiB
Ruby

# typed: false
require "rails_helper"
describe Domain::Fa::Job::UserAvatarJob do
let(:user) { create(:domain_user_fa_user, url_name: "meesh", name: "Meesh") }
let(:http_client_mock) { instance_double("::Scraper::HttpClient") }
before { Scraper::ClientFactory.http_client_mock = http_client_mock }
let!(:avatar) do
create(
:domain_user_avatar,
log_entry: nil,
user: create(:domain_user_fa_user, url_name: "meesh", name: "Meesh"),
)
end
let(:avatar_fixture_file) do
SpecUtil.read_fixture_file(
"domain/fa/job/meesh_avatar_file.gif",
mode: "rb",
)
end
let(:avatar_fixture_file_404) do
SpecUtil.read_fixture_file("domain/fa/job/404_avatar_file.gif", mode: "rb")
end
let(:avatar_fixture_file_2) do
SpecUtil.read_fixture_file(
"domain/fa/job/roadkillxing_avatar_file.gif",
mode: "rb",
)
end
shared_context "avatar file found" do
before do
@log_entries =
HttpClientMockHelpers.init_http_client_mock(
http_client_mock,
[
{
uri: "https://a.furaffinity.net/0/meesh.gif",
status_code: 200,
content_type: "image/gif",
contents: avatar_fixture_file,
},
],
)
end
end
shared_context "avatar file not found" do
before do
@log_entries =
HttpClientMockHelpers.init_http_client_mock(
http_client_mock,
[
{
uri: "https://a.furaffinity.net/0/meesh.gif",
status_code: 404,
content_type: "image/gif",
contents: avatar_fixture_file_404,
},
],
)
end
end
shared_context "avatar file is a server error" do
before do
@log_entries =
HttpClientMockHelpers.init_http_client_mock(
http_client_mock,
[
{
uri: "https://a.furaffinity.net/0/meesh.gif",
status_code: 500,
content_type: "text/html",
contents: "Server Error",
},
],
)
end
end
context "the user model exists" do
context "the server response is 200" do
include_context "avatar file found"
it "sets the file and the right state" do
perform_now({ avatar: })
avatar.reload
expect(avatar).not_to be_nil
expect(avatar.state).to eq("ok")
expect(avatar.log_entry).to eq(@log_entries[0])
expect(avatar.downloaded_at).to be_within(1.seconds).of(Time.now)
end
context "the avatar model has a file already" do
it "sets file to the new file" do
avatar.state = :ok
first_log_entry =
create(
:http_log_entry,
response:
create(
:blob_file,
contents: avatar_fixture_file_2,
content_type: "image/gif",
),
)
avatar.log_entry = first_log_entry
avatar.save!
perform_now({ avatar:, force_scan: true })
avatar.reload
expect(avatar.state).to eq("ok")
expect(avatar.log_entry).to eq(@log_entries[0])
expect(avatar.downloaded_at).to be_within(1.seconds).of(Time.now)
end
end
end
context "the server response is 404" do
include_context "avatar file not found"
it "sets the file and the right state" do
perform_now({ avatar: })
avatar.reload
expect(avatar).not_to be_nil
expect(avatar.last_log_entry).to eq(@log_entries[0])
expect(avatar.log_entry).to be_nil
expect(avatar.downloaded_at).to be_within(1.seconds).of(Time.now)
expect(avatar.state).to eq("file_404")
end
context "a previous successful avatar was downloaded" do
it "does not overwrite the file" do
avatar.state = :ok
log_entry =
create(
:http_log_entry,
response:
create(
:blob_file,
contents: avatar_fixture_file,
content_type: "image/gif",
),
)
avatar.log_entry = log_entry
avatar.last_log_entry = log_entry
avatar.save!
perform_now({ avatar:, force_scan: true })
avatar.reload
expect(avatar.state).to eq("file_404")
expect(avatar.log_entry).to eq(log_entry)
expect(avatar.last_log_entry).to eq(@log_entries[0])
end
end
end
context "the server response is 500" do
include_context "avatar file is a server error"
it "has a file and the right state" do
expect { perform_now({ avatar: }) }.to raise_error(
/http 500, log entry.+/,
)
avatar.reload
expect(avatar).not_to be_nil
expect(avatar.log_entry).to be_nil
expect(avatar.last_log_entry).to eq(@log_entries[0])
expect(avatar.state).to eq("http_error")
expect(avatar.error_message).to eq("http status 500")
end
end
end
end