Sha256: 8ccc6c3db6fed1d86a6f35af01b394844725c28e945d4f612fe766371eb7dbde

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

# frozen_string_literal: true

require "spec_helpers"

describe Wayfarer::Middleware::Fetch do
  let(:klass) { Class.new(Wayfarer::Base) }
  let(:job) { klass.new }
  let(:task) { build(:task) }
  let(:agent) { spy }
  subject(:fetch) { Wayfarer::Middleware::Fetch.new }

  before do
    task.job = job
    allow(fetch.pool).to receive(:with).and_yield(agent)
  end

  describe "#call" do
    it "assigns the task" do
      expect {
        fetch.call(task)
      }.to change { fetch.task }.to(task)
    end

    it "assigns the agent" do
      expect {
        fetch.call(task)
      }.to change { task.metadata.agent }.to(agent)
    end

    it "retrieves the page" do
      expect(agent).to receive(:fetch).with(task.url)
      fetch.call(task)
    end

    it "runs callbacks" do
      expect { |spy|
        klass.before_fetch(&spy)
        fetch.call(task)
      }.to yield_control
    end

    context "when encountering an HTTP redirect" do
      let(:redirect_url) { "https://redirect.com" }

      let(:result) do
        Wayfarer::Networking::Result::Redirect.new(redirect_url)
      end

      before do
        task.metadata.staged_urls = Set.new
        allow(agent).to receive(:fetch).with(task.url).and_return(result)
      end

      it "stages the redirect URL" do
        expect {
          fetch.call(task)
        }.to change { task.metadata.staged_urls }.to([redirect_url])
      end

      it "does not yield" do
        expect { |spy| fetch.call(task, &spy) }.not_to yield_control
      end
    end

    context "when retrieval succeeds" do
      let(:page) { build(:page) }
      let(:result) { Wayfarer::Networking::Result::Success.new(page) }

      before do
        allow(agent).to receive(:fetch).with(task.url).and_return(result)
      end

      it "assigns the page" do
        expect {
          fetch.call(task)
        }.to change { task.metadata.page }.to(page)
      end

      it "yields" do
        expect { |spy| fetch.call(task, &spy) }.to yield_control
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
wayfarer-0.4.1 spec/middleware/fetch_spec.rb