Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flesh out handling of Updates #13

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
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
33 changes: 31 additions & 2 deletions lib/kickscraper/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,20 @@ def load_more_projects
end
end

def more_updates_available?
!@more_updates_url.nil?
end

alias_method :can_load_more_updates, :more_updates_available?

def load_more_updates
if self::more_updates_available?
self::process_api_url "updates", @more_updates_url
else
[]
end
end

def categories
self::process_api_call "categories", ""
end
Expand Down Expand Up @@ -156,11 +170,26 @@ def coerce_api_response(expected_type, response)

return empty_response if body.comments.nil?
body.comments.map { |comment| Comment.coerce comment }

when "update"

Update.coerce body

when "updates"

return empty_response if body.updates.nil?
body.updates.map { |update| Update.coerce update }
# Return an empty result set if the body has no updates
if body.updates.nil?

@more_updates_url = nil
return empty_response

# Otherwise, set the url that holds the next batch of updates (if available)
# and return an array of updates
else

@more_updates_url = (!body.urls.nil? && !body.urls.api.nil? && !body.urls.api.more_updates.nil? && !body.urls.api.more_updates.empty?) ? body.urls.api.more_updates : nil
return body.updates.map { |update| Update.coerce update }
end

when "categories"

Expand Down
33 changes: 32 additions & 1 deletion lib/kickscraper/client/update.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
module Kickscraper
class Update < Api

attr_accessor :sequence, :title, :body

def to_s
"Update \##{sequence}: #{title}"
end

def inspect
"<Update: '#{title}'>"
end

def reload!
# The API URL must be specified here as api['update'], because api.update refers to the
# update method inherited from Hashie
@raw = Kickscraper.client.process_api_url("Update", self.urls.api['update'], false)
Kickscraper::Update::do_coercion(self)
end

def sequence
reload! unless @raw['sequence']
@raw['sequence']
end

def title
reload! unless @raw['title']
@raw['title']
end

def body
reload! unless @raw['body']
@raw['body']
end

end
end
21 changes: 21 additions & 0 deletions spec/client_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,25 @@
its(:name) { should eq TEST_CATEGORY_NAME }
end

context "returns an array of updates when a valid project is loaded" do
subject { client.find_project(TEST_PROJECT_ID).updates }
it_returns "a collection", Kickscraper::Update
end

context "loads more updates when available" do
before { client.find_project(TEST_PROJECT_ID) }
subject do
client.more_updates_available?.should be_true
client.load_more_updates
end

it_returns "a collection", Kickscraper::Update
end

it "throws an error when accessing updates without a valid project loaded" do
subject { client.find_project TEST_PROJECT_ID }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey, just looking at this right now. I'm wondering if this test is actually passing for the wrong reason. If TEST_PROJECT_ID is a valid project, why is subject nil on the next line?

Maybe the subject should be in a context block, and it should search for an invalid project id?

expect { subject.to be_nil }
expect { subject.updates }.to raise_error
end

end
3 changes: 2 additions & 1 deletion spec/test_constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@
TEST_PROJECT_SLUG = 'wish-i-was-here-1'
TEST_PROJECT_NAME = "WISH I WAS HERE"
TEST_CATEGORY_NAME = 'Design'
TEST_CATEGORY_ID = 7
TEST_CATEGORY_ID = 7
TEST_PUBLIC_UPDATE_URL = 'https://api.kickstarter.com/v1/projects/1871494789/updates/462776'
34 changes: 34 additions & 0 deletions spec/update_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
describe Kickscraper::Update do
let(:client) { Kickscraper.client }
subject(:update) { client.find_project(TEST_PROJECT_ID).updates.first }

context "loads basic update information" do
its(:id) { should be > 0 }
its(:project_id) { should be > 0 }
its(:sequence) { should be > 0 }
its(:public) { should satisfy { |s| [true,false].include?(s) } }
its(:visible) { should satisfy { |s| [true,false].include?(s) } }
its(:title) { should_not be_empty }
its(:published_at) { should be >= 1262304000 }
its(:updated_at) { should be >= 1262304000 }
its(:comments_count) { should be >= 0 }
its(:likes_count) { should be >= 0 }
end

context "reloads" do
before { update.reload! }

its(:sequence) { should be > 0 }
its(:title) { should_not be_empty }
end

context "loads additional information for a visible update" do
# Ensure that this test runs on a public update, so its success does not
# depend on the user running the tests
subject { client.process_api_url("update", TEST_PUBLIC_UPDATE_URL) }

its(:body) { should_not be_empty }
its(:images) { should have_at_least(0).items }
its(:sounds) { should have_at_least(0).items }
end
end