forest_liana 5.2.3 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/forest_liana/actions_controller.rb +95 -0
  3. data/app/controllers/forest_liana/resources_controller.rb +14 -17
  4. data/app/controllers/forest_liana/smart_actions_controller.rb +10 -5
  5. data/app/helpers/forest_liana/is_same_data_structure_helper.rb +44 -0
  6. data/app/helpers/forest_liana/widgets_helper.rb +59 -0
  7. data/app/models/forest_liana/model/action.rb +2 -1
  8. data/app/services/forest_liana/apimap_sorter.rb +1 -0
  9. data/app/services/forest_liana/permissions_checker.rb +118 -56
  10. data/app/services/forest_liana/permissions_formatter.rb +52 -0
  11. data/app/services/forest_liana/permissions_getter.rb +52 -17
  12. data/app/services/forest_liana/resources_getter.rb +3 -3
  13. data/app/services/forest_liana/scope_validator.rb +8 -7
  14. data/app/services/forest_liana/utils/beta_schema_utils.rb +13 -0
  15. data/config/routes.rb +2 -0
  16. data/lib/forest_liana/bootstrapper.rb +19 -0
  17. data/lib/forest_liana/schema_file_updater.rb +1 -0
  18. data/lib/forest_liana/version.rb +1 -1
  19. data/spec/helpers/forest_liana/is_same_data_structure_helper_spec.rb +87 -0
  20. data/spec/requests/actions_controller_spec.rb +174 -0
  21. data/spec/services/forest_liana/apimap_sorter_spec.rb +6 -4
  22. data/spec/services/forest_liana/permissions_checker_acl_disabled_spec.rb +711 -0
  23. data/spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb +831 -0
  24. data/spec/services/forest_liana/permissions_formatter_spec.rb +222 -0
  25. data/spec/services/forest_liana/permissions_getter_spec.rb +82 -0
  26. data/spec/services/forest_liana/schema_adapter_spec.rb +1 -1
  27. data/spec/spec_helper.rb +3 -0
  28. metadata +18 -2
