forked from ryanb/cancan
/
mongo_mapper_adapter_spec.rb
108 lines (87 loc) · 4.2 KB
/
mongo_mapper_adapter_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
if ENV["MODEL_ADAPTER"] == "mongo_mapper"
require "spec_helper"
MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
MongoMapper.database = "cancan_mongomapper_spec"
class MongoMapperProject
include MongoMapper::Document
end
describe CanCan::ModelAdapters::MongoMapperAdapter do
context "MongoMapper defined" do
before(:each) do
@ability = Object.new
@ability.extend(CanCan::Ability)
end
after(:each) do
MongoMapperProject.destroy_all
end
it "is for only MongoMapper classes" do
CanCan::ModelAdapters::MongoMapperAdapter.should_not be_for_class(Object)
CanCan::ModelAdapters::MongoMapperAdapter.should be_for_class(MongoMapperProject)
CanCan::ModelAdapters::AbstractAdapter.adapter_class(MongoMapperProject).should == CanCan::ModelAdapters::MongoMapperAdapter
end
it "finds record" do
project = MongoMapperProject.create
CanCan::ModelAdapters::MongoMapperAdapter.find(MongoMapperProject, project.id).should == project
end
it "compares properties on mongomapper documents with the conditions hash" do
model = MongoMapperProject.new
@ability.can :read, :mongo_mapper_projects, :id => model.id
@ability.should be_able_to(:read, model)
end
it "is able to read hashes when field is array" do
one_to_three = MongoMapperProject.create(:numbers => ['one', 'two', 'three'])
two_to_five = MongoMapperProject.create(:numbers => ['two', 'three', 'four', 'five'])
@ability.can :foo, :mongo_mapper_projects, :numbers => 'one'
@ability.should be_able_to(:foo, one_to_three)
@ability.should_not be_able_to(:foo, two_to_five)
end
it "returns [] when no ability is defined so no records are found" do
MongoMapperProject.create
MongoMapperProject.create
MongoMapperProject.create
MongoMapperProject.accessible_by(@ability, :read).entries.should == []
end
it "returns the correct records based on the defined ability" do
@ability.can :read, :mongo_mapper_projects, :title => "Sir"
sir = MongoMapperProject.create(:title => 'Sir')
lord = MongoMapperProject.create(:title => 'Lord')
dude = MongoMapperProject.create(:title => 'Dude')
MongoMapperProject.accessible_by(@ability, :read).entries.should == [sir]
end
it "is able to mix empty conditions and hashes" do
@ability.can :read, :mongo_mapper_projects, :title => 'Sir'
@ability.can :read, :mongo_mapper_projects
sir = MongoMapperProject.create(:title => 'Sir')
lord = MongoMapperProject.create(:title => 'Lord')
MongoMapperProject.accessible_by(@ability, :read).count.should == 2
end
it "returns everything when the defined ability is access all" do
@ability.can :access, :all
sir = MongoMapperProject.create(:title => 'Sir')
lord = MongoMapperProject.create(:title => 'Lord')
dude = MongoMapperProject.create(:title => 'Dude')
MongoMapperProject.accessible_by(@ability, :read).entries.should == [sir, lord, dude]
end
it "calls where with matching ability conditions" do
obj = MongoMapperProject.create(:foo => {:bar => 1})
@ability.can :read, :mongo_mapper_projects, :foo => {:bar => 1}
MongoMapperProject.accessible_by(@ability, :read).entries.first.should == obj
end
it "excludes from the result if set to cannot" do
obj = MongoMapperProject.create(:bar => 1)
obj2 = MongoMapperProject.create(:bar => 2)
@ability.can :read, :mongo_mapper_projects
@ability.cannot :read, :mongo_mapper_projects, :bar => 2
MongoMapperProject.accessible_by(@ability, :read).entries.should == [obj]
end
it "combines the rules" do
obj = MongoMapperProject.create(:bar => 1)
obj2 = MongoMapperProject.create(:bar => 2)
obj3 = MongoMapperProject.create(:bar => 3)
@ability.can :read, :mongo_mapper_projects, :bar => 1
@ability.can :read, :mongo_mapper_projects, :bar => 2
MongoMapperProject.accessible_by(@ability, :read).entries.should =~ [obj, obj2]
end
end
end
end