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_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
