spec/workers/fetch_profile_photo_spec.rb
# frozen_string_literal: true

describe Workers::FetchProfilePhoto do
  before do
    @user = alice
    @service = FactoryBot.build(:service, user: alice)

    @url = "https://service.com/user/profile_image"

    allow(@service).to receive(:profile_photo_url).and_return(@url)
    allow(@user).to receive(:update_profile)

    allow(User).to receive(:find).and_return(@user)
    allow(Service).to receive(:find).and_return(@service)

    @photo_double = double
    allow(@photo_double).to receive(:save!).and_return(true)
    allow(@photo_double).to receive(:url).and_return("image.jpg")
  end

  it "saves the profile image" do
    expect(@photo_double).to receive(:save!).and_return(true)
    expect(Photo).to receive(:diaspora_initialize)
      .with(hash_including(author: @user.person, image_url: @url, pending: true)).and_return(@photo_double)

    Workers::FetchProfilePhoto.new.perform(@user.id, @service.id)
  end

  context "service does not have a profile_photo_url" do
    it "does nothing without fallback" do
      allow(@service).to receive(:profile_photo_url).and_return(nil)
      expect(Photo).not_to receive(:diaspora_initialize)

      Workers::FetchProfilePhoto.new.perform(@user.id, @service.id)
    end

    it "fetches fallback if it's provided" do
      expect(@photo_double).to receive(:save!).and_return(true)
      allow(@service).to receive(:profile_photo_url).and_return(nil)
      expect(Photo).to receive(:diaspora_initialize)
        .with(hash_including(author: @user.person, image_url: "https://service.com/fallback_lowres.jpg", pending: true))
        .and_return(@photo_double)

      Workers::FetchProfilePhoto.new.perform(@user.id, @service.id, "https://service.com/fallback_lowres.jpg")
    end
  end

  it "updates the profile" do
    allow(@photo_double).to receive(:url).and_return("large.jpg", "medium.jpg", "small.jpg")

    expect(Photo).to receive(:diaspora_initialize).and_return(@photo_double)
    expect(@user).to receive(:update_profile).with(hash_including({
                                                                    image_url:        "large.jpg",
                                                                    image_url_medium: "medium.jpg",
                                                                    image_url_small:  "small.jpg"
                                                                  }))

    Workers::FetchProfilePhoto.new.perform(@user.id, @service.id)
  end
end