@@ -0,0 +1,222 @@
1
+ module ForestLiana
2
+ describe PermissionsFormatter do
3
+ describe '#convert_to_new_format' do
4
+ let(:rendering_id) { 1 }
5
+ let(:old_format_collection_permissions) {
6
+ {
7
+ 'list'=>true,
8
+ 'show'=>false,
9
+ 'create'=>true,
10
+ 'update'=>false,
11
+ 'delete'=>true,
12
+ 'export'=>false,
13
+ 'searchToEdit'=>false
14
+ }
15
+ }
16
+ let(:old_format_action_permissions) { { 'allowed' => true, 'users' => nil } }
17
+ let(:old_format_scope_permissions) { nil }
18
+ let(:old_format_permissions) {
19
+ {
20
+ 'collection_1' => {
21
+ 'collection' => old_format_collection_permissions,
22
+ 'actions' => {
23
+ 'action_1' => old_format_action_permissions
24
+ },
25
+ 'scope' => old_format_scope_permissions
26
+ }
27
+ }
28
+ }
29
+
30
+ let(:converted_permission) { described_class.convert_to_new_format(old_format_permissions, rendering_id) }
31
+
32
+ describe 'collection permissions' do
33
+ subject { converted_permission['collections']['collection_1']['collection'] }
34
+
35
+ let(:expected_new_collection_permissions_format) {
36
+ {
37
+ 'browseEnabled'=>true,
38
+ 'readEnabled'=>false,
39
+ 'addEnabled'=>true,
40
+ 'editEnabled'=>false,
41
+ 'deleteEnabled'=>true,
42
+ 'exportEnabled'=>false
43
+ }
44
+ }
45
+
46
+ it 'should convert the old format to the new one' do
47
+ expect(subject).to eq expected_new_collection_permissions_format
48
+ end
49
+
50
+ describe 'with searchToEdit true and list false' do
51
+ let(:old_format_collection_permissions) {
52
+ {
53
+ 'list'=>false,
54
+ 'show'=>false,
55
+ 'create'=>false,
56
+ 'update'=>false,
57
+ 'delete'=>false,
58
+ 'export'=>false,
59
+ 'searchToEdit'=>true
60
+ }
61
+ }
62
+
63
+ let(:expected_new_collection_permissions_format) {
64
+ {
65
+ 'browseEnabled'=>true,
66
+ 'readEnabled'=>false,
67
+ 'addEnabled'=>false,
68
+ 'editEnabled'=>false,
69
+ 'deleteEnabled'=>false,
70
+ 'exportEnabled'=>false
71
+ }
72
+ }
73
+
74
+ it 'should convert the old format to the new one with browseEnabled at true' do
75
+ expect(subject).to eq expected_new_collection_permissions_format
76
+ end
77
+ end
78
+
79
+ describe 'with searchToEdit false and list true' do
80
+ let(:old_format_collection_permissions) {
81
+ {
82
+ 'list'=>true,
83
+ 'show'=>false,
84
+ 'create'=>false,
85
+ 'update'=>false,
86
+ 'delete'=>false,
87
+ 'export'=>false,
88
+ 'searchToEdit'=>false
89
+ }
90
+ }
91
+
92
+ let(:expected_new_collection_permissions_format) {
93
+ {
94
+ 'browseEnabled'=>true,
95
+ 'readEnabled'=>false,
96
+ 'addEnabled'=>false,
97
+ 'editEnabled'=>false,
98
+ 'deleteEnabled'=>false,
99
+ 'exportEnabled'=>false
100
+ }
101
+ }
102
+
103
+ it 'should convert the old format to the new one with browseEnabled at true' do
104
+ expect(subject).to eq expected_new_collection_permissions_format
105
+ end
106
+ end
107
+
108
+ describe 'with searchToEdit false and list false' do
109
+ let(:old_format_collection_permissions) {
110
+ {
111
+ 'list'=>false,
112
+ 'show'=>false,
113
+ 'create'=>false,
114
+ 'update'=>false,
115
+ 'delete'=>false,
116
+ 'export'=>false,
117
+ 'searchToEdit'=>false
118
+ }
119
+ }
120
+
121
+ let(:expected_new_collection_permissions_format) {
122
+ {
123
+ 'browseEnabled'=>false,
124
+ 'readEnabled'=>false,
125
+ 'addEnabled'=>false,
126
+ 'editEnabled'=>false,
127
+ 'deleteEnabled'=>false,
128
+ 'exportEnabled'=>false
129
+ }
130
+ }
131
+
132
+ it 'should convert the old format to the new one with browseEnabled at false' do
133
+ expect(subject).to eq expected_new_collection_permissions_format
134
+ end
135
+ end
136
+ end
137
+
138
+ describe 'action permissions' do
139
+ subject { converted_permission['collections']['collection_1']['actions']['action_1'] }
140
+
141
+ context 'when allowed is true' do
142
+ context 'when users is nil' do
143
+ let(:old_format_action_permissions) { { 'allowed' => true, 'users' => nil } }
144
+ let(:expected_new_action_permissions_format) { { 'triggerEnabled' => true } }
145
+
146
+ it 'expected action permission triggerEnabled field should be true' do
147
+ expect(subject).to eq expected_new_action_permissions_format
148
+ end
149
+ end
150
+
151
+ context 'when users is an empty array' do
152
+ let(:old_format_action_permissions) { { 'allowed' => true, 'users' => [] } }
153
+ let(:expected_new_action_permissions_format) { { 'triggerEnabled' => [] } }
154
+
155
+ it 'expected action permission triggerEnabled field should be an empty array' do
156
+ expect(subject).to eq expected_new_action_permissions_format
157
+ end
158
+ end
159
+
160
+ context 'when users is NOT an empty array' do
161
+ let(:old_format_action_permissions) { { 'allowed' => true, 'users' => [2, 3] } }
162
+ let(:expected_new_action_permissions_format) { { 'triggerEnabled' => [2, 3] } }
163
+
164
+ it 'expected action permission triggerEnabled field should be equal to the users array' do
165
+ expect(subject).to eq expected_new_action_permissions_format
166
+ end
167
+ end
168
+ end
169
+
170
+ context 'when allowed is false' do
171
+ context 'when users is nil' do
172
+ let(:old_format_action_permissions) { { 'allowed' => false, 'users' => nil } }
173
+ let(:expected_new_action_permissions_format) { { 'triggerEnabled' => false } }
174
+
175
+ it 'expected action permission triggerEnabled field should be false' do
176
+ expect(subject).to eq expected_new_action_permissions_format
177
+ end
178
+ end
179
+
180
+ context 'when users is an empty array' do
181
+ let(:old_format_action_permissions) { { 'allowed' => false, 'users' => [] } }
182
+ let(:expected_new_action_permissions_format) { { 'triggerEnabled' => false } }
183
+
184
+ it 'expected action permission triggerEnabled field should be false' do
185
+ expect(subject).to eq expected_new_action_permissions_format
186
+ end
187
+ end
188
+
189
+ context 'when users is NOT an empty array' do
190
+ let(:old_format_action_permissions) { { 'allowed' => false, 'users' => [2, 3] } }
191
+ let(:expected_new_action_permissions_format) { { 'triggerEnabled' => false } }
192
+
193
+ it 'expected action permission triggerEnabled field should be false' do
194
+ expect(subject).to eq expected_new_action_permissions_format
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ describe 'scope permissions' do
201
+ subject { converted_permission['renderings'][rendering_id]['collection_1']['scope'] }
202
+ let(:expected_new_format_permissions) { old_format_scope_permissions }
203
+
204
+ context 'when scope permissions are set' do
205
+ let(:old_format_scope_permissions) { { 'dynamicScopesValues' => {}, 'filter' => { 'aggregator' => 'and', 'conditions' => [{ 'field' => 'field_1', 'operator' => 'equal', 'value' => true }] } } }
206
+
207
+ it 'expected scope permissions should be set' do
208
+ expect(subject).to eq expected_new_format_permissions
209
+ end
210
+ end
211
+
212
+ context 'when scope permissions are nil' do
213
+ let(:old_format_scope_permissions) { nil }
214
+
215
+ it 'expected scope permissions should be nil' do
216
+ expect(subject).to eq expected_new_format_permissions
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,82 @@
1
+ module ForestLiana
2
+ describe PermissionsGetter do
3
+ describe '#get_permissions_api_route' do
4
+ it 'should respond with the v3 permissions route' do
5
+ expect(described_class.get_permissions_api_route).to eq '/liana/v3/permissions'
6
+ end
7
+ end
8
+
9
+ describe '#get_permissions_for_rendering' do
10
+ let(:rendering_id) { 34 }
11
+ let(:liana_permissions_url) { 'https://api.forestadmin.com/liana/v3/permissions' }
12
+ let(:liana_permissions_api_call_response) { instance_double(HTTParty::Response) }
13
+ let(:expected_request_parameters) {
14
+ {
15
+ :headers => {
16
+ "Content-Type" => "application/json",
17
+ "forest-secret-key" => "env_secret_test"
18
+ },
19
+ :query => expected_query_parameters
20
+ }
21
+ }
22
+
23
+ before do
24
+ allow(HTTParty).to receive(:get).and_return(liana_permissions_api_call_response)
25
+ allow(liana_permissions_api_call_response).to receive(:response).and_return(liana_permissions_api_call_response_content)
26
+ allow(liana_permissions_api_call_response_content).to receive(:body).and_return(liana_permissions_api_call_response_content_body)
27
+ end
28
+
29
+ describe 'when the API returns a success' do
30
+ let(:liana_permissions_api_call_response_content) { Net::HTTPOK.new({}, 200, liana_permissions_api_call_response_content_body) }
31
+ let(:liana_permissions_api_call_response_content_body) { '{"test": true}' }
32
+ let(:expected_parsed_result) { { "test" => true } }
33
+
34
+ describe 'when NOT calling for rendering specific only' do
35
+ let(:expected_query_parameters) { { "renderingId" => rendering_id } }
36
+
37
+ it 'should call the API with correct URL' do
38
+ described_class.get_permissions_for_rendering(rendering_id)
39
+ expect(HTTParty).to have_received(:get).with(liana_permissions_url, expected_request_parameters)
40
+ end
41
+
42
+ it 'should return the expected JSON body' do
43
+ expect(described_class.get_permissions_for_rendering(rendering_id)).to eq expected_parsed_result
44
+ end
45
+ end
46
+
47
+ describe 'when calling for rendering specific only' do
48
+ let(:expected_query_parameters) { { "renderingId" => rendering_id, 'renderingSpecificOnly' => true } }
49
+
50
+ it 'should call the API with correct URL and parameters' do
51
+ described_class.get_permissions_for_rendering(rendering_id, rendering_specific_only: true)
52
+ expect(HTTParty).to have_received(:get).with(liana_permissions_url, expected_request_parameters)
53
+ end
54
+
55
+ it 'should return the expected JSON body' do
56
+ expect(described_class.get_permissions_for_rendering(rendering_id, rendering_specific_only: true)).to eq expected_parsed_result
57
+ end
58
+ end
59
+ end
60
+
61
+ describe 'when the API returns a not found error' do
62
+ let(:liana_permissions_api_call_response_content) { Net::HTTPNotFound.new({}, 404, liana_permissions_api_call_response_content_body) }
63
+ let(:liana_permissions_api_call_response_content_body) { 'Not Found' }
64
+
65
+ before do
66
+ allow(FOREST_LOGGER).to receive(:error)
67
+ end
68
+
69
+ it 'should return nil' do
70
+ expect(described_class.get_permissions_for_rendering(rendering_id)).to eq nil
71
+ end
72
+
73
+ it 'should log the not found error' do
74
+ described_class.get_permissions_for_rendering(rendering_id)
75
+ expect(FOREST_LOGGER).to have_received(:error).with('Cannot retrieve the permissions from the Forest server.')
76
+ expect(FOREST_LOGGER).to have_received(:error).with('Which was caused by:')
77
+ expect(FOREST_LOGGER).to have_received(:error).with(' Forest API returned an HTTP error 404')
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -9,7 +9,7 @@ module ForestLiana
9
9
 
