diff --git a/cancan.gemspec b/cancan.gemspec index b067927..fcf362c 100644 --- a/cancan.gemspec +++ b/cancan.gemspec @@ -13,6 +13,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'rspec', '~> 2.0.0.beta.22' s.add_development_dependency 'rails', '~> 3.0.0' s.add_development_dependency 'rr', '~> 0.10.11' # 1.0.0 has respond_to? issues: http://github.com/btakita/rr/issues/issue/43 + s.add_development_dependency 'supermodel', '~> 0.1.4' s.rubyforge_project = s.name s.required_rubygems_version = ">= 1.3.4" diff --git a/spec/cancan/controller_resource_spec.rb b/spec/cancan/controller_resource_spec.rb index 34a8b2b..80e60dc 100644 --- a/spec/cancan/controller_resource_spec.rb +++ b/spec/cancan/controller_resource_spec.rb @@ -10,11 +10,11 @@ describe CanCan::ControllerResource do end it "should load the resource into an instance variable if params[:id] is specified" do - @params.merge!(:action => "show", :id => 123) - stub(Project).find(123) { :some_project } + project = Project.create! + @params.merge!(:action => "show", :id => project.id) resource = CanCan::ControllerResource.new(@controller) resource.load_resource - @controller.instance_variable_get(:@project).should == :some_project + @controller.instance_variable_get(:@project).should == project end it "should not load resource into an instance variable if already set" do @@ -26,19 +26,19 @@ describe CanCan::ControllerResource do end it "should properly load resource for namespaced controller" do - @params.merge!(:controller => "admin/projects", :action => "show", :id => 123) - stub(Project).find(123) { :some_project } + project = Project.create! + @params.merge!(:controller => "admin/projects", :action => "show", :id => project.id) resource = CanCan::ControllerResource.new(@controller) resource.load_resource - @controller.instance_variable_get(:@project).should == :some_project + @controller.instance_variable_get(:@project).should == project end it "should properly load resource for namespaced controller when using '::' for namespace" do - @params.merge!(:controller => "Admin::ProjectsController", :action => "show", :id => 123) - stub(Project).find(123) { :some_project } + project = Project.create! + @params.merge!(:controller => "Admin::ProjectsController", :action => "show", :id => project.id) resource = CanCan::ControllerResource.new(@controller) resource.load_resource - @controller.instance_variable_get(:@project).should == :some_project + @controller.instance_variable_get(:@project).should == project end it "should build a new resource with hash if params[:id] is not specified" do @@ -157,11 +157,11 @@ describe CanCan::ControllerResource do end it "should load parent resource through proper id parameter" do - @params.merge!(:action => "index", :project_id => 123) - stub(Project).find(123) { :some_project } + project = Project.create! + @params.merge!(:action => "index", :project_id => project.id) resource = CanCan::ControllerResource.new(@controller, :project, :parent => true) resource.load_resource - @controller.instance_variable_get(:@project).should == :some_project + @controller.instance_variable_get(:@project).should == project end it "should load resource through the association of another parent resource using instance variable" do @@ -185,16 +185,16 @@ describe CanCan::ControllerResource do end it "should not load through parent resource if instance isn't loaded when shallow" do - @params.merge!(:action => "show", :id => 123) - stub(Project).find(123) { :some_project } + project = Project.create! + @params.merge!(:action => "show", :id => project.id) resource = CanCan::ControllerResource.new(@controller, :through => :category, :shallow => true) resource.load_resource - @controller.instance_variable_get(:@project).should == :some_project + @controller.instance_variable_get(:@project).should == project end it "should raise AccessDenied when attempting to load resource through nil" do - @params.merge!(:action => "show", :id => 123) - stub(Project).find(123) { :some_project } + project = Project.create! + @params.merge!(:action => "show", :id => project.id) resource = CanCan::ControllerResource.new(@controller, :through => :category) lambda { resource.load_resource @@ -242,19 +242,19 @@ describe CanCan::ControllerResource do end it "should only authorize :read action on parent resource" do - @params.merge!(:action => "new", :project_id => 123) - stub(Project).find(123) { :some_project } - stub(@controller).authorize!(:read, :some_project) { raise CanCan::AccessDenied } + project = Project.create! + @params.merge!(:action => "new", :project_id => project.id) + stub(@controller).authorize!(:read, project) { raise CanCan::AccessDenied } resource = CanCan::ControllerResource.new(@controller, :project, :parent => true) lambda { resource.load_and_authorize_resource }.should raise_error(CanCan::AccessDenied) end it "should load the model using a custom class" do - @params.merge!(:action => "show", :id => 123) - stub(Project).find(123) { :some_project } + project = Project.create! + @params.merge!(:action => "show", :id => project.id) resource = CanCan::ControllerResource.new(@controller, :class => Project) resource.load_resource - @controller.instance_variable_get(:@project).should == :some_project + @controller.instance_variable_get(:@project).should == project end it "should authorize based on resource name if class is false" do @@ -265,20 +265,20 @@ describe CanCan::ControllerResource do end it "should load and authorize using custom instance name" do - @params.merge!(:action => "show", :id => 123) - stub(Project).find(123) { :some_project } - stub(@controller).authorize!(:show, :some_project) { raise CanCan::AccessDenied } + project = Project.create! + @params.merge!(:action => "show", :id => project.id) + stub(@controller).authorize!(:show, project) { raise CanCan::AccessDenied } resource = CanCan::ControllerResource.new(@controller, :instance_name => :custom_project) lambda { resource.load_and_authorize_resource }.should raise_error(CanCan::AccessDenied) - @controller.instance_variable_get(:@custom_project).should == :some_project + @controller.instance_variable_get(:@custom_project).should == project end it "should load resource using custom find_by attribute" do - @params.merge!(:action => "show", :id => 123) - stub(Project).find_by_name!(123) { :some_project } + project = Project.create!(:name => "foo") + @params.merge!(:action => "show", :id => "foo") resource = CanCan::ControllerResource.new(@controller, :find_by => :name) resource.load_resource - @controller.instance_variable_get(:@project).should == :some_project + @controller.instance_variable_get(:@project).should == project end it "should raise ImplementationRemoved when adding :name option" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e91a763..da6b77b 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,12 +1,17 @@ require 'rubygems' -require 'bundler' -Bundler.require(:default, :test) +require 'bundler/setup' +Bundler.require(:default) +require 'supermodel' # shouldn't Bundler do this already? require 'active_support/all' require 'matchers' require 'cancan/matchers' RSpec.configure do |config| config.mock_with :rr + config.before(:each) do + Project.delete_all + Category.delete_all + end end class Ability @@ -16,17 +21,12 @@ class Ability end end -# Generic class to mimic a model -class Project - attr_accessor :name +class Category < SuperModel::Base + has_many :projects +end - def initialize(attributes = {}) - @name = attributes[:name] - end - - def attributes=(attributes) - @name = attributes[:name] if attributes[:name] - end +class Project < SuperModel::Base + belongs_to :category class << self protected