kojac 0.9.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/.gitignore +4 -0
- data/Gemfile +1 -1
- data/app/assets/javascripts/kojac.js +393 -125
- data/app/assets/javascripts/kojac_canjs.js +34 -34
- data/app/assets/javascripts/kojac_ember.js +110 -152
- data/app/controllers/{kojac_controller.rb → kojac_base_controller.rb} +18 -11
- data/app/policies/kojac_base_policy.rb +114 -0
- data/app/serializers/kojac_base_serializer.rb +35 -0
- data/kojac.gemspec +12 -10
- data/lib/kojac/app_serialize.rb +31 -29
- data/lib/kojac/concentric.rb +152 -0
- data/lib/kojac/kojac_policy.rb +70 -0
- data/lib/kojac/kojac_rails.rb +200 -49
- data/lib/kojac/version.rb +1 -1
- data/spec/can_cache_spec.js +19 -19
- data/spec/demo/.gitignore +16 -0
- data/spec/demo/.ruby-gemset +1 -0
- data/spec/demo/.ruby-version +1 -0
- data/spec/demo/Gemfile +59 -0
- data/spec/demo/Gemfile.lock +153 -0
- data/spec/demo/README.rdoc +15 -248
- data/spec/demo/Rakefile +25 -1
- data/spec/demo/app/{mailers/.gitkeep → assets/images/.keep} +0 -0
- data/spec/demo/app/assets/javascripts/application.js +3 -3
- data/spec/demo/app/controllers/application_controller.rb +6 -1
- data/spec/demo/app/{models/.gitkeep → controllers/concerns/.keep} +0 -0
- data/spec/demo/app/controllers/users_controller.rb +5 -0
- data/spec/demo/{lib/assets/.gitkeep → app/mailers/.keep} +0 -0
- data/spec/demo/{log/.gitkeep → app/models/.keep} +0 -0
- data/spec/demo/app/models/concerns/.keep +0 -0
- data/spec/demo/app/models/user.rb +36 -0
- data/spec/demo/app/policies/user_policy.rb +42 -0
- data/spec/demo/bin/bundle +3 -0
- data/spec/demo/bin/rails +4 -0
- data/spec/demo/bin/rake +4 -0
- data/spec/demo/config.ru +1 -1
- data/spec/demo/config/application.rb +14 -46
- data/spec/demo/config/application.yml +4 -0
- data/spec/demo/config/boot.rb +3 -9
- data/spec/demo/config/database.yml +6 -6
- data/spec/demo/config/environment.rb +4 -2
- data/spec/demo/config/environments/development.rb +11 -19
- data/spec/demo/config/environments/production.rb +40 -27
- data/spec/demo/config/environments/test.rb +13 -14
- data/spec/demo/config/initializers/concentric_config.rb +9 -0
- data/spec/demo/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/demo/config/initializers/inflections.rb +6 -5
- data/spec/demo/config/initializers/initialize_kojac.rb +16 -0
- data/spec/demo/config/initializers/secret_token.rb +7 -2
- data/spec/demo/config/initializers/session_store.rb +0 -5
- data/spec/demo/config/initializers/wrap_parameters.rb +6 -6
- data/spec/demo/config/locales/en.yml +20 -2
- data/spec/demo/config/routes.rb +24 -24
- data/spec/demo/db/migrate/20131212034312_add_user.rb +14 -0
- data/spec/demo/db/migrate/20140107085351_add_owner_id.rb +5 -0
- data/spec/demo/db/schema.rb +28 -0
- data/spec/demo/db/seeds.rb +7 -0
- data/spec/demo/lib/assets/.keep +0 -0
- data/spec/demo/lib/tasks/.keep +0 -0
- data/spec/demo/log/.keep +0 -0
- data/spec/demo/public/404.html +43 -11
- data/spec/demo/public/422.html +43 -11
- data/spec/demo/public/500.html +43 -11
- data/spec/demo/public/robots.txt +5 -0
- data/spec/demo/spec/controllers/allowed_fields_spec.rb +171 -0
- data/spec/demo/spec/factories/users.rb +9 -0
- data/spec/demo/spec/features/concentric_spec.rb +63 -0
- data/spec/demo/spec/features/serialization_spec.rb +86 -0
- data/spec/demo/spec/spec_helper.rb +133 -0
- data/spec/demo/spec/spec_utils.rb +42 -0
- data/spec/demo/vendor/assets/javascripts/.keep +0 -0
- data/spec/demo/vendor/assets/stylesheets/.keep +0 -0
- data/spec/ember_factory_spec.js +1 -1
- data/spec/ember_model_spec.js +13 -3
- data/spec/ember_tojsono_spec.js +105 -0
- data/spec/error_handling_spec.js +90 -0
- data/spec/external/underscore_plus.js +318 -9
- data/spec/kojac_caching_spec.js +3 -1
- data/spec/kojac_ember_cache_spec.js +9 -0
- data/spec/kojac_mock_spec.js +4 -4
- data/spec/kojac_operations_spec.js +4 -4
- data/spec/local_provider_spec.js +184 -0
- data/spec/model_ring_spec.rb +2 -2
- data/spec/operation_include_spec.js +2 -2
- data/spec/run.html +34 -24
- data/spec/type_conversion_spec.js +38 -0
- data/vendor/assets/javascripts/jstorage.js +950 -0
- metadata +115 -129
- data/Gemfile.lock +0 -157
- data/app/serializers/default_kojac_serializer.rb +0 -10
- data/lib/kojac/ring_strong_parameters.rb +0 -195
- data/spec/.DS_Store +0 -0
- data/spec/demo/script/rails +0 -6
- data/spec/external/.DS_Store +0 -0
data/spec/demo/public/500.html
CHANGED
@@ -2,17 +2,48 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>We're sorry, but something went wrong (500)</title>
|
5
|
-
<style
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
5
|
+
<style>
|
6
|
+
body {
|
7
|
+
background-color: #EFEFEF;
|
8
|
+
color: #2E2F30;
|
9
|
+
text-align: center;
|
10
|
+
font-family: arial, sans-serif;
|
11
|
+
}
|
12
|
+
|
13
|
+
div.dialog {
|
14
|
+
width: 25em;
|
15
|
+
margin: 4em auto 0 auto;
|
16
|
+
border: 1px solid #CCC;
|
17
|
+
border-right-color: #999;
|
18
|
+
border-left-color: #999;
|
19
|
+
border-bottom-color: #BBB;
|
20
|
+
border-top: #B00100 solid 4px;
|
21
|
+
border-top-left-radius: 9px;
|
22
|
+
border-top-right-radius: 9px;
|
23
|
+
background-color: white;
|
24
|
+
padding: 7px 4em 0 4em;
|
25
|
+
}
|
26
|
+
|
27
|
+
h1 {
|
28
|
+
font-size: 100%;
|
29
|
+
color: #730E15;
|
30
|
+
line-height: 1.5em;
|
31
|
+
}
|
32
|
+
|
33
|
+
body > p {
|
34
|
+
width: 33em;
|
35
|
+
margin: 0 auto 1em;
|
36
|
+
padding: 1em 0;
|
37
|
+
background-color: #F7F7F7;
|
38
|
+
border: 1px solid #CCC;
|
39
|
+
border-right-color: #999;
|
40
|
+
border-bottom-color: #999;
|
41
|
+
border-bottom-left-radius: 4px;
|
42
|
+
border-bottom-right-radius: 4px;
|
43
|
+
border-top-color: #DADADA;
|
44
|
+
color: #666;
|
45
|
+
box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
|
46
|
+
}
|
16
47
|
</style>
|
17
48
|
</head>
|
18
49
|
|
@@ -21,5 +52,6 @@
|
|
21
52
|
<div class="dialog">
|
22
53
|
<h1>We're sorry, but something went wrong.</h1>
|
23
54
|
</div>
|
55
|
+
<p>If you are the application owner check the logs for more information.</p>
|
24
56
|
</body>
|
25
57
|
</html>
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KojacBaseController do
|
4
|
+
|
5
|
+
#before(:each) do
|
6
|
+
# #@user = FactoryGirl.create(:user, ring: 3)
|
7
|
+
# #ApplicationController.any_instance.stub(:current_user).and_return(@user)
|
8
|
+
#end
|
9
|
+
|
10
|
+
it 'user read should return allowed fields' do
|
11
|
+
stub_login_user(ring: USER_RING)
|
12
|
+
@user2 = FactoryGirl.create(:user)
|
13
|
+
read_op = {
|
14
|
+
verb: 'READ',
|
15
|
+
key: @user2.kojac_key
|
16
|
+
}
|
17
|
+
draw_routes do
|
18
|
+
get ":controller/:action"
|
19
|
+
end
|
20
|
+
result = do_op(read_op)
|
21
|
+
result.keys.sort.should == (User::PUBLIC_FIELDS).map(&:to_s).sort
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'admin read should return more allowed fields' do
|
25
|
+
stub_login_user(ring: ADMIN_RING)
|
26
|
+
@user2 = FactoryGirl.create(:user)
|
27
|
+
read_op = {
|
28
|
+
verb: 'READ',
|
29
|
+
key: @user2.kojac_key
|
30
|
+
}
|
31
|
+
draw_routes do
|
32
|
+
get ":controller/:action"
|
33
|
+
end
|
34
|
+
result = do_op(read_op)
|
35
|
+
result.keys.sort.should == (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS + User::ADMIN_FIELDS + User::READ_ONLY_FIELDS).map(&:to_s).sort
|
36
|
+
end
|
37
|
+
|
38
|
+
it "user should not be able to update other's name" do
|
39
|
+
user = stub_login_user(ring: USER_RING)
|
40
|
+
user2 = FactoryGirl.create(:user)
|
41
|
+
original_name = user2.last_name
|
42
|
+
send_op = {
|
43
|
+
verb: 'UPDATE',
|
44
|
+
key: user2.kojac_key,
|
45
|
+
value: {
|
46
|
+
last_name: 'Smithy-Jones'
|
47
|
+
}
|
48
|
+
}
|
49
|
+
draw_routes do
|
50
|
+
get ":controller/:action"
|
51
|
+
end
|
52
|
+
expect { do_op(send_op) }.to raise_exception(Pundit::NotAuthorizedError)
|
53
|
+
user2.reload
|
54
|
+
user2.last_name.should == original_name
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'user should be able to read own PRIVATE_FIELDS' do
|
58
|
+
user = stub_login_user(ring: USER_RING)
|
59
|
+
send_op = {
|
60
|
+
verb: 'READ',
|
61
|
+
key: user.kojac_key
|
62
|
+
}
|
63
|
+
draw_routes do
|
64
|
+
get ":controller/:action"
|
65
|
+
end
|
66
|
+
result = do_op(send_op)
|
67
|
+
result.keys.sort.should == (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS).map(&:to_s).sort
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
it 'user should be able to update own name' do
|
72
|
+
user = stub_login_user(ring: USER_RING)
|
73
|
+
send_op = {
|
74
|
+
verb: 'UPDATE',
|
75
|
+
key: user.kojac_key,
|
76
|
+
value: {
|
77
|
+
last_name: 'Smithy-Jones'
|
78
|
+
}
|
79
|
+
}
|
80
|
+
draw_routes do
|
81
|
+
get ":controller/:action"
|
82
|
+
end
|
83
|
+
result = do_op(send_op)
|
84
|
+
result['last_name'].should == send_op.g?('value.last_name')
|
85
|
+
result.keys.sort.should == (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS).map(&:to_s).sort
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'admin user should be able to update user of same owner' do
|
89
|
+
user = stub_login_user(ring: ADMIN_RING, owner_id: 1)
|
90
|
+
user2 = FactoryGirl.create(:user, owner_id: 1)
|
91
|
+
original_name = user2.last_name
|
92
|
+
send_op = {
|
93
|
+
verb: 'UPDATE',
|
94
|
+
key: user2.kojac_key,
|
95
|
+
value: {
|
96
|
+
last_name: 'Smithy-Jones'
|
97
|
+
}
|
98
|
+
}
|
99
|
+
draw_routes do
|
100
|
+
get ":controller/:action"
|
101
|
+
end
|
102
|
+
result = do_op(send_op)
|
103
|
+
result['last_name'].should == send_op.g?('value.last_name')
|
104
|
+
user2.reload
|
105
|
+
user2.last_name.should == send_op.g?('value.last_name')
|
106
|
+
result.keys.sort.should == (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS + User::ADMIN_FIELDS + User::READ_ONLY_FIELDS).map(&:to_s).sort
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'admin user should not be able to update user of different owner' do
|
110
|
+
user = stub_login_user(ring: ADMIN_RING, owner_id: 1)
|
111
|
+
user2 = FactoryGirl.create(:user, owner_id: 2)
|
112
|
+
original_name = user2.last_name
|
113
|
+
send_op = {
|
114
|
+
verb: 'UPDATE',
|
115
|
+
key: user2.kojac_key,
|
116
|
+
value: {
|
117
|
+
last_name: 'Smithy-Jones'
|
118
|
+
}
|
119
|
+
}
|
120
|
+
draw_routes do
|
121
|
+
get ":controller/:action"
|
122
|
+
end
|
123
|
+
expect { do_op(send_op) }.to raise_exception(Pundit::NotAuthorizedError)
|
124
|
+
user2.reload
|
125
|
+
user2.last_name.should == original_name
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should read users' do
|
129
|
+
@user = stub_login_user(ring: ADMIN_RING)
|
130
|
+
@user2 = FactoryGirl.create(:user)
|
131
|
+
read_op = {
|
132
|
+
verb: 'READ',
|
133
|
+
key: 'users'
|
134
|
+
}
|
135
|
+
content = {
|
136
|
+
options: {},
|
137
|
+
ops: [
|
138
|
+
read_op
|
139
|
+
]
|
140
|
+
}
|
141
|
+
draw_routes do
|
142
|
+
get ":controller/:action"
|
143
|
+
end
|
144
|
+
request.accept = "application/json"
|
145
|
+
post :receive, format: :json, kojac: content
|
146
|
+
|
147
|
+
output = JSON.parse response.body
|
148
|
+
output['ops'].should be_is_a Array
|
149
|
+
output['ops'].length.should == 1
|
150
|
+
op = output['ops'].first
|
151
|
+
op['verb'].should == read_op[:verb]
|
152
|
+
op['key'].should == read_op[:key]
|
153
|
+
op['results'].class.should == Hash
|
154
|
+
user_key = "users__#{@user.id}"
|
155
|
+
user2_key = "users__#{@user2.id}"
|
156
|
+
|
157
|
+
op['results'].keys.sort.should == ["users",user_key,user2_key].sort
|
158
|
+
op['results']['users'].should == [@user.id,@user2.id]
|
159
|
+
op['results'][user_key].filter_include(%w(id first_name last_name)).should == {
|
160
|
+
'id' => @user.id,
|
161
|
+
'first_name' => @user.first_name,
|
162
|
+
'last_name' => @user.last_name
|
163
|
+
}
|
164
|
+
op['results'][user2_key].filter_include(%w(id first_name last_name)).should == {
|
165
|
+
'id' => @user2.id,
|
166
|
+
'first_name' => @user2.first_name,
|
167
|
+
'last_name' => @user2.last_name
|
168
|
+
}
|
169
|
+
op['result'].should_not be
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "ConcentricTestModel" do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@original_config = Concentric.config
|
7
|
+
Concentric.config = {
|
8
|
+
ring_names: {
|
9
|
+
master: 0,
|
10
|
+
boss: 10,
|
11
|
+
pleb: 30,
|
12
|
+
anyone: 100
|
13
|
+
}
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
after(:all) do
|
18
|
+
Concentric.config = @original_config
|
19
|
+
end
|
20
|
+
|
21
|
+
it "attributes described should be available in outer rings" do
|
22
|
+
class ConcentricTestModel < ActiveRecord::Base
|
23
|
+
include Concentric::Model
|
24
|
+
|
25
|
+
ring :pleb, read: [:name,:address]
|
26
|
+
ring :pleb, read: [:dob]
|
27
|
+
ring :boss, read: [:next_of_kin]
|
28
|
+
|
29
|
+
ring :boss, transmogrify: []
|
30
|
+
ring :boss, eliminate: :this
|
31
|
+
|
32
|
+
ring :pleb, [:cough,:sneeze] => [:desk,:outside]
|
33
|
+
end
|
34
|
+
|
35
|
+
ConcentricTestModel.permitted(:pleb,:read).should == [:address,:dob,:name]
|
36
|
+
ConcentricTestModel.permitted(:master,:read).should == [:address,:dob,:name,:next_of_kin]
|
37
|
+
ConcentricTestModel.permitted(:anyone,:read).should == []
|
38
|
+
ConcentricTestModel.ring_can?(:pleb,:read).should == true
|
39
|
+
ConcentricTestModel.ring_can?(:master,:read).should == true
|
40
|
+
ConcentricTestModel.ring_can?(:anyone,:read).should == false
|
41
|
+
|
42
|
+
ConcentricTestModel.ring_can?(:pleb,:transmogrify).should == false
|
43
|
+
ConcentricTestModel.ring_can?(:boss,:transmogrify).should == false
|
44
|
+
ConcentricTestModel.ring_can?(:master,:transmogrify).should == false
|
45
|
+
|
46
|
+
ConcentricTestModel.ring_can?(:pleb,:eliminate).should == false
|
47
|
+
ConcentricTestModel.ring_can?(:boss,:eliminate).should == true
|
48
|
+
ConcentricTestModel.ring_can?(:master,:eliminate).should == true
|
49
|
+
|
50
|
+
ConcentricTestModel.ring_can?(:pleb,:cough).should == true
|
51
|
+
ConcentricTestModel.ring_can?(:pleb,:sneeze).should == true
|
52
|
+
ConcentricTestModel.ring_can?(:boss,:cough).should == true
|
53
|
+
ConcentricTestModel.ring_can?(:boss,:sneeze).should == true
|
54
|
+
ConcentricTestModel.ring_can?(:pleb,:cough,:outside).should == true
|
55
|
+
ConcentricTestModel.ring_can?(:pleb,:cough,:desk).should == true
|
56
|
+
ConcentricTestModel.ring_can?(:pleb,:cough,[:desk,:outside]).should == true
|
57
|
+
ConcentricTestModel.ring_can?(:pleb,:cough,:lunch_room).should == false
|
58
|
+
|
59
|
+
ConcentricTestModel.permitted(:pleb,:cough).should == [:desk,:outside]
|
60
|
+
ConcentricTestModel.permitted(:pleb,:sneeze).should == [:desk,:outside]
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "serialization" do
|
4
|
+
|
5
|
+
it "should serialize array" do
|
6
|
+
user = FactoryGirl.create(:user)
|
7
|
+
jsons = KojacUtils.to_json([1,2,3],scope: user)
|
8
|
+
jsons.should == '[1,2,3]'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should serialize number" do
|
12
|
+
user = FactoryGirl.create(:user)
|
13
|
+
jsons = KojacUtils.to_json(5,scope: user)
|
14
|
+
jsons.should == '5'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should serialize object" do
|
18
|
+
user = FactoryGirl.create(:user)
|
19
|
+
jsons = KojacUtils.to_json({a: 1, b: 2},scope: user)
|
20
|
+
jsons.should == '{"a":1,"b":2}'
|
21
|
+
end
|
22
|
+
|
23
|
+
#it "should serialize Deal" do
|
24
|
+
# user = FactoryGirl.create(:user)
|
25
|
+
# deal = FactoryGirl.create(:deal, user: user)
|
26
|
+
# jsons = KojacUtils.to_json(deal,scope: user)
|
27
|
+
# jsono = JSON.parse jsons
|
28
|
+
# jsono['trade_in_price'].should be > 0
|
29
|
+
# jsono['cash_deposit'].should be > 0
|
30
|
+
# jsono['other_cost'].should be > 0
|
31
|
+
#end
|
32
|
+
|
33
|
+
it "to_jsono should convert embedded model to a hash" do
|
34
|
+
user = FactoryGirl.create(:user)
|
35
|
+
user2 = FactoryGirl.create(:user)
|
36
|
+
|
37
|
+
embed = {user: user2}
|
38
|
+
jsono = KojacUtils.to_jsono(embed,scope: user)
|
39
|
+
jsono['user'].class.should == Hash
|
40
|
+
end
|
41
|
+
|
42
|
+
it "model serialized inside a hash should give the same fields as when serialized directly" do
|
43
|
+
user = FactoryGirl.create(:user)
|
44
|
+
user2 = FactoryGirl.create(:user)
|
45
|
+
|
46
|
+
embed = {user: user2}
|
47
|
+
embed_jsons = KojacUtils.to_json(embed,scope: user)
|
48
|
+
embed_jsono = JSON.parse embed_jsons
|
49
|
+
|
50
|
+
direct_jsons = KojacUtils.to_json(user2,scope: user)
|
51
|
+
direct_jsono = JSON.parse direct_jsons
|
52
|
+
|
53
|
+
embed_jsono['user'].should == direct_jsono
|
54
|
+
end
|
55
|
+
|
56
|
+
#it "model serialized deeply inside a structure should give the same fields as when serialized directly" do
|
57
|
+
# user = FactoryGirl.create(:user)
|
58
|
+
# user2 = FactoryGirl.create(:user)
|
59
|
+
#
|
60
|
+
# embed = {user: user2}
|
61
|
+
# embed_jsons = KojacUtils.to_json(embed,scope: user)
|
62
|
+
# embed_jsono = JSON.parse embed_jsons
|
63
|
+
#
|
64
|
+
# direct_jsons = KojacUtils.to_json(user2,scope: user)
|
65
|
+
# direct_jsono = JSON.parse direct_jsons
|
66
|
+
#
|
67
|
+
# embed_jsono['user'].should == direct_jsono
|
68
|
+
#end
|
69
|
+
|
70
|
+
it "should test models embedded in an Array" do
|
71
|
+
user = FactoryGirl.create(:user)
|
72
|
+
user2 = FactoryGirl.create(:user)
|
73
|
+
|
74
|
+
embed = [user2]
|
75
|
+
embed_jsons = KojacUtils.to_json(embed,scope: user)
|
76
|
+
embed_jsono = JSON.parse embed_jsons
|
77
|
+
|
78
|
+
direct_jsons = KojacUtils.to_json(user2,scope: user)
|
79
|
+
direct_jsono = JSON.parse direct_jsons
|
80
|
+
|
81
|
+
embed_jsono[0].should == direct_jsono
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should test models embedded in an HashWithIndifferentAccess"
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
|
+
ENV["RAILS_ENV"] ||= 'test'
|
3
|
+
require File.expand_path("../../config/environment", __FILE__)
|
4
|
+
require 'rspec/rails'
|
5
|
+
#require 'capybara/rspec'
|
6
|
+
require 'rspec/autorun'
|
7
|
+
|
8
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
9
|
+
# in spec/support/ and its subdirectories.
|
10
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
11
|
+
|
12
|
+
#Capybara.run_server = true #Whether start server when testing
|
13
|
+
#Capybara.server_port = 8200
|
14
|
+
#Capybara.default_selector = :css #:xpath #default selector , you can change to :css
|
15
|
+
#Capybara.default_wait_time = 5 #When we testing AJAX, we can set a default wait time
|
16
|
+
#Capybara.ignore_hidden_elements = false #Ignore hidden elements when testing, make helpful when you hide or show elements using javascript
|
17
|
+
#Capybara.javascript_driver = :selenium #default driver when you using @javascript tag
|
18
|
+
|
19
|
+
#require 'capybara/poltergeist'
|
20
|
+
#Capybara.javascript_driver = :poltergeist
|
21
|
+
#Capybara.register_driver :poltergeist do |app|
|
22
|
+
# options = {
|
23
|
+
# :js_errors => true,
|
24
|
+
# :timeout => 120,
|
25
|
+
# :debug => true,
|
26
|
+
# :phantomjs_options => ['--load-images=no', '--disk-cache=false'],
|
27
|
+
# :inspector => true,
|
28
|
+
# }
|
29
|
+
# Capybara::Poltergeist::Driver.new(app, options)
|
30
|
+
#end
|
31
|
+
|
32
|
+
#Post-install message from capybara:
|
33
|
+
#IMPORTANT! Some of the defaults have changed in Capybara 2.1. If you're experiencing failures,
|
34
|
+
#please revert to the old behaviour by setting:
|
35
|
+
#
|
36
|
+
# Capybara.configure do |config|
|
37
|
+
# config.match = :one
|
38
|
+
# config.exact_options = true
|
39
|
+
# config.ignore_hidden_elements = true
|
40
|
+
# config.visible_text_only = true
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
#If you're migrating from Capybara 1.x, try:
|
44
|
+
#
|
45
|
+
# Capybara.configure do |config|
|
46
|
+
# config.match = :prefer_exact
|
47
|
+
# config.ignore_hidden_elements = false
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
#Details here: http://www.elabs.se/blog/60-introducing-capybara-2-1
|
51
|
+
#
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
RSpec.configure do |config|
|
56
|
+
config.color_enabled = true
|
57
|
+
config.tty = true
|
58
|
+
|
59
|
+
# ## Mock Framework
|
60
|
+
#
|
61
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
62
|
+
#
|
63
|
+
# config.mock_with :mocha
|
64
|
+
# config.mock_with :flexmock
|
65
|
+
# config.mock_with :rr
|
66
|
+
|
67
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
68
|
+
#config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
69
|
+
|
70
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
71
|
+
# examples within a transaction, remove the following line or assign false
|
72
|
+
# instead of true.
|
73
|
+
config.use_transactional_fixtures = true # false # should be false when using Database Cleaner https://www.relishapp.com/rspec/rspec-rails/docs/transactions
|
74
|
+
|
75
|
+
# Run specs in random order to surface order dependencies. If you find an
|
76
|
+
# order dependency and want to debug it, you can fix the order by providing
|
77
|
+
# the seed, which is printed after each run.
|
78
|
+
# --seed 1234
|
79
|
+
#config.order = "random"
|
80
|
+
|
81
|
+
# see http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
|
82
|
+
#config.before(:suite) do # once only, before set of specs run
|
83
|
+
# DatabaseCleaner.clean_with(:truncation)
|
84
|
+
#end
|
85
|
+
#
|
86
|
+
#config.before :each do
|
87
|
+
# #if Capybara.current_driver == :rack_test
|
88
|
+
# DatabaseCleaner.strategy = :transaction
|
89
|
+
# #else
|
90
|
+
# # DatabaseCleaner.strategy = :truncation
|
91
|
+
# #end
|
92
|
+
# DatabaseCleaner.start
|
93
|
+
# ActionMailer::Base.deliveries.clear
|
94
|
+
#end
|
95
|
+
#
|
96
|
+
#config.after(:each) do
|
97
|
+
# DatabaseCleaner.clean
|
98
|
+
#end
|
99
|
+
|
100
|
+
#config.before(:all) do
|
101
|
+
# DeferredGarbageCollection.start
|
102
|
+
#end
|
103
|
+
#
|
104
|
+
#config.after(:all) do
|
105
|
+
# DeferredGarbageCollection.reconsider
|
106
|
+
#end
|
107
|
+
|
108
|
+
#config.include ShowMeTheCookies#, :type => :feature
|
109
|
+
#
|
110
|
+
##config.include ProductsHelper
|
111
|
+
#config.include ActionView::Helpers::TextHelper
|
112
|
+
#
|
113
|
+
#config.include(EmailSpec::Helpers)
|
114
|
+
#config.include(EmailSpec::Matchers)
|
115
|
+
|
116
|
+
#config.treat_symbols_as_metadata_keys_with_true_values = true
|
117
|
+
#config.filter_run_excluding :requires_elasticsearch unless CONFIG[:elasticsearch_available]
|
118
|
+
end
|
119
|
+
|
120
|
+
# Capybara operations normally happen on another thread and connection, and so transactional database cleaning won't work.
|
121
|
+
# This hack makes all operations share a common connection, and so transactional database cleaning works even for capybara tests
|
122
|
+
# Also see https://gist.github.com/josevalim/470808 and http://stackoverflow.com/questions/8774227/why-not-use-shared-activerecord-connections-for-rspec-selenium
|
123
|
+
#class ActiveRecord::Base
|
124
|
+
# mattr_accessor :shared_connection
|
125
|
+
# @@shared_connection = nil
|
126
|
+
#
|
127
|
+
# def self.connection
|
128
|
+
# @@shared_connection || retrieve_connection
|
129
|
+
# end
|
130
|
+
#end
|
131
|
+
#ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
|
132
|
+
#
|
133
|
+
require 'spec_utils'
|