10
10
  expect(collection.fields.map { |field| field[:field] }).to eq(
11
11
  ["id", "name", "created_at", "updated_at", "trees"]
12
- );
12
+ )
13
13
  end
14
14
  end
15
15
  end
@@ -1,3 +1,6 @@
1
+ require 'simplecov'
2
+ SimpleCov.start 'rails'
3
+
1
4
  # This file was generated by the `rails generate rspec:install` command. Conventionally, all
2
5
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
6
  # The generated `.rspec` file contains `--require spec_helper` which will cause
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_liana
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.3
4
+ version: 5.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sandro Munda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-02 00:00:00.000000000 Z
11
+ date: 2020-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -211,8 +211,10 @@ files:
211
211
  - app/helpers/forest_liana/adapter_helper.rb
212
212
  - app/helpers/forest_liana/application_helper.rb
213
213
  - app/helpers/forest_liana/decoration_helper.rb
214
+ - app/helpers/forest_liana/is_same_data_structure_helper.rb
214
215
  - app/helpers/forest_liana/query_helper.rb
215
216
  - app/helpers/forest_liana/schema_helper.rb
217
+ - app/helpers/forest_liana/widgets_helper.rb
216
218
  - app/models/forest_liana/model/action.rb
217
219
  - app/models/forest_liana/model/collection.rb
