kojac 0.9.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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'
|