spec/integration/import_service_spec.rb
# frozen_string_literal: true

describe ImportService do
  context "import photos archive" do
    let(:user) { FactoryBot.create(:user) }
    let(:photo) { FactoryBot.create(:status_message_with_photo, author: user.person).photos.first }
    let(:photo_archive) {
      user.perform_export_photos!
      photo_archive = user.exported_photos_file

      # cleanup photo after creating the archive, so it's like it was imported from a remote pod
      photo.unprocessed_image = nil
      photo.random_string = nil
      photo.remote_photo_path = "https://old.example.com/uploads/images/"
      photo.save

      photo_archive
    }

    it "imports the photo with the same name" do
      old_random_string = photo.random_string

      inlined_jobs { ImportService.new.import_by_files(nil, photo_archive.current_path, user.username) }

      imported_photo = photo.reload
      expect(imported_photo.random_string).to include(old_random_string)
      expect(imported_photo.unprocessed_image.path).to include(old_random_string)
      expect(imported_photo.processed_image.path).to include(old_random_string)
      expect(imported_photo.remote_photo_name).to include(old_random_string)
      expect(imported_photo.remote_photo_path).to eq("#{AppConfig.pod_uri}uploads/images/")
    end

    it "imports the photo with a new random name if a conflicting photo already exists" do
      old_random_string = photo.random_string
      photo_archive_path = photo_archive.current_path

      sm = FactoryBot.create(:status_message)
      FactoryBot.create(:photo, author: sm.author, status_message: sm, random_string: old_random_string)

      expect(Diaspora::Federation::Dispatcher).to receive(:build) do |user_param, photo_param|
        expect(user_param).to eq(user)
        expect(photo_param.id).to eq(photo.id)

        dispatcher = double
        expect(dispatcher).to receive(:dispatch)
        dispatcher
      end

      inlined_jobs { ImportService.new.import_by_files(nil, photo_archive_path, user.username) }

      imported_photo = photo.reload
      new_random_string = imported_photo.random_string
      expect(new_random_string).not_to include(old_random_string)
      expect(imported_photo.unprocessed_image.path).to include(new_random_string)
      expect(imported_photo.processed_image.path).to include(new_random_string)
      expect(imported_photo.remote_photo_name).to include(new_random_string)
      expect(imported_photo.remote_photo_path).to eq("#{AppConfig.pod_uri}uploads/images/")
    end
  end
end