218
220
  - app/models/forest_liana/model/segment.rb
@@ -253,6 +255,7 @@ files:
253
255
  - app/services/forest_liana/objective_stat_getter.rb
254
256
  - app/services/forest_liana/operator_date_interval_parser.rb
255
257
  - app/services/forest_liana/permissions_checker.rb
258
+ - app/services/forest_liana/permissions_formatter.rb
256
259
  - app/services/forest_liana/permissions_getter.rb
257
260
  - app/services/forest_liana/pie_stat_getter.rb
258
261
  - app/services/forest_liana/query_stat_getter.rb
@@ -277,6 +280,7 @@ files:
277
280
  - app/services/forest_liana/stripe_subscriptions_getter.rb
278
281
  - app/services/forest_liana/two_factor_registration_confirmer.rb
279
282
  - app/services/forest_liana/user_secret_creator.rb
283
+ - app/services/forest_liana/utils/beta_schema_utils.rb
280
284
  - app/services/forest_liana/value_stat_getter.rb
281
285
  - app/views/layouts/forest_liana/application.html.erb
282
286
  - config/initializers/arel-helpers.rb
@@ -336,13 +340,19 @@ files:
336
340
  - spec/dummy/db/migrate/20190716130830_add_age_to_tree.rb
337
341
  - spec/dummy/db/migrate/20190716135241_add_type_to_user.rb
