require 'spec_helper'

RSpec.describe Base::Apis::Search do
  let(:client_secret) { Base::APIClient::ClientSecret.new }
  subject { Base::Apis::Search.new client_secret }
  let(:query) { '白 シャツ 綿' }
  let(:request_parameters) do
    {  client_id:     '623f75000821c16163ec570ca6469539',
       client_secret: 'e321f43620ac47bc92f83e766107d78c',
       q:             query }
  end

  describe '::new' do
    include_examples 'Base::Apis::Something.new'
  end

  describe '#request' do
    let(:response) do
      VCR.use_cassette('Search_request') { subject.request(query) }
    end

  it 'contains code "200"' do
    expect(response.code).to eq '200'
  end

    it '@body contains searched items info' do
      expect(response.body).to match(/found/)
      expect(response.body).to match(/items/)
      expect(response.body).to match(/item_id/)
      expect(response.body).to match(/title/)
      expect(response.body).to match(/detail/)
      expect(response.body).to match(/price/)
      expect(response.body).to match(/stock/)
      expect(response.body).to match(/modified/)
      expect(response.body).to match(/shop_id/)
      expect(response.body).to match(/shop_name/)
      expect(response.body).to match(/shop_url/)
      expect(response.body).to match(/categories/)
    end
  end

  describe '#request_parameters=' do
    it 'returns request_parameters' do
      client_secret = instance_double('Base::Apis::ClientSecret')

      client_secret.instance_variable_set(
        :@search_client_id,
        '623f75000821c16163ec570ca6469539')

      client_secret.instance_variable_set(
        :@search_client_secret,
        'e321f43620ac47bc92f83e766107d78c')

      allow(subject).to receive(:client_secret) { client_secret }

      expect(subject).to respond_to(:request_parameters) do
        {  client_id:     '623f75000821c16163ec570ca6469539',
           client_secret: 'e321f43620ac47bc92f83e766107d78c',
           q:             '白 シャツ 綿' }
      end

      subject.send(:request_parameters=, '白 シャツ 綿')
    end
  end

  describe '#uri=' do
    it 'has instance variable @uri' do
      expect(subject).to respond_to(:uri)
    end

    it 'returns an object of URI::HTTPS' do
      expect(subject.send(:uri=, request_parameters)).to \
        be_kind_of URI::HTTPS
    end

    it 'return value to_s is uri like' do
      expect(subject.send(:uri=, request_parameters).to_s).to eq \
        'https://api.thebase.in/1/search?client_id=623f75000821c16163ec570ca6469539&client_secret=e321f43620ac47bc92f83e766107d78c&q=%E7%99%BD+%E3%82%B7%E3%83%A3%E3%83%84+%E7%B6%BF'
    end
  end
end