forest_liana 5.2.3 → 5.4.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.
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