spec/rapidash/resourceable_spec.rb in rapidash-0.1.2 vs spec/rapidash/resourceable_spec.rb in rapidash-0.2.0

- old
+ new

@@ -1,30 +1,41 @@ require "spec_helper" -class Rapidash::Repos +class Rapidash::Repo attr_accessor :client, :args def initialize(client, *args) @client = client @args = args end end -class Rapidash::Users +class Rapidash::User include Rapidash::Resourceable attr_accessor :client, :url resource :repos def initialize(client, *args) @client = client self end end -class Users +class User def initialize(*args) end end +class AdminUser + def initialize(*args) + end +end + +class CoreMembers + def initialize(*args) + end +end + + class Rapidash::ClientTester include Rapidash::Resourceable resource :users end @@ -45,15 +56,86 @@ Rapidash::ClientTester.methods.map { |m| m.to_sym }.should include(:resource) end end + + describe "instance methods" do + let(:client) { ClientTester.new } + + describe ".resource" do + + + it "should create a Rapidash::Base" do + client.resource(:users, 1).class.should eql(Rapidash::Base) + end + + it "should set the url to the resource name" do + resource = client.resource(:users) + resource.url.should eql("users") + end + + it "should pass the id through if specified" do + resource = client.resource(:users, 1) + resource.url.should eql("users/1") + end + + it "should pass the previous url through" do + def client.url + "base" + end + resource = client.resource(:users, 1) + resource.url.should eql("base/users/1") + end + + it "should pass the client through" do + resource = client.resource(:users, 1) + resource.client.should eql(client) + end + + it "should allow an explicit url to be sent" do + resource = client.resource(:users, 1, :url => "people") + resource.url.should eql("people/1") + end + + it "should be chainable" do + resource = client.resource(:users, 1).resource(:comments, 2) + resource.url.should eql("users/1/comments/2") + resource.client.should eql(client) + end + end + + describe ".resource!" do + it "should call the call! method on a resource" do + resource = mock + Rapidash::Base.stub(:new).and_return(resource) + resource.should_receive(:call!) + client.resource!(:users, 1) + end + end + end + describe "#resource" do it "should add a method with the name of the argument" do Rapidash::ClientTester.new.methods.map { |m| m.to_sym }.should include(:users) end + it "should not fail when presented with a multi-word resource" do + expect { + class ClientTester + resource :admin_users + end + }.to_not raise_error(NameError) + end + + it "should load the plural class with a warning if the singular is not defined" do + Kernel.should_receive(:warn).with("[DEPRECATED] - RAPIDASH WARNING using CoreMembers instead of CoreMember - please either use `CoreMember` or set the class name with `resource core_members, :class_name => CoreMembers` implicit plural naming will be deprecated in Rapidash 1.0") + class ClientTester + resource :core_members + end + end + it "should add a bang method with the name of the argument" do Rapidash::ClientTester.new.methods.map { |m| m.to_sym }.should include(:users!) end it "should add a method for each resource is an array is passed" do @@ -62,44 +144,93 @@ end end describe ".users" do it "should return an instance of the resource" do - Rapidash::ClientTester.new.users.class.should eql(Rapidash::Users) + Rapidash::ClientTester.new.users.class.should eql(Rapidash::User) end it "should not use a namespace if not in a module" do - ClientTester.new.users.class.should eql(Users) + ClientTester.new.users.class.should eql(User) end end describe ".tickets!" do it "should return an instance of the resource and call it" do users = mock - Rapidash::Users.should_receive(:new).and_return(users) + Rapidash::User.should_receive(:new).and_return(users) users.should_receive(:call!) Rapidash::ClientTester.new.users! end end describe "chaining resources" do it "should allow resources to be nested" do client = mock - users = Rapidash::Users.new(client) + users = Rapidash::User.new(client) users.methods.map { |m| m.to_sym }.should include(:repos) users.methods.map { |m| m.to_sym }.should include(:repos!) end it "should maintain the client across resources " do client = mock - users = Rapidash::Users.new(client) + users = Rapidash::User.new(client) users.repos.instance_variable_get(:@client).should eql(client) end it "should maintain the URL when chaining" do client = mock - users = Rapidash::Users.new(client) + users = Rapidash::User.new(client) users.repos.instance_variable_get(:@args)[0].keys.should include(:previous_url) end + + it "should maintain the URL as well as the options when chaining" do + client = mock + users = Rapidash::User.new(client) + repos = users.repos(:params => {:foo => :bar}) + repos.instance_variable_get(:@args)[0].should include(:params) + repos.instance_variable_get(:@args)[0].should include(:previous_url) + end end + describe "resource with module" do + module Facebook + class User + def initialize(*args) + end + end + + class Posts + def initialize(*args) + end + end + end + + module Its + module A + class DeepResource + def initialize(*args) + end + end + end + end + + class ModuleTester + include Rapidash::Resourceable + resource :users, :class_name => "Facebook::User" + resource :posts, :class_name => Facebook::Posts + resource :deep_resources, :class_name => Its::A::DeepResource + end + + it "should find user in another module" do + ModuleTester.new.users.class.should eql(Facebook::User) + end + + it "should allow a plural class name" do + ModuleTester.new.posts.class.should eql(Facebook::Posts) + end + + it "should find deep_resource in a nested module" do + ModuleTester.new.deep_resources.class.should eql(Its::A::DeepResource) + end + end end