iknow_view_models 3.2.0 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +13 -0
- data/Appraisals +6 -6
- data/Rakefile +5 -5
- data/gemfiles/rails_5_2.gemfile +5 -5
- data/gemfiles/rails_6_0.gemfile +5 -5
- data/iknow_view_models.gemspec +40 -39
- data/lib/iknow_view_models.rb +9 -7
- data/lib/iknow_view_models/version.rb +1 -1
- data/lib/view_model.rb +17 -14
- data/lib/view_model/access_control.rb +5 -2
- data/lib/view_model/access_control/composed.rb +10 -9
- data/lib/view_model/access_control/open.rb +2 -0
- data/lib/view_model/access_control/read_only.rb +2 -0
- data/lib/view_model/access_control/tree.rb +11 -6
- data/lib/view_model/access_control_error.rb +4 -1
- data/lib/view_model/active_record.rb +12 -11
- data/lib/view_model/active_record/association_data.rb +2 -1
- data/lib/view_model/active_record/association_manipulation.rb +6 -4
- data/lib/view_model/active_record/cache.rb +4 -2
- data/lib/view_model/active_record/collection_nested_controller.rb +3 -3
- data/lib/view_model/active_record/controller_base.rb +4 -1
- data/lib/view_model/active_record/nested_controller_base.rb +1 -0
- data/lib/view_model/active_record/update_context.rb +8 -6
- data/lib/view_model/active_record/update_data.rb +32 -30
- data/lib/view_model/active_record/update_operation.rb +17 -13
- data/lib/view_model/active_record/visitor.rb +0 -1
- data/lib/view_model/after_transaction_runner.rb +0 -1
- data/lib/view_model/callbacks.rb +3 -1
- data/lib/view_model/controller.rb +13 -3
- data/lib/view_model/deserialization_error.rb +15 -12
- data/lib/view_model/error.rb +12 -10
- data/lib/view_model/error_view.rb +3 -1
- data/lib/view_model/migration/no_path_error.rb +1 -0
- data/lib/view_model/migration/one_way_error.rb +1 -0
- data/lib/view_model/migration/unspecified_version_error.rb +1 -0
- data/lib/view_model/record.rb +11 -13
- data/lib/view_model/reference.rb +3 -1
- data/lib/view_model/references.rb +8 -5
- data/lib/view_model/registry.rb +1 -1
- data/lib/view_model/schemas.rb +9 -4
- data/lib/view_model/serialization_error.rb +4 -1
- data/lib/view_model/serialize_context.rb +4 -4
- data/lib/view_model/test_helpers.rb +8 -3
- data/lib/view_model/test_helpers/arvm_builder.rb +19 -14
- data/lib/view_model/traversal_context.rb +2 -1
- data/test/.rubocop.yml +14 -0
- data/test/helpers/arvm_test_models.rb +12 -9
- data/test/helpers/arvm_test_utilities.rb +5 -3
- data/test/helpers/controller_test_helpers.rb +31 -29
- data/test/helpers/match_enumerator.rb +1 -0
- data/test/helpers/query_logging.rb +2 -1
- data/test/helpers/test_access_control.rb +5 -3
- data/test/helpers/viewmodel_spec_helpers.rb +21 -20
- data/test/unit/view_model/access_control_test.rb +144 -144
- data/test/unit/view_model/active_record/alias_test.rb +15 -13
- data/test/unit/view_model/active_record/belongs_to_test.rb +40 -39
- data/test/unit/view_model/active_record/cache_test.rb +27 -26
- data/test/unit/view_model/active_record/cloner_test.rb +67 -63
- data/test/unit/view_model/active_record/controller_test.rb +37 -38
- data/test/unit/view_model/active_record/counter_test.rb +10 -9
- data/test/unit/view_model/active_record/customization_test.rb +59 -58
- data/test/unit/view_model/active_record/has_many_test.rb +112 -111
- data/test/unit/view_model/active_record/has_many_through_poly_test.rb +15 -14
- data/test/unit/view_model/active_record/has_many_through_test.rb +33 -38
- data/test/unit/view_model/active_record/has_one_test.rb +37 -36
- data/test/unit/view_model/active_record/migration_test.rb +13 -13
- data/test/unit/view_model/active_record/namespacing_test.rb +19 -17
- data/test/unit/view_model/active_record/poly_test.rb +44 -45
- data/test/unit/view_model/active_record/shared_test.rb +30 -28
- data/test/unit/view_model/active_record/version_test.rb +9 -7
- data/test/unit/view_model/active_record_test.rb +72 -72
- data/test/unit/view_model/callbacks_test.rb +19 -15
- data/test/unit/view_model/controller_test.rb +4 -2
- data/test/unit/view_model/record_test.rb +92 -97
- data/test/unit/view_model/traversal_context_test.rb +4 -5
- data/test/unit/view_model_test.rb +18 -16
- metadata +7 -5
@@ -1,14 +1,14 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'minitest/autorun'
|
4
4
|
require 'minitest/unit'
|
5
5
|
require 'minitest/hooks'
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require 'view_model'
|
8
|
+
require 'view_model/active_record'
|
9
9
|
|
10
|
-
require_relative
|
11
|
-
require_relative
|
10
|
+
require_relative '../../../helpers/controller_test_helpers'
|
11
|
+
require_relative '../../../helpers/callback_tracer'
|
12
12
|
|
13
13
|
class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
14
14
|
include ARVMTestUtilities
|
@@ -88,7 +88,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
88
88
|
super
|
89
89
|
@parent = Parent.create(name: 'p',
|
90
90
|
children: [Child.new(name: 'c1', position: 1.0),
|
91
|
-
Child.new(name: 'c2', position: 2.0)],
|
91
|
+
Child.new(name: 'c2', position: 2.0),],
|
92
92
|
label: Label.new,
|
93
93
|
target: Target.new)
|
94
94
|
|
@@ -128,7 +128,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def test_index
|
131
|
-
p2 = Parent.create(name:
|
131
|
+
p2 = Parent.create(name: 'p2')
|
132
132
|
p2_view = ParentView.new(p2)
|
133
133
|
|
134
134
|
parentcontroller = ParentController.new
|
@@ -137,7 +137,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
137
137
|
assert_equal(200, parentcontroller.status)
|
138
138
|
|
139
139
|
assert_equal(parentcontroller.hash_response,
|
140
|
-
{
|
140
|
+
{ 'data' => [@parent_view.to_hash, p2_view.to_hash] })
|
141
141
|
|
142
142
|
assert_all_hooks_nested_inside_parent_hook(parentcontroller.hook_trace)
|
143
143
|
end
|
@@ -149,7 +149,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
149
149
|
'label' => { '_type' => 'Label', 'text' => 'l' },
|
150
150
|
'target' => { '_type' => 'Target', 'text' => 't' },
|
151
151
|
'children' => [{ '_type' => 'Child', 'name' => 'c1' },
|
152
|
-
{ '_type' => 'Child', 'name' => 'c2' }]
|
152
|
+
{ '_type' => 'Child', 'name' => 'c2' },],
|
153
153
|
}
|
154
154
|
|
155
155
|
parentcontroller = ParentController.new(data: data)
|
@@ -240,10 +240,10 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
240
240
|
'status' => 404,
|
241
241
|
'detail' => "Couldn't find Parent(s) with id(s)=[9999]",
|
242
242
|
'title' => nil,
|
243
|
-
'code'
|
244
|
-
'meta' => { 'nodes' => [{ '_type' =>
|
243
|
+
'code' => 'DeserializationError.NotFound',
|
244
|
+
'meta' => { 'nodes' => [{ '_type' => 'Parent', 'id' => 9999 }] },
|
245
245
|
'exception' => nil,
|
246
|
-
'causes' => nil }},
|
246
|
+
'causes' => nil } },
|
247
247
|
parentcontroller.hash_response)
|
248
248
|
end
|
249
249
|
|
@@ -261,13 +261,13 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
261
261
|
'status' => 400,
|
262
262
|
'detail' => 'Validation failed: \'age\' must be less than 42',
|
263
263
|
'title' => nil,
|
264
|
-
'code'
|
265
|
-
'meta' => { 'nodes' => [{ '_type' =>
|
264
|
+
'code' => 'DeserializationError.Validation',
|
265
|
+
'meta' => { 'nodes' => [{ '_type' => 'Child', 'id' => nil }],
|
266
266
|
'attribute' => 'age',
|
267
267
|
'message' => 'must be less than 42',
|
268
|
-
'details' => { 'error' => 'less_than', 'value' => 42, 'count' => 42 }},
|
268
|
+
'details' => { 'error' => 'less_than', 'value' => 42, 'count' => 42 } },
|
269
269
|
'exception' => nil,
|
270
|
-
'causes' => nil }},
|
270
|
+
'causes' => nil } },
|
271
271
|
parentcontroller.hash_response)
|
272
272
|
end
|
273
273
|
|
@@ -279,9 +279,9 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
279
279
|
parentcontroller.invoke(:create)
|
280
280
|
|
281
281
|
assert_equal(400, parentcontroller.status)
|
282
|
-
assert_match(
|
283
|
-
parentcontroller.hash_response[
|
284
|
-
|
282
|
+
assert_match(/check constraint/i,
|
283
|
+
parentcontroller.hash_response['error']['detail'],
|
284
|
+
'Database error propagated')
|
285
285
|
end
|
286
286
|
|
287
287
|
def test_destroy_missing
|
@@ -294,8 +294,8 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
294
294
|
'status' => 404,
|
295
295
|
'detail' => "Couldn't find Parent(s) with id(s)=[9999]",
|
296
296
|
'title' => nil,
|
297
|
-
'code'
|
298
|
-
'meta' => {
|
297
|
+
'code' => 'DeserializationError.NotFound',
|
298
|
+
'meta' => { 'nodes' => [{ '_type' => 'Parent', 'id' => 9999 }] },
|
299
299
|
'exception' => nil,
|
300
300
|
'causes' => nil } },
|
301
301
|
parentcontroller.hash_response)
|
@@ -342,7 +342,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
342
342
|
|
343
343
|
@parent.reload
|
344
344
|
|
345
|
-
assert_equal(%w
|
345
|
+
assert_equal(%w[c1 c2 c3], @parent.children.order(:position).pluck(:name))
|
346
346
|
assert_equal({ 'data' => ChildView.new(@parent.children.last).to_hash },
|
347
347
|
childcontroller.hash_response)
|
348
348
|
|
@@ -351,7 +351,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
351
351
|
|
352
352
|
def test_nested_collection_append_many
|
353
353
|
data = [{ '_type' => 'Child', 'name' => 'c3' },
|
354
|
-
{ '_type' => 'Child', 'name' => 'c4' }]
|
354
|
+
{ '_type' => 'Child', 'name' => 'c4' },]
|
355
355
|
|
356
356
|
childcontroller = ChildController.new(parent_id: @parent.id, data: data)
|
357
357
|
childcontroller.invoke(:append)
|
@@ -360,8 +360,8 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
360
360
|
|
361
361
|
@parent.reload
|
362
362
|
|
363
|
-
assert_equal(%w
|
364
|
-
new_children_hashes = @parent.children.last(2).map{ |c| ChildView.new(c).to_hash }
|
363
|
+
assert_equal(%w[c1 c2 c3 c4], @parent.children.order(:position).pluck(:name))
|
364
|
+
new_children_hashes = @parent.children.last(2).map { |c| ChildView.new(c).to_hash }
|
365
365
|
assert_equal({ 'data' => new_children_hashes },
|
366
366
|
childcontroller.hash_response)
|
367
367
|
|
@@ -373,8 +373,8 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
373
373
|
# Parent.children
|
374
374
|
old_children = @parent.children
|
375
375
|
|
376
|
-
data = [{'_type' => 'Child', 'name' => 'newc1'},
|
377
|
-
{'_type' => 'Child', 'name' => 'newc2'}]
|
376
|
+
data = [{ '_type' => 'Child', 'name' => 'newc1' },
|
377
|
+
{ '_type' => 'Child', 'name' => 'newc2' },]
|
378
378
|
|
379
379
|
childcontroller = ChildController.new(parent_id: @parent.id, data: data)
|
380
380
|
childcontroller.invoke(:replace)
|
@@ -383,14 +383,14 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
383
383
|
|
384
384
|
@parent.reload
|
385
385
|
|
386
|
-
assert_equal(%w
|
386
|
+
assert_equal(%w[newc1 newc2], @parent.children.order(:position).pluck(:name))
|
387
387
|
assert_predicate(Child.where(id: old_children.map(&:id)), :empty?)
|
388
388
|
|
389
389
|
assert_all_hooks_nested_inside_parent_hook(childcontroller.hook_trace)
|
390
390
|
end
|
391
391
|
|
392
392
|
def test_nested_collection_replace_bad_data
|
393
|
-
data = [{
|
393
|
+
data = [{ 'name' => 'nc' }]
|
394
394
|
childcontroller = ChildController.new(parent_id: @parent.id, data: data)
|
395
395
|
|
396
396
|
childcontroller.invoke(:replace)
|
@@ -409,7 +409,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
409
409
|
|
410
410
|
@parent.reload
|
411
411
|
|
412
|
-
assert_equal(%w
|
412
|
+
assert_equal(%w[c2], @parent.children.order(:position).pluck(:name))
|
413
413
|
assert_predicate(Child.where(id: old_child.id), :empty?)
|
414
414
|
|
415
415
|
assert_all_hooks_nested_inside_parent_hook(childcontroller.hook_trace)
|
@@ -441,7 +441,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
441
441
|
|
442
442
|
@parent.reload
|
443
443
|
|
444
|
-
assert_equal(%w
|
444
|
+
assert_equal(%w[c2], @parent.children.order(:position).pluck(:name))
|
445
445
|
assert_predicate(Child.where(id: old_child.id), :empty?)
|
446
446
|
end
|
447
447
|
|
@@ -464,7 +464,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
464
464
|
childcontroller.hash_response)
|
465
465
|
end
|
466
466
|
|
467
|
-
|
467
|
+
def test_nested_collection_show
|
468
468
|
old_child = @parent.children.first
|
469
469
|
|
470
470
|
childcontroller = ChildController.new(id: old_child.id)
|
@@ -474,15 +474,14 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
474
474
|
childcontroller.hash_response)
|
475
475
|
|
476
476
|
assert_equal(200, childcontroller.status)
|
477
|
-
|
478
|
-
|
477
|
+
end
|
479
478
|
|
480
479
|
## Single association
|
481
480
|
|
482
481
|
def test_nested_singular_replace_from_parent
|
483
482
|
old_label = @parent.label
|
484
483
|
|
485
|
-
data = {'_type' => 'Label', 'text' => 'new label'}
|
484
|
+
data = { '_type' => 'Label', 'text' => 'new label' }
|
486
485
|
labelcontroller = LabelController.new(parent_id: @parent.id, data: data)
|
487
486
|
labelcontroller.invoke(:create_associated)
|
488
487
|
|
@@ -536,7 +535,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
536
535
|
def test_nested_singular_update_from_parent
|
537
536
|
old_label = @parent.label
|
538
537
|
|
539
|
-
data = {'_type' => 'Label', 'id' => old_label.id, 'text' => 'new label'}
|
538
|
+
data = { '_type' => 'Label', 'id' => old_label.id, 'text' => 'new label' }
|
540
539
|
labelcontroller = LabelController.new(parent_id: @parent.id, data: data)
|
541
540
|
labelcontroller.invoke(:create_associated)
|
542
541
|
|
@@ -583,7 +582,7 @@ class ViewModel::ActiveRecord::ControllerTest < ActiveSupport::TestCase
|
|
583
582
|
def test_nested_singular_update
|
584
583
|
old_label = @parent.label
|
585
584
|
|
586
|
-
data = {'_type' => 'Label', 'id' => old_label.id, 'text' => 'new label'}
|
585
|
+
data = { '_type' => 'Label', 'id' => old_label.id, 'text' => 'new label' }
|
587
586
|
labelcontroller = LabelController.new(data: data)
|
588
587
|
labelcontroller.invoke(:create)
|
589
588
|
|
@@ -1,9 +1,11 @@
|
|
1
|
-
|
2
|
-
require_relative "../../../helpers/arvm_test_models.rb"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
require_relative '../../../helpers/arvm_test_utilities'
|
4
|
+
require_relative '../../../helpers/arvm_test_models'
|
5
5
|
|
6
|
-
require
|
6
|
+
require 'minitest/autorun'
|
7
|
+
|
8
|
+
require 'view_model/active_record'
|
7
9
|
|
8
10
|
class ViewModel::ActiveRecord::CounterTest < ActiveSupport::TestCase
|
9
11
|
include ARVMTestUtilities
|
@@ -40,7 +42,6 @@ class ViewModel::ActiveRecord::CounterTest < ActiveSupport::TestCase
|
|
40
42
|
attribute :name
|
41
43
|
end
|
42
44
|
end
|
43
|
-
|
44
45
|
end
|
45
46
|
|
46
47
|
def setup
|
@@ -50,15 +51,15 @@ class ViewModel::ActiveRecord::CounterTest < ActiveSupport::TestCase
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def test_counter_cache_create
|
53
|
-
alter_by_view!(CategoryView, @category1) do |view,
|
54
|
-
view['products'] << {'_type' => 'Product'}
|
54
|
+
alter_by_view!(CategoryView, @category1) do |view, _refs|
|
55
|
+
view['products'] << { '_type' => 'Product' }
|
55
56
|
end
|
56
57
|
assert_equal(2, @category1.products_count)
|
57
58
|
end
|
58
59
|
|
59
60
|
def test_counter_cache_move
|
60
61
|
@category2 = Category.create(name: 'c2')
|
61
|
-
alter_by_view!(CategoryView, [@category1, @category2]) do |(c1view, c2view),
|
62
|
+
alter_by_view!(CategoryView, [@category1, @category2]) do |(c1view, c2view), _refs|
|
62
63
|
c2view['products'] = c1view['products']
|
63
64
|
c1view['products'] = []
|
64
65
|
end
|
@@ -67,7 +68,7 @@ class ViewModel::ActiveRecord::CounterTest < ActiveSupport::TestCase
|
|
67
68
|
end
|
68
69
|
|
69
70
|
def test_counter_cache_delete
|
70
|
-
alter_by_view!(CategoryView, @category1) do |view,
|
71
|
+
alter_by_view!(CategoryView, @category1) do |view, _refs|
|
71
72
|
view['products'] = []
|
72
73
|
end
|
73
74
|
assert_equal(0, @category1.products_count)
|
@@ -1,11 +1,11 @@
|
|
1
|
-
#
|
2
|
-
require_relative "../../../helpers/arvm_test_utilities.rb"
|
3
|
-
require_relative "../../../helpers/arvm_test_models.rb"
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
3
|
+
require_relative '../../../helpers/arvm_test_utilities'
|
4
|
+
require_relative '../../../helpers/arvm_test_models'
|
6
5
|
|
7
|
-
require
|
6
|
+
require 'minitest/autorun'
|
8
7
|
|
8
|
+
require 'view_model/active_record'
|
9
9
|
|
10
10
|
require 'renum'
|
11
11
|
|
@@ -28,15 +28,16 @@ class ViewModel::ActiveRecord::SpecializeAssociationTest < ActiveSupport::TestCa
|
|
28
28
|
attributes :text
|
29
29
|
association :translations
|
30
30
|
|
31
|
-
def self.pre_parse_translations(
|
32
|
-
raise
|
33
|
-
|
31
|
+
def self.pre_parse_translations(_viewmodel_reference, _metadata, hash, translations)
|
32
|
+
raise 'type check' unless translations.is_a?(Hash) && translations.all? { |k, v| k.is_a?(String) && v.is_a?(String) }
|
33
|
+
|
34
|
+
hash['translations'] = translations.map { |lang, text| { '_type' => 'Translation', 'language' => lang, 'translation' => text } }
|
34
35
|
end
|
35
36
|
|
36
37
|
def resolve_translations(update_datas, previous_translation_views)
|
37
38
|
existing = previous_translation_views.index_by { |x| [x.model.language, x.model.translation] }
|
38
39
|
update_datas.map do |update_data|
|
39
|
-
existing.fetch([update_data[
|
40
|
+
existing.fetch([update_data['language'], update_data['translation']]) { TranslationView.for_new_model }
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
@@ -71,19 +72,19 @@ class ViewModel::ActiveRecord::SpecializeAssociationTest < ActiveSupport::TestCa
|
|
71
72
|
def setup
|
72
73
|
super
|
73
74
|
|
74
|
-
@text1 = Text.create(text:
|
75
|
-
translations: [Translation.new(language:
|
76
|
-
Translation.new(language:
|
75
|
+
@text1 = Text.create(text: 'dog',
|
76
|
+
translations: [Translation.new(language: 'ja', translation: '犬'),
|
77
|
+
Translation.new(language: 'fr', translation: 'chien'),])
|
77
78
|
|
78
79
|
@text1_view = {
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
}
|
80
|
+
'id' => @text1.id,
|
81
|
+
'_type' => 'Text',
|
82
|
+
'_version' => 1,
|
83
|
+
'text' => 'dog',
|
84
|
+
'translations' => {
|
85
|
+
'ja' => '犬',
|
86
|
+
'fr' => 'chien',
|
87
|
+
},
|
87
88
|
}
|
88
89
|
|
89
90
|
enable_logging!
|
@@ -94,7 +95,7 @@ class ViewModel::ActiveRecord::SpecializeAssociationTest < ActiveSupport::TestCa
|
|
94
95
|
end
|
95
96
|
|
96
97
|
def test_create
|
97
|
-
create_view = @text1_view.dup.tap {|v| v.delete('id')}
|
98
|
+
create_view = @text1_view.dup.tap { |v| v.delete('id') }
|
98
99
|
new_text_view = TextView.deserialize_from_view(create_view)
|
99
100
|
new_text_model = new_text_view.model
|
100
101
|
|
@@ -103,8 +104,8 @@ class ViewModel::ActiveRecord::SpecializeAssociationTest < ActiveSupport::TestCa
|
|
103
104
|
new_translations = new_text_model.translations.map do |x|
|
104
105
|
[x['language'], x['translation']]
|
105
106
|
end
|
106
|
-
assert_equal([%w
|
107
|
-
%w
|
107
|
+
assert_equal([%w[fr chien],
|
108
|
+
%w[ja 犬],],
|
108
109
|
new_translations.sort)
|
109
110
|
end
|
110
111
|
|
@@ -163,10 +164,11 @@ class ViewModel::ActiveRecord::FlattenAssociationTest < ActiveSupport::TestCase
|
|
163
164
|
def construct_hash(members)
|
164
165
|
case self
|
165
166
|
when SectionType::Simple
|
166
|
-
raise
|
167
|
+
raise 'nopes' if members.present?
|
168
|
+
|
167
169
|
nil
|
168
170
|
else
|
169
|
-
members.merge(
|
171
|
+
members.merge('_type' => viewmodel.view_name)
|
170
172
|
end
|
171
173
|
end
|
172
174
|
|
@@ -219,7 +221,7 @@ class ViewModel::ActiveRecord::FlattenAssociationTest < ActiveSupport::TestCase
|
|
219
221
|
section_type = SectionType.with_name(section_type_name)
|
220
222
|
raise "Invalid section type: #{section_type_name.inspect}" unless section_type
|
221
223
|
|
222
|
-
user_data[
|
224
|
+
user_data['section_data'] = section_type.construct_hash(user_data.slice!(*self._members.keys))
|
223
225
|
end
|
224
226
|
|
225
227
|
def resolve_section_data(update_data, previous_translation_view)
|
@@ -242,39 +244,38 @@ class ViewModel::ActiveRecord::FlattenAssociationTest < ActiveSupport::TestCase
|
|
242
244
|
end
|
243
245
|
end
|
244
246
|
end
|
245
|
-
|
246
247
|
end
|
247
248
|
|
248
249
|
def setup
|
249
250
|
super
|
250
251
|
|
251
|
-
@simplesection = Section.create(name:
|
252
|
+
@simplesection = Section.create(name: 'simple1')
|
252
253
|
@simplesection_view = {
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
254
|
+
'id' => @simplesection.id,
|
255
|
+
'_type' => 'Section',
|
256
|
+
'_version' => 1,
|
257
|
+
'section_type' => 'Simple',
|
258
|
+
'name' => 'simple1',
|
258
259
|
}
|
259
260
|
|
260
|
-
@quizsection = Section.create(name:
|
261
|
+
@quizsection = Section.create(name: 'quiz1', section_data: QuizSection.new(quiz_name: 'qq'))
|
261
262
|
@quizsection_view = {
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
263
|
+
'id' => @quizsection.id,
|
264
|
+
'_type' => 'Section',
|
265
|
+
'_version' => 1,
|
266
|
+
'section_type' => 'Quiz',
|
267
|
+
'name' => 'quiz1',
|
268
|
+
'quiz_name' => 'qq',
|
268
269
|
}
|
269
270
|
|
270
|
-
@vocabsection = Section.create(name:
|
271
|
+
@vocabsection = Section.create(name: 'vocab1', section_data: VocabSection.new(vocab_word: 'dog'))
|
271
272
|
@vocabsection_view = {
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
273
|
+
'id' => @vocabsection.id,
|
274
|
+
'_type' => 'Section',
|
275
|
+
'_version' => 1,
|
276
|
+
'section_type' => 'Vocab',
|
277
|
+
'name' => 'vocab1',
|
278
|
+
'vocab_word' => 'dog',
|
278
279
|
}
|
279
280
|
|
280
281
|
enable_logging!
|
@@ -296,7 +297,7 @@ class ViewModel::ActiveRecord::FlattenAssociationTest < ActiveSupport::TestCase
|
|
296
297
|
end
|
297
298
|
|
298
299
|
def test_create
|
299
|
-
assert_section = ->(model, name, &check_section){
|
300
|
+
assert_section = ->(model, name, &check_section) {
|
300
301
|
assert(!model.changed?)
|
301
302
|
assert(!model.new_record?)
|
302
303
|
assert_equal(name, model.name)
|
@@ -313,18 +314,18 @@ class ViewModel::ActiveRecord::FlattenAssociationTest < ActiveSupport::TestCase
|
|
313
314
|
}
|
314
315
|
|
315
316
|
v = SectionView.deserialize_from_view(new_view_like(@simplesection_view))
|
316
|
-
assert_section.call(v.model,
|
317
|
+
assert_section.call(v.model, 'simple1')
|
317
318
|
|
318
319
|
v = SectionView.deserialize_from_view(new_view_like(@quizsection_view))
|
319
|
-
assert_section.call(v.model,
|
320
|
+
assert_section.call(v.model, 'quiz1') do |m|
|
320
321
|
assert(m.is_a?(QuizSection))
|
321
|
-
assert_equal(
|
322
|
+
assert_equal('qq', m.quiz_name)
|
322
323
|
end
|
323
324
|
|
324
325
|
v = SectionView.deserialize_from_view(new_view_like(@vocabsection_view))
|
325
|
-
assert_section.call(v.model,
|
326
|
+
assert_section.call(v.model, 'vocab1') do |m|
|
326
327
|
assert(m.is_a?(VocabSection))
|
327
|
-
assert_equal(
|
328
|
+
assert_equal('dog', m.vocab_word)
|
328
329
|
end
|
329
330
|
end
|
330
331
|
|
@@ -363,15 +364,15 @@ class ViewModel::ActiveRecord::FlattenAssociationTest < ActiveSupport::TestCase
|
|
363
364
|
def setup
|
364
365
|
super
|
365
366
|
sections = [
|
366
|
-
Section.new(name:
|
367
|
-
Section.new(name:
|
368
|
-
Section.new(name:
|
367
|
+
Section.new(name: 'simple1'),
|
368
|
+
Section.new(name: 'quiz1', section_data: QuizSection.new(quiz_name: 'qq')),
|
369
|
+
Section.new(name: 'vocab1', section_data: VocabSection.new(vocab_word: 'dog')),
|
369
370
|
]
|
370
371
|
@exercise1 = Exercise.create(sections: sections)
|
371
372
|
end
|
372
373
|
|
373
374
|
def test_functional_update
|
374
|
-
alter_by_view!(ExerciseView, @exercise1) do |view,
|
375
|
+
alter_by_view!(ExerciseView, @exercise1) do |view, _refs|
|
375
376
|
view['sections'] = {
|
376
377
|
'_type' => '_update',
|
377
378
|
'actions' => [{ '_type' => 'append',
|
@@ -380,7 +381,7 @@ class ViewModel::ActiveRecord::FlattenAssociationTest < ActiveSupport::TestCase
|
|
380
381
|
'name' => 'vocab_new',
|
381
382
|
'vocab_word' => 'cat',
|
382
383
|
}],
|
383
|
-
}]
|
384
|
+
}],
|
384
385
|
}
|
385
386
|
end
|
386
387
|
end
|