spec/scrapers/manning_books_spec.rb in scrapers-2.0.2 vs spec/scrapers/manning_books_spec.rb in scrapers-2.1.0
- old
+ new
@@ -1,20 +1,113 @@
# -*- ruby -*-
require 'spec_helper'
require 'scrapers/manning_books'
+require 'ostruct'
-module Scrapers
+RSpec.describe Scrapers::ManningBooks::Scraper do
+ describe "verify Class method signatures" do
+ it "responds to :new" do
+ expect(Scrapers::ManningBooks::Scraper).to respond_to(:new)
+ end
+ end
+ describe "verify instance method signatures" do
+ subject { Scrapers::ManningBooks::Scraper.new }
+ it { is_expected.to respond_to :scrape }
+ it { is_expected.to respond_to :login }
+ it { is_expected.to respond_to :wait_a_bit }
+ it { is_expected.to respond_to :download_books }
+ end
+ describe "#login" do
+ let(:scraper) { Scrapers::ManningBooks::Scraper.new }
+ let(:agent) { double('agent') }
- describe ManningBooks do
- it{should respond_to :scrape}
- context "scraping" do
- before(:all) do
- @comic = VCR.use_cassette('manning_books') do
- @result = Scrapers::ManningBooks.scrape
- end
+ before do
+ allow(Scrapers::NetrcReader).to receive(:new) do
+ OpenStruct.new(user: "joe@example.com", pw: "password")
end
+ end
+
+ it "verify user" do
+ expect(scraper.user).to eq("joe@example.com")
+ end
+ it "verify pw" do
+ expect(scraper.pw).to eq("password")
+ end
+
+ context "when login is passed a block" do
+ it "logs in and yields the block" do
+ expect(agent).to receive(:get).and_return(agent)
+ expect(agent).to receive(:current_page).at_least(5).times.and_return(agent)
+ expect(agent).to receive(:uri)
+ expect(agent).to receive(:form).exactly(3).times.and_return(agent)
+ expect(agent).to receive(:field_with).exactly(2).times.and_return(agent)
+ expect(agent).to receive(:value=).exactly(2).times.and_return(agent)
+ expect(agent).to receive(:submit).and_return(agent)
+ expect(agent).to receive(:uri).and_return(Scrapers::ManningBooks::DASHBOARD_URL)
+ scraper.login(agent) { |m| @result = "in yield" }
+ expect(@result).to eq("in yield")
+ end
- it {expect(@result).to_not be_nil}
-
end
+
+ context "when login is not passed a block" do
+ it "raises an exception" do
+ expect{ scraper.login(agent) }.to raise_error("Must provide a block to execute after logged in to site")
+ end
+ end
+
+ end
+
+ describe "#download_books" do
+ let(:scraper) {Scrapers::ManningBooks::Scraper.new}
+ let(:agent) {double('agent')}
+ let(:books) do
+ 3.times.map do |i|
+ OpenStruct.new(href: "http://#{Scrapers::ManningBooks::DASHBOARD_URL}/#{i}")
+ end
+ end
+
+
+ before do
+ allow(Scrapers::NetrcReader).to receive(:new) do
+ OpenStruct.new(user: "joe@example.com", pw: "password")
+ end
+
+ allow(scraper).to receive(:wait_a_bit).at_least(:once)
+ end
+
+ it "downloads the books" do
+ save_stdout = $stdout
+ $stdout = double('output').as_null_object
+ expect(agent).to receive(:get).exactly(3).times
+ expect(agent).to receive(:current_page).exactly(3*4).times.and_return(agent)
+ expect(agent).to receive(:filename).exactly(3*2).times.and_return("FILENAME")
+ expect(agent).to receive(:save!).exactly(3).times
+ expect(agent).to receive(:uri).exactly(3).times
+ results = scraper.download_books(agent, books)
+ $stdout = save_stdout
+ expect(results.size).to eq(3)
+ end
+
+ end
+
+ # Saving the best for last
+ describe "#scrape" do
+ let(:scraper) {Scrapers::ManningBooks::Scraper.new}
+ let(:agent) {double('agent').as_null_object}
+ let(:netrc_reader) {double('netrc_reader').as_null_object}
+ let(:book_list) {[['book1','url1'],['book2','url2']]}
+
+ before do
+ allow(Scrapers::NetrcReader).to receive(:new).and_return(netrc_reader)
+ allow(scraper).to receive(:wait_a_bit).at_least(:once)
+ allow(scraper).to receive(:login).and_yield(agent)
+ end
+
+ it "scrapes the dashboard" do
+ expect(Mechanize).to receive(:start).and_yield(agent)
+ expect(scraper).to receive(:download_books).and_return(book_list)
+ scraper.scrape
+ end
+
end
end