require 'spec_helper'

describe SportsDataApi::Nfl, vcr: {
    cassette_name: 'sports_data_api_nfl',
    record: :new_episodes,
    match_requests_on: [:uri]
} do

  context 'invalid API key' do
    before(:each) do
      SportsDataApi.set_key(:nfl, 'invalid_key')
      SportsDataApi.set_access_level(:nfl, 'ot')
    end

    describe '.schedule' do
      it { expect { subject.schedule(2013, :REG) }.to raise_error(SportsDataApi::Error) }
    end
    describe '.boxscore' do
      it { expect { subject.boxscore('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
    describe '.game_roster' do
      it { expect { subject.game_roster('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
    describe '.team_roster' do
      it { expect { subject.team_roster('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
    describe '.teams' do
      it { expect { subject.teams }.to raise_error(SportsDataApi::Error) }
    end
    describe '.game_statistics' do
      it { expect { subject.game_statistics('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
  end

  context 'no response from the api' do
    before(:each) { stub_request(:any, /api\.sportradar\.us.*/).to_timeout }

    describe '.schedule' do
      it { expect { subject.schedule(2013, :REG) }.to raise_error(SportsDataApi::Error) }
    end
    describe '.boxscore' do
      it { expect { subject.boxscore('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
    describe '.game_roster' do
      it { expect { subject.game_roster('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
    describe '.team_roster' do
      it { expect { subject.team_roster('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
    describe '.teams' do
      it { expect { subject.teams }.to raise_error(SportsDataApi::Error) }
    end
    describe '.game_statistics' do
      it { expect { subject.game_statistics('55d0b262-98ff-49fa-95c8-5ab8ec8cbd34') }.to raise_error(SportsDataApi::Error) }
    end
  end

  context 'create valid URLs' do
    let(:full_url) { "#{url}?api_key=#{api_key(:nfl)}" }
    let(:json) { RestClient.get(full_url) }
    let(:params) { { params: { api_key: api_key(:nfl) } } }

    before(:each) do
      SportsDataApi.set_key(:nfl, api_key(:nfl))
      SportsDataApi.set_access_level(:nfl, 'ot')
      allow(RestClient).to receive(:get).and_return(json)
    end

    describe '.schedule' do
      let(:url) { 'https://api.sportradar.us/nfl-ot2/games/2012/REG/schedule.json' }

      it 'makes a valid request and returns a Season' do
        response = subject.schedule(2012, :REG)
        expect(response).to be_a SportsDataApi::Nfl::Season
        expect(RestClient).to have_received(:get).with(url, params)
      end
    end

    describe '.boxscore' do
      let(:game_id) { '55d0b262-98ff-49fa-95c8-5ab8ec8cbd34' }
      let(:url) { "https://api.sportradar.us/nfl-ot2/games/#{game_id}/boxscore.json" }

      it 'makes a valid request and returns a Game' do
        response = subject.boxscore(game_id)
        expect(response).to be_a SportsDataApi::Nfl::Game
        expect(RestClient).to have_received(:get).with(url, params)
      end
    end

    describe '.game_roster' do
      let(:game_id) { '55d0b262-98ff-49fa-95c8-5ab8ec8cbd34' }
      let(:url) { "https://api.sportradar.us/nfl-ot2/games/#{game_id}/roster.json" }

      it 'makes a valid request and returns a Game' do
        response = subject.game_roster(game_id)
        expect(response).to be_a SportsDataApi::Nfl::Game
        expect(RestClient).to have_received(:get).with(url, params)
      end
    end

    describe '.team_roster' do
      let(:team_id) { '33405046-04ee-4058-a950-d606f8c30852' }
      let(:url) { "https://api.sportradar.us/nfl-ot2/teams/#{team_id}/full_roster.json" }

      it 'makes a valid request and returns a Team' do
        response = subject.team_roster(team_id)
        expect(response).to be_a SportsDataApi::Nfl::Team
        expect(RestClient).to have_received(:get).with(url, params)
      end
    end

    describe '.teams' do
      let(:team_id) { '33405046-04ee-4058-a950-d606f8c30852' }
      let(:url) { "https://api.sportradar.us/nfl-ot2/league/hierarchy.json" }

      it 'makes a valid request and returns a Teams' do
        response = subject.teams
        expect(response).to be_a SportsDataApi::Nfl::Teams
        expect(RestClient).to have_received(:get).with(url, params)
      end
    end

    describe '.game_statistics' do
      let(:game_id) { '55d0b262-98ff-49fa-95c8-5ab8ec8cbd34' }
      let(:url) { "https://api.sportradar.us/nfl-ot2/games/#{game_id}/statistics.json" }

      it 'makes a valid request and returns a Game' do
        response = subject.game_statistics(game_id)
        expect(response).to be_a SportsDataApi::Nfl::Game
        expect(RestClient).to have_received(:get).with(url, params)
      end
    end
  end
end