Clone
external_api_service_spec.rb
require 'spec_helper'

describe Locomotive::Steam::ExternalAPIService do

  let(:service) { described_class.new }

  describe '#consume' do

    let(:url)             { '' }
    let(:options)         { {} }
    let(:code)            { 200 }
    let(:parsed_response) { Hash.new }
    let(:response)        { instance_double('Response', code: code, parsed_response: parsed_response) }

    subject { service.consume(url, options) }

    describe 'sets the base uri from a simple url' do

      let(:url) { 'http://blog.locomotiveapp.org' }
      it do
        expect(service.class).to receive(:get).with('/', { base_uri: 'http://blog.locomotiveapp.org' }).and_return(response)
        subject
      end

      describe 'wrong response (<> 200)' do

        let(:code) { 500 }
        it do
          expect(service.class).to receive(:get).with('/', { base_uri: 'http://blog.locomotiveapp.org' }).and_return(response)
          expect(subject).to eq nil
        end

      end

      describe 'returns a collection instead of a hash' do

        let(:parsed_response) { [{ 'averagePrice' => 1 }] }
        it do
          expect(service.class).to receive(:get).with('/', { base_uri: 'http://blog.locomotiveapp.org' }).and_return(response)
          expect(subject.first['average_price']).to eq 1
        end

      end

    end

    describe 'sets the base uri from a much more complex url' do

      let(:url) { 'http://free.worldweatheronline.com/feed/weather.ashx?key=secretapikey&format=json' }
      it do
        expect(service.class).to receive(:get).with('/feed/weather.ashx?key=secretapikey&format=json', { base_uri: 'http://free.worldweatheronline.com' }).and_return(response)
        subject
      end

    end


    describe 'sets both the base uri and the path from an url with parameters' do

      let(:url) { 'http://blog.locomotiveapp.org/api/read/json?num=3' }
      it do
        expect(service.class).to receive(:get).with('/api/read/json?num=3', { base_uri: 'http://blog.locomotiveapp.org' }).and_return(response)
        subject
      end

    end

    describe 'sets auth credentials' do

      let(:url)     { 'http://blog.locomotiveapp.org' }
      let(:options) { { username: 'john', password: 'foo' } }
      it do
        expect(service.class).to receive(:get).with('/', { base_uri: 'http://blog.locomotiveapp.org', basic_auth: { username: 'john', password: 'foo' } }).and_return(response)
        subject
      end
    end

  end

end