require 'helper'

describe Twitter::REST::FriendsAndFollowers do
  before do
    @client = Twitter::REST::Client.new(consumer_key: 'CK', consumer_secret: 'CS', access_token: 'AT', access_token_secret: 'AS')
  end

  describe '#friend_ids' do
    context 'with a screen name passed' do
      before do
        stub_get('/1.1/friends/ids.json').with(query: {screen_name: 'sferik', cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friend_ids('sferik')
        expect(a_get('/1.1/friends/ids.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
      end
      it 'returns an array of numeric IDs for every user the specified user is following' do
        friend_ids = @client.friend_ids('sferik')
        expect(friend_ids).to be_a Twitter::Cursor
        expect(friend_ids.first).to eq(20_009_713)
      end
      context 'with each' do
        before do
          stub_get('/1.1/friends/ids.json').with(query: {screen_name: 'sferik', cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.friend_ids('sferik').each {}
          expect(a_get('/1.1/friends/ids.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/friends/ids.json').with(query: {screen_name: 'sferik', cursor: '1305102810874389703'})).to have_been_made
        end
      end
    end
    context 'with a user ID passed' do
      before do
        stub_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friend_ids(7_505_382)
        expect(a_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      context 'with each' do
        before do
          stub_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.friend_ids(7_505_382).each {}
          expect(a_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'})).to have_been_made
        end
      end
    end
    context 'without arguments passed' do
      before do
        stub_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
        stub_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friend_ids
        expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
        expect(a_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      it 'returns an array of numeric IDs for every user the specified user is following' do
        friend_ids = @client.friend_ids
        expect(friend_ids).to be_a Twitter::Cursor
        expect(friend_ids.first).to eq(20_009_713)
      end
      context 'with each' do
        before do
          stub_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.friend_ids.each {}
          expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
          expect(a_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'})).to have_been_made
        end
      end
    end
  end

  describe '#follower_ids' do
    context 'with a screen name passed' do
      before do
        stub_get('/1.1/followers/ids.json').with(query: {screen_name: 'sferik', cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.follower_ids('sferik')
        expect(a_get('/1.1/followers/ids.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
      end
      it 'returns an array of numeric IDs for every user following the specified user' do
        follower_ids = @client.follower_ids('sferik')
        expect(follower_ids).to be_a Twitter::Cursor
        expect(follower_ids.first).to eq(20_009_713)
      end
      context 'with each' do
        before do
          stub_get('/1.1/followers/ids.json').with(query: {screen_name: 'sferik', cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.follower_ids('sferik').each {}
          expect(a_get('/1.1/followers/ids.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/followers/ids.json').with(query: {screen_name: 'sferik', cursor: '1305102810874389703'})).to have_been_made
        end
      end
    end
    context 'with a user ID passed' do
      before do
        stub_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.follower_ids(7_505_382)
        expect(a_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      context 'with each' do
        before do
          stub_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.follower_ids(7_505_382).each {}
          expect(a_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'})).to have_been_made
        end
      end
    end
    context 'without arguments passed' do
      before do
        stub_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
        stub_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.follower_ids
        expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
        expect(a_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      it 'returns an array of numeric IDs for every user following the specified user' do
        follower_ids = @client.follower_ids
        expect(follower_ids).to be_a Twitter::Cursor
        expect(follower_ids.first).to eq(20_009_713)
      end
      context 'with each' do
        before do
          stub_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.follower_ids.each {}
          expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
          expect(a_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/followers/ids.json').with(query: {user_id: '7505382', cursor: '1305102810874389703'})).to have_been_made
        end
      end
    end
  end

  describe '#friendships' do
    context 'with screen names passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik,pengwynn'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships('sferik', 'pengwynn')
        expect(a_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik,pengwynn'})).to have_been_made
      end
      it 'returns up to 100 users worth of extended information' do
        friendships = @client.friendships('sferik', 'pengwynn')
        expect(friendships).to be_an Array
        expect(friendships.first).to be_a Twitter::User
        expect(friendships.first.id).to eq(7_505_382)
        expect(friendships.first.connections).to eq(['none'])
      end
    end
    context 'with numeric screen names passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {screen_name: '0,311'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships('0', '311')
        expect(a_get('/1.1/friendships/lookup.json').with(query: {screen_name: '0,311'})).to have_been_made
      end
    end
    context 'with user IDs passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {user_id: '7505382,14100886'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships(7_505_382, 14_100_886)
        expect(a_get('/1.1/friendships/lookup.json').with(query: {user_id: '7505382,14100886'})).to have_been_made
      end
    end
    context 'with both screen names and user IDs passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik', user_id: '14100886'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships('sferik', 14_100_886)
        expect(a_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik', user_id: '14100886'})).to have_been_made
      end
    end
  end

  describe '#friendships' do
    context 'with screen names passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik,pengwynn'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships('sferik', 'pengwynn')
        expect(a_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik,pengwynn'})).to have_been_made
      end
      it 'returns up to 100 users worth of extended information' do
        friendships = @client.friendships('sferik', 'pengwynn')
        expect(friendships).to be_an Array
        expect(friendships.first).to be_a Twitter::User
        expect(friendships.first.id).to eq(7_505_382)
        expect(friendships.first.connections).to eq(['none'])
      end
    end
    context 'with numeric screen names passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {screen_name: '0,311'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships('0', '311')
        expect(a_get('/1.1/friendships/lookup.json').with(query: {screen_name: '0,311'})).to have_been_made
      end
    end
    context 'with user IDs passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {user_id: '7505382,14100886'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships(7_505_382, 14_100_886)
        expect(a_get('/1.1/friendships/lookup.json').with(query: {user_id: '7505382,14100886'})).to have_been_made
      end
    end
    context 'with both screen names and user IDs passed' do
      before do
        stub_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik', user_id: '14100886'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships('sferik', 14_100_886)
        expect(a_get('/1.1/friendships/lookup.json').with(query: {screen_name: 'sferik', user_id: '14100886'})).to have_been_made
      end
    end
  end

  describe '#friendships_incoming' do
    before do
      stub_get('/1.1/friendships/incoming.json').with(query: {cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      @client.friendships_incoming
      expect(a_get('/1.1/friendships/incoming.json').with(query: {cursor: '-1'})).to have_been_made
    end
    it 'returns an array of numeric IDs for every user who has a pending request to follow the authenticating user' do
      friendships_incoming = @client.friendships_incoming
      expect(friendships_incoming).to be_a Twitter::Cursor
      expect(friendships_incoming.first).to eq(20_009_713)
    end
    context 'with each' do
      before do
        stub_get('/1.1/friendships/incoming.json').with(query: {cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships_incoming.each {}
        expect(a_get('/1.1/friendships/incoming.json').with(query: {cursor: '1305102810874389703'})).to have_been_made
      end
    end
  end

  describe '#friendships_outgoing' do
    before do
      stub_get('/1.1/friendships/outgoing.json').with(query: {cursor: '-1'}).to_return(body: fixture('ids_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      @client.friendships_outgoing
      expect(a_get('/1.1/friendships/outgoing.json').with(query: {cursor: '-1'})).to have_been_made
    end
    it 'returns an array of numeric IDs for every protected user for whom the authenticating user has a pending follow request' do
      friendships_outgoing = @client.friendships_outgoing
      expect(friendships_outgoing).to be_a Twitter::Cursor
      expect(friendships_outgoing.first).to eq(20_009_713)
    end
    context 'with each' do
      before do
        stub_get('/1.1/friendships/outgoing.json').with(query: {cursor: '1305102810874389703'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendships_outgoing.each {}
        expect(a_get('/1.1/friendships/outgoing.json').with(query: {cursor: '1305102810874389703'})).to have_been_made
      end
    end
  end

  describe '#follow' do
    before do
      stub_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
      stub_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('ids_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
      stub_get('/1.1/users/lookup.json').with(query: {screen_name: 'sferik,pengwynn'}).to_return(body: fixture('friendships.json'), headers: {content_type: 'application/json; charset=utf-8'})
      stub_post('/1.1/friendships/create.json').with(body: {user_id: '7505382'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      @client.follow('sferik', 'pengwynn')
      expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
      expect(a_get('/1.1/friends/ids.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      expect(a_get('/1.1/users/lookup.json').with(query: {screen_name: 'sferik,pengwynn'})).to have_been_made
      expect(a_post('/1.1/friendships/create.json').with(body: {user_id: '7505382'})).to have_been_made
    end
  end

  describe '#follow!' do
    before do
      stub_post('/1.1/friendships/create.json').with(body: {screen_name: 'sferik'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      @client.follow!('sferik')
      expect(a_post('/1.1/friendships/create.json').with(body: {screen_name: 'sferik'})).to have_been_made
    end
    it 'returns an array of befriended users' do
      users = @client.follow!('sferik')
      expect(users).to be_an Array
      expect(users.first).to be_a Twitter::User
      expect(users.first.id).to eq(7_505_382)
    end
  end
  context 'with a user object passed' do
    before do
      stub_post('/1.1/friendships/create.json').with(body: {user_id: '7505382'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resources' do
      user = Twitter::User.new(id: '7505382')
      @client.follow!(user)
      expect(a_post('/1.1/friendships/create.json').with(body: {user_id: '7505382'})).to have_been_made
    end
  end
  context 'with a URI object passed' do
    before do
      stub_post('/1.1/friendships/create.json').with(body: {screen_name: 'sferik'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      user = URI.parse('https://twitter.com/sferik')
      @client.follow!(user)
      expect(a_post('/1.1/friendships/create.json').with(body: {screen_name: 'sferik'})).to have_been_made
    end
  end
  context 'with a forbidden error' do
    before do
      stub_post('/1.1/friendships/create.json').with(body: {screen_name: 'sferik'}).to_return(status: 403, body: fixture('forbidden.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'raises an exception' do
      expect { @client.follow!('sferik') }.to raise_error(Twitter::Error::Forbidden)
    end
  end

  describe '#unfollow' do
    before do
      stub_post('/1.1/friendships/destroy.json').with(body: {screen_name: 'sferik'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      @client.unfollow('sferik')
      expect(a_post('/1.1/friendships/destroy.json').with(body: {screen_name: 'sferik'})).to have_been_made
    end
    it 'returns an array of unfollowed users' do
      users = @client.unfollow('sferik')
      expect(users).to be_an Array
      expect(users.first).to be_a Twitter::User
      expect(users.first.id).to eq(7_505_382)
    end
  end

  describe '#friendship_update' do
    before do
      stub_post('/1.1/friendships/update.json').with(body: {screen_name: 'sferik', retweets: 'true'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      @client.friendship_update('sferik', retweets: true)
      expect(a_post('/1.1/friendships/update.json').with(body: {screen_name: 'sferik', retweets: 'true'})).to have_been_made
    end
    it 'returns detailed information about the relationship between two users' do
      relationship = @client.friendship_update('sferik', retweets: true)
      expect(relationship).to be_a Twitter::Relationship
      expect(relationship.source.id).to eq(7_505_382)
    end
  end

  describe '#friendship' do
    context 'with screen names passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_screen_name: 'sferik', target_screen_name: 'pengwynn'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendship('sferik', 'pengwynn')
        expect(a_get('/1.1/friendships/show.json').with(query: {source_screen_name: 'sferik', target_screen_name: 'pengwynn'})).to have_been_made
      end
      it 'returns detailed information about the relationship between two users' do
        relationship = @client.friendship('sferik', 'pengwynn')
        expect(relationship).to be_a Twitter::Relationship
        expect(relationship.source.id).to eq(7_505_382)
      end
    end
    context 'with numeric screen names passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_screen_name: '0', target_screen_name: '311'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendship('0', '311')
        expect(a_get('/1.1/friendships/show.json').with(query: {source_screen_name: '0', target_screen_name: '311'})).to have_been_made
      end
    end
    context 'with user IDs passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendship(7_505_382, 14_100_886)
        expect(a_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'})).to have_been_made
      end
    end
    context 'with user objects passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        user1 = Twitter::User.new(id: '7505382')
        user2 = Twitter::User.new(id: '14100886')
        @client.friendship(user1, user2)
        expect(a_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'})).to have_been_made
      end
    end
    context 'with URI objects passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_screen_name: 'sferik', target_screen_name: 'pengwynn'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        user1 = URI.parse('https://twitter.com/sferik')
        user2 = URI.parse('https://twitter.com/pengwynn')
        @client.friendship(user1, user2)
        expect(a_get('/1.1/friendships/show.json').with(query: {source_screen_name: 'sferik', target_screen_name: 'pengwynn'})).to have_been_made
      end
    end
  end

  describe '#friendship?' do
    context 'with screen names passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_screen_name: 'sferik', target_screen_name: 'pengwynn'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
        stub_get('/1.1/friendships/show.json').with(query: {source_screen_name: 'pengwynn', target_screen_name: 'sferik'}).to_return(body: fixture('not_following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendship?('sferik', 'pengwynn')
        expect(a_get('/1.1/friendships/show.json').with(query: {source_screen_name: 'sferik', target_screen_name: 'pengwynn'})).to have_been_made
      end
      it 'returns true if user A follows user B' do
        friendship = @client.friendship?('sferik', 'pengwynn')
        expect(friendship).to be true
      end
      it 'returns false if user A does not follow user B' do
        friendship = @client.friendship?('pengwynn', 'sferik')
        expect(friendship).to be false
      end
    end
    context 'with user IDs passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friendship?(7_505_382, 14_100_886)
        expect(a_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'})).to have_been_made
      end
    end
    context 'with user objects passed' do
      before do
        stub_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'}).to_return(body: fixture('following.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        user1 = Twitter::User.new(id: '7505382')
        user2 = Twitter::User.new(id: '14100886')
        @client.friendship?(user1, user2)
        expect(a_get('/1.1/friendships/show.json').with(query: {source_id: '7505382', target_id: '14100886'})).to have_been_made
      end
    end
  end

  describe '#followers' do
    context 'with a screen_name passed' do
      before do
        stub_get('/1.1/followers/list.json').with(query: {screen_name: 'sferik', cursor: '-1'}).to_return(body: fixture('followers_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.followers('sferik')
        expect(a_get('/1.1/followers/list.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
      end
      it 'returns a cursor of followers with details for every user the specified user is followed by' do
        followers = @client.followers('sferik')
        expect(followers).to be_a Twitter::Cursor
        expect(followers.first).to be_a Twitter::User
      end
      context 'with each' do
        before do
          stub_get('/1.1/followers/list.json').with(query: {screen_name: 'sferik', cursor: '1419103567112105362'}).to_return(body: fixture('followers_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.followers('sferik').each {}
          expect(a_get('/1.1/followers/list.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/followers/list.json').with(query: {screen_name: 'sferik', cursor: '1419103567112105362'})).to have_been_made
        end
      end
    end
    context 'with a user ID passed' do
      before do
        stub_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('followers_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.followers(7_505_382)
        expect(a_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      context 'with each' do
        before do
          stub_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '1419103567112105362'}).to_return(body: fixture('followers_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.followers(7_505_382).each {}
          expect(a_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '1419103567112105362'})).to have_been_made
        end
      end
    end
    context 'without arguments passed' do
      before do
        stub_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
        stub_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('followers_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.followers
        expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
        expect(a_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      it 'returns a cursor of followers with details for every user the specified user is followed by' do
        followers = @client.followers
        expect(followers).to be_a Twitter::Cursor
        expect(followers.first).to be_a Twitter::User
      end
      context 'with each' do
        before do
          stub_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '1419103567112105362'}).to_return(body: fixture('followers_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.followers.each {}
          expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
          expect(a_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/followers/list.json').with(query: {user_id: '7505382', cursor: '1419103567112105362'})).to have_been_made
        end
      end
    end
  end

  describe '#friends' do
    context 'with a screen_name passed' do
      before do
        stub_get('/1.1/friends/list.json').with(query: {screen_name: 'sferik', cursor: '-1'}).to_return(body: fixture('friends_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friends('sferik')
        expect(a_get('/1.1/friends/list.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
      end
      it 'returns a cursor of friends with details for every user the specified user is following' do
        friends = @client.friends('sferik')
        expect(friends).to be_a Twitter::Cursor
        expect(friends.first).to be_a Twitter::User
      end
      context 'with each' do
        before do
          stub_get('/1.1/friends/list.json').with(query: {screen_name: 'sferik', cursor: '1418947360875712729'}).to_return(body: fixture('friends_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.friends('sferik').each {}
          expect(a_get('/1.1/friends/list.json').with(query: {screen_name: 'sferik', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/friends/list.json').with(query: {screen_name: 'sferik', cursor: '1418947360875712729'})).to have_been_made
        end
      end
    end
    context 'with a user ID passed' do
      before do
        stub_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('friends_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friends(7_505_382)
        expect(a_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      context 'with each' do
        before do
          stub_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '1418947360875712729'}).to_return(body: fixture('friends_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.friends(7_505_382).each {}
          expect(a_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '1418947360875712729'})).to have_been_made
        end
      end
    end
    context 'without arguments passed' do
      before do
        stub_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'}).to_return(body: fixture('sferik.json'), headers: {content_type: 'application/json; charset=utf-8'})
        stub_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '-1'}).to_return(body: fixture('friends_list.json'), headers: {content_type: 'application/json; charset=utf-8'})
      end
      it 'requests the correct resource' do
        @client.friends
        expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
        expect(a_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
      end
      it 'returns a cursor of friends with details for every user the specified user is following' do
        friends = @client.friends
        expect(friends).to be_a Twitter::Cursor
        expect(friends.first).to be_a Twitter::User
      end
      context 'with each' do
        before do
          stub_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '1418947360875712729'}).to_return(body: fixture('friends_list2.json'), headers: {content_type: 'application/json; charset=utf-8'})
        end
        it 'requests the correct resource' do
          @client.friends.each {}
          expect(a_get('/1.1/account/verify_credentials.json').with(query: {skip_status: 'true'})).to have_been_made
          expect(a_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '-1'})).to have_been_made
          expect(a_get('/1.1/friends/list.json').with(query: {user_id: '7505382', cursor: '1418947360875712729'})).to have_been_made
        end
      end
    end
  end

  describe '#no_retweet_ids' do
    before do
      stub_get('/1.1/friendships/no_retweets/ids.json').to_return(body: fixture('ids.json'), headers: {content_type: 'application/json; charset=utf-8'})
    end
    it 'requests the correct resource' do
      @client.no_retweet_ids
      expect(a_get('/1.1/friendships/no_retweets/ids.json')).to have_been_made
    end
    it 'requests the correct resource when the alias is called' do
      @client.no_retweets_ids
      expect(a_get('/1.1/friendships/no_retweets/ids.json')).to have_been_made
    end
    it 'returns users ids of those that do not wish to be retweeted' do
      no_retweet_ids = @client.no_retweet_ids
      expect(no_retweet_ids).to be_an Array
      expect(no_retweet_ids.first).to be_an Integer
      expect(no_retweet_ids.first).to eq(47)
    end
  end
end