338
342
  - spec/dummy/db/schema.rb
343
+ - spec/helpers/forest_liana/is_same_data_structure_helper_spec.rb
339
344
  - spec/helpers/forest_liana/query_helper_spec.rb
340
345
  - spec/helpers/forest_liana/schema_helper_spec.rb
341
346
  - spec/rails_helper.rb
347
+ - spec/requests/actions_controller_spec.rb
342
348
  - spec/requests/resources_spec.rb
343
349
  - spec/services/forest_liana/apimap_sorter_spec.rb
344
350
  - spec/services/forest_liana/filters_parser_spec.rb
345
351
  - spec/services/forest_liana/ip_whitelist_checker_spec.rb
352
+ - spec/services/forest_liana/permissions_checker_acl_disabled_spec.rb
353
+ - spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb
354
+ - spec/services/forest_liana/permissions_formatter_spec.rb
355
+ - spec/services/forest_liana/permissions_getter_spec.rb
346
356
  - spec/services/forest_liana/schema_adapter_spec.rb
347
357
  - spec/spec_helper.rb
348
358
  - test/dummy/README.rdoc
@@ -551,11 +561,16 @@ test_files:
551
561
  - test/dummy/config/database.yml
552
562
  - test/forest_liana_test.rb
553
563
  - test/routing/route_test.rb
564
+ - spec/services/forest_liana/permissions_formatter_spec.rb
565
+ - spec/services/forest_liana/permissions_checker_acl_disabled_spec.rb
554
566
  - spec/services/forest_liana/ip_whitelist_checker_spec.rb
567
+ - spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb
555
568
  - spec/services/forest_liana/schema_adapter_spec.rb
556
569
  - spec/services/forest_liana/apimap_sorter_spec.rb
557
570
  - spec/services/forest_liana/filters_parser_spec.rb
571
+ - spec/services/forest_liana/permissions_getter_spec.rb
558
572
  - spec/spec_helper.rb
573
+ - spec/requests/actions_controller_spec.rb
559
574
  - spec/requests/resources_spec.rb
560
575
  - spec/dummy/README.rdoc
561
576
  - spec/dummy/app/views/layouts/application.html.erb
@@ -598,5 +613,6 @@ test_files:
598
613
  - spec/dummy/config/initializers/backtrace_silencers.rb
599
614
  - spec/dummy/config/database.yml
600
615
  - spec/helpers/forest_liana/schema_helper_spec.rb
616
+ - spec/helpers/forest_liana/is_same_data_structure_helper_spec.rb
601
617
  - spec/helpers/forest_liana/query_helper_spec.rb
602
618
  - spec/rails_helper.rb