Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions lib/intercom/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ module Intercom
#
# == Example usage
# * Fetching a user
# Intercom::User.find_by_email("bob@example.")
# Intercom::User.find_by_email("bob@example.com")
#
# * Getting the count of all users
# Intercom::User.all.count
#
# * Fetching all users
# Intercom::User.all.each {|user| puts user.email }
# Intercom::User.all.each { |user| puts user.email }
#
# * Updating custom data on a user
# user = Intercom::User.find_by_email("bob@example.com")
Expand Down Expand Up @@ -70,11 +70,11 @@ def self.create(params)
# Examples:
# Intercom::User.all.count
# > 5346
# Intercom::User.each do |user|
# Intercom::User.all.each do |user|
# puts user.inspect
# end
# > ["user1@example.com" ,"user2@example.com" ,....]
# Intercom::User.map(&:email)
# Intercom::User.all.map(&:email)
# > ["user1@example.com" ,"user2@example.com" ,....]
#
# @return [UserCollectionProxy]
Expand Down
15 changes: 4 additions & 11 deletions lib/intercom/user_collection_proxy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@ module Intercom
# Intercom::User.all.count
#
# Iterating over each user
# Intercom::User.each do |user|
# Intercom::User.all.each do |user|
# puts user.inspect
# end
#
class UserCollectionProxy
include Enumerable

# @return [Integer] number of users tracked on Intercom for this application
def count
raise ArgumentError.new("count doesn't support block argument") if block_given?
response = Intercom.get("users", {:per_page => 1})
response["total_count"]
end
Expand All @@ -37,15 +40,5 @@ def each(&block)
fetch_another_page = !current_page["next_page"].nil?
end
end

# yields each {User} to the block provided and collects the output in the same way as Enumerable#map
# @return [Array<Object>]
def map
out = []
each { |e| out << yield(e) }
out
end

alias :collect :map
end
end
12 changes: 10 additions & 2 deletions spec/unit/intercom/user_collection_proxy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@
Intercom::User.all.collect { |user| user.email }.must_equal %W(user1@example.com user2@example.com user3@example.com)
end

it "yields each user to the block" do
Intercom.expects(:get).with("users", {:per_page => 1}).returns(page_of_users(1,1))
it "counts users based on total_count in paged_response" do
paged_response = page_of_users(1, 1)
Intercom.expects(:get).with("users", {:per_page => 1}).returns(paged_response)
paged_response.expects(:[]).with("total_count").returns(3)
Intercom::User.all.count.must_equal 3
end

it "explicitly doesn't support block argument for count" do
assert_raises ArgumentError do
Intercom::User.all.count {|_| true }
end
end

it "loads multiple pages" do
Intercom.expects(:get).with("users", {:page => 1}).returns(page_of_users(1, 1))
Intercom.expects(:get).with("users", {:page => 2}).returns(page_of_users(2, 1))
Expand Down