jat 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jat/attribute.rb +36 -4
  3. data/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads.rb +7 -3
  4. data/lib/jat/plugins/_activerecord_preloads/lib/preloader.rb +7 -13
  5. data/lib/jat/plugins/_lower_camel_case/_lower_camel_case.rb +32 -0
  6. data/lib/jat/plugins/_preloads/_preloads.rb +8 -2
  7. data/lib/jat/plugins/cache/cache.rb +9 -5
  8. data/lib/jat/plugins/json_api/json_api.rb +145 -105
  9. data/lib/jat/plugins/json_api/lib/fields_param_parser.rb +40 -0
  10. data/lib/jat/plugins/json_api/lib/include_param_parser.rb +84 -0
  11. data/lib/jat/plugins/json_api/lib/map.rb +92 -27
  12. data/lib/jat/plugins/json_api/lib/params/fields/validate.rb +8 -5
  13. data/lib/jat/plugins/json_api/lib/response.rb +84 -196
  14. data/lib/jat/plugins/json_api/lib/response_piece.rb +166 -0
  15. data/lib/jat/plugins/json_api_activerecord/json_api_activerecord.rb +31 -0
  16. data/lib/jat/plugins/{_json_api_activerecord → json_api_activerecord}/lib/preloads.rb +16 -24
  17. data/lib/jat/plugins/json_api_lower_camel_case/json_api_lower_camel_case.rb +30 -0
  18. data/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache.rb +54 -0
  19. data/lib/jat/plugins/json_api_validate_params/json_api_validate_params.rb +57 -0
  20. data/lib/jat/plugins/json_api_validate_params/lib/params_error.rb +6 -0
  21. data/lib/jat/plugins/json_api_validate_params/lib/validate_fields_param.rb +59 -0
  22. data/lib/jat/plugins/json_api_validate_params/lib/validate_include_param.rb +33 -0
  23. data/lib/jat/plugins/simple_api/lib/fields_param_parser.rb +97 -0
  24. data/lib/jat/plugins/simple_api/lib/map.rb +80 -10
  25. data/lib/jat/plugins/simple_api/lib/response.rb +78 -89
  26. data/lib/jat/plugins/simple_api/lib/response_piece.rb +84 -0
  27. data/lib/jat/plugins/simple_api/simple_api.rb +83 -24
  28. data/lib/jat/plugins/simple_api_activerecord/lib/preloads.rb +55 -0
  29. data/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord.rb +31 -0
  30. data/lib/jat/plugins/simple_api_lower_camel_case/simple_api_lower_camel_case.rb +30 -0
  31. data/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache.rb +48 -0
  32. data/lib/jat/plugins/simple_api_validate_params/lib/fields_error.rb +6 -0
  33. data/lib/jat/plugins/simple_api_validate_params/lib/validate_fields_param.rb +45 -0
  34. data/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params.rb +45 -0
  35. data/lib/jat/plugins/to_str/to_str.rb +10 -4
  36. data/lib/jat/plugins.rb +3 -16
  37. data/lib/jat.rb +28 -30
  38. data/test/lib/jat/attribute_test.rb +15 -5
  39. data/test/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads_test.rb +34 -15
  40. data/test/lib/jat/plugins/_activerecord_preloads/lib/preloader_test.rb +10 -24
  41. data/test/lib/jat/plugins/_camel_lower/_camel_lower_test.rb +26 -0
  42. data/test/lib/jat/plugins/_preloads/lib/format_user_preloads_test.rb +1 -1
  43. data/test/lib/jat/plugins/_preloads/lib/preloads_with_path_test.rb +1 -1
  44. data/test/lib/jat/plugins/cache/cache_test.rb +11 -11
  45. data/test/lib/jat/plugins/json_api/json_api_test.rb +63 -47
  46. data/test/lib/jat/plugins/json_api/lib/{params/fields_test.rb → fields_param_parser_test.rb} +7 -6
  47. data/test/lib/jat/plugins/json_api/lib/{params/include_test.rb → include_param_parser_test.rb} +4 -4
  48. data/test/lib/jat/plugins/json_api/lib/map_test.rb +150 -79
  49. data/test/lib/jat/plugins/json_api/lib/response_test.rb +32 -32
  50. data/test/lib/jat/plugins/{_json_api_activerecord/_json_api_activerecord_test.rb → json_api_activerecord/json_api_activerecord_test.rb} +14 -5
  51. data/test/lib/jat/plugins/{_json_api_activerecord → json_api_activerecord}/lib/preloads_test.rb +11 -10
  52. data/test/lib/jat/plugins/json_api_camel_lower/json_api_camel_lower_test.rb +79 -0
  53. data/test/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache_test.rb +107 -0
  54. data/test/lib/jat/plugins/json_api_validate_params/json_api_validate_params_test.rb +84 -0
  55. data/test/lib/jat/plugins/simple_api/lib/{params/parse_test.rb → fields_param_parser_test.rb} +10 -4
  56. data/test/lib/jat/plugins/simple_api/lib/map_test.rb +111 -34
  57. data/test/lib/jat/plugins/simple_api/lib/response_test.rb +80 -74
  58. data/test/lib/jat/plugins/simple_api/simple_api_test.rb +91 -25
  59. data/test/lib/jat/plugins/simple_api_activerecord/lib/preloads_test.rb +135 -0
  60. data/test/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord_test.rb +38 -0
  61. data/test/lib/jat/plugins/simple_api_camel_lower/simple_api_camel_lower_test.rb +48 -0
  62. data/test/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache_test.rb +95 -0
  63. data/test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb +89 -0
  64. data/test/lib/jat/plugins/to_str/to_str_test.rb +3 -3
  65. data/test/lib/jat_test.rb +47 -24
  66. data/test/lib/plugin_test.rb +3 -3
  67. data/test/test_helper.rb +0 -3
  68. data/test/test_plugin.rb +9 -12
  69. metadata +60 -71
  70. data/CHANGELOG.md +0 -7
  71. data/README.md +0 -21
  72. data/jat.gemspec +0 -37
  73. data/lib/jat/plugins/_json_api_activerecord/_json_api_activerecord.rb +0 -22
  74. data/lib/jat/plugins/camel_lower/camel_lower.rb +0 -18
  75. data/lib/jat/plugins/json_api/lib/construct_traversal_map.rb +0 -91
  76. data/lib/jat/plugins/json_api/lib/presenters/document_links_presenter.rb +0 -48
  77. data/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter.rb +0 -48
  78. data/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter.rb +0 -48
  79. data/lib/jat/plugins/json_api/lib/presenters/links_presenter.rb +0 -48
  80. data/lib/jat/plugins/json_api/lib/presenters/meta_presenter.rb +0 -48
  81. data/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter.rb +0 -53
  82. data/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter.rb +0 -53
  83. data/lib/jat/plugins/json_api/lib/traversal_map.rb +0 -34
  84. data/lib/jat/plugins/simple_api/lib/construct_traversal_map.rb +0 -45
  85. data/lib/jat/plugins/simple_api/lib/params/parse.rb +0 -68
  86. data/lib/jat/presenter.rb +0 -51
  87. data/test/lib/jat/plugins/camel_lower/camel_lower_test.rb +0 -78
  88. data/test/lib/jat/plugins/json_api/lib/construct_traversal_map_test.rb +0 -119
  89. data/test/lib/jat/plugins/json_api/lib/params/fields/parse_test.rb +0 -24
  90. data/test/lib/jat/plugins/json_api/lib/params/fields/validate_test.rb +0 -47
  91. data/test/lib/jat/plugins/json_api/lib/params/include/parse_test.rb +0 -46
  92. data/test/lib/jat/plugins/json_api/lib/params/include/validate_test.rb +0 -51
  93. data/test/lib/jat/plugins/json_api/lib/presenters/document_links_presenter_test.rb +0 -69
  94. data/test/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter_test.rb +0 -69
  95. data/test/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter_test.rb +0 -69
  96. data/test/lib/jat/plugins/json_api/lib/presenters/links_presenter_test.rb +0 -69
  97. data/test/lib/jat/plugins/json_api/lib/presenters/meta_presenter_test.rb +0 -69
  98. data/test/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter_test.rb +0 -75
  99. data/test/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter_test.rb +0 -75
  100. data/test/lib/jat/plugins/json_api/lib/traversal_map_test.rb +0 -58
  101. data/test/lib/jat/plugins/simple_api/lib/construct_traversal_map_test.rb +0 -100
  102. data/test/lib/jat/presenter_test.rb +0 -61
@@ -7,77 +7,93 @@ describe "Jat::Plugins::JsonApi" do
7
7
  new_class = Class.new(Jat)
8
8
  new_class.plugin(plugin)
9
9
  new_class.type :jat
10
- new_class.attribute :id, key: :itself
10
+ new_class.id key: :itself
11
11
  new_class
12
12
  end
13
13
 
14
- let(:plugin) { Jat::Plugins.load_plugin(:json_api) }
14
+ let(:plugin) { Jat::Plugins.find_plugin(:json_api) }
15
+
16
+ describe ".before_load" do
17
+ it "checks some response plugin was already loaded" do
18
+ jat_class = Class.new(Jat)
19
+ jat_class.config[:response_plugin_loaded] = :simple_api
20
+ error = assert_raises(Jat::Error) { jat_class.plugin(:json_api) }
21
+ assert_equal "Response plugin `simple_api` was already loaded before", error.message
22
+ end
23
+ end
15
24
 
16
25
  describe ".after_load" do
17
- it "loads _json_api_activerecord plugin if activerecord option provided" do
26
+ it "loads json_api_activerecord plugin if activerecord option provided" do
18
27
  jat_class = Class.new(Jat)
19
- jat_class.expects(:plugin).with(:_json_api_activerecord, activerecord: true)
28
+ jat_class.expects(:plugin).with(:json_api_activerecord, activerecord: true)
20
29
 
21
- Jat::Plugins.after_load(plugin, jat_class, activerecord: true)
30
+ plugin.load(jat_class)
31
+ plugin.after_load(jat_class, activerecord: true)
22
32
  end
23
33
 
24
- it "registers Presenters constants" do
34
+ it "adds config variable with name of response plugin that was loaded" do
25
35
  jat_class = Class.new(Jat)
26
- Jat::Plugins.after_load(plugin, jat_class, activerecord: true)
27
-
28
- assert_equal jat_class::JsonapiPresenter.jat_class, jat_class
29
- assert_equal jat_class::LinksPresenter.jat_class, jat_class
30
- assert_equal jat_class::DocumentLinksPresenter.jat_class, jat_class
31
- assert_equal jat_class::RelationshipLinksPresenter.jat_class, jat_class
32
- assert_equal jat_class::MetaPresenter.jat_class, jat_class
33
- assert_equal jat_class::DocumentMetaPresenter.jat_class, jat_class
34
- assert_equal jat_class::RelationshipMetaPresenter.jat_class, jat_class
36
+ jat_class.plugin(:json_api)
37
+
38
+ assert_equal(:json_api, jat_class.config[:response_plugin_loaded])
35
39
  end
36
40
  end
37
41
 
38
42
  describe "InstanceMethods" do
39
43
  let(:jat) do
40
- jat_class.new("JAT", {})
44
+ jat_class.new
41
45
  end
42
46
 
43
47
  describe "#to_h" do
44
48
  it "returns response in json-api format" do
45
49
  expected_result = {data: {type: :jat, id: "JAT"}}
46
- assert_equal expected_result, jat.to_h
50
+ assert_equal expected_result, jat.to_h("JAT")
51
+ end
52
+ end
53
+
54
+ describe "#map" do
55
+ it "returns map for provided context" do
56
+ jat_class::Map.expects(:call).with("CONTEXT").returns "MAP"
57
+ assert_equal "MAP", jat_class.map("CONTEXT")
58
+ end
59
+ end
60
+
61
+ describe "#map_full" do
62
+ it "returns memorized map with all fields exposed" do
63
+ jat_class::Map.expects(:call).with(exposed: :all).returns "MAP"
64
+ assert_equal "MAP", jat_class.map_full
65
+ assert_same jat_class.map_full, jat_class.map_full
47
66
  end
48
67
  end
49
68
 
50
- describe "#traversal_map" do
51
- it "returns memorized traversal_map object" do
52
- assert_equal jat.traversal_map.class, Jat::Plugins::JsonApi::TraversalMap
53
- assert_same jat.traversal_map, jat.traversal_map
69
+ describe "#map_exposed" do
70
+ it "returns memorized map with exposed by default fields" do
71
+ jat_class::Map.expects(:call).with(exposed: :default).returns "MAP"
72
+ assert_equal "MAP", jat_class.map_exposed
73
+ assert_same jat_class.map_exposed, jat_class.map_exposed
54
74
  end
55
75
  end
56
76
  end
57
77
 
58
78
  describe "ClassMethods" do
59
- describe ".relationship" do
60
- it "adds new attribute with required serializer" do
61
- jat_class.relationship(:foo, serializer: jat_class, exposed: true) { "block" }
62
-
63
- atribute = jat_class.attributes[:foo]
64
- assert_equal jat_class, atribute.serializer
65
- assert_equal true, atribute.exposed?
66
- assert_equal "block", jat_class::Presenter.new(nil, nil).foo
79
+ describe ".id" do
80
+ it "adds new `:id`" do
81
+ jat_class.id(key: :uuid)
82
+ assert_equal jat_class.get_id.params, {name: :id, opts: {key: :uuid}, block: nil}
67
83
  end
68
84
  end
69
85
 
70
86
  describe ".inherited" do
71
87
  it "inherits type" do
72
88
  child = Class.new(jat_class)
73
- assert_equal :jat, child.type
89
+ assert_equal :jat, child.get_type
74
90
  end
75
91
 
76
92
  it "inherits `jsonapi` data" do
77
93
  jat_class.jsonapi(:version) { "1.0" }
78
94
 
79
95
  child = Class.new(jat_class)
80
- assert_equal("1.0", child.jsonapi_data[:version].call)
96
+ assert_equal("1.0", child.jsonapi_data[:version].value(nil, nil))
81
97
  end
82
98
 
83
99
  it "inherits `object_links`, `relationship_links`, `document_links`" do
@@ -86,9 +102,9 @@ describe "Jat::Plugins::JsonApi" do
86
102
  jat_class.document_link(:last) { "/articles/3" }
87
103
  child = Class.new(jat_class)
88
104
 
89
- assert_equal("/articles/1", child.object_links[:self].call)
90
- assert_equal("/articles/2", child.relationship_links[:related].call)
91
- assert_equal("/articles/3", child.document_links[:last].call)
105
+ assert_equal("/articles/1", child.object_links[:self].value(nil, nil))
106
+ assert_equal("/articles/2", child.relationship_links[:related].value(nil, nil))
107
+ assert_equal("/articles/3", child.document_links[:last].value(nil, nil))
92
108
  end
93
109
 
94
110
  it "does not change parents links when children links are changed" do
@@ -101,9 +117,9 @@ describe "Jat::Plugins::JsonApi" do
101
117
  child.relationship_links.delete(:related)
102
118
  child.document_links.delete(:last)
103
119
 
104
- assert_equal("/articles/1", jat_class.object_links[:self].call)
105
- assert_equal("/articles/2", jat_class.relationship_links[:related].call)
106
- assert_equal("/articles/3", jat_class.document_links[:last].call)
120
+ assert_equal("/articles/1", jat_class.object_links[:self].value(nil, nil))
121
+ assert_equal("/articles/2", jat_class.relationship_links[:related].value(nil, nil))
122
+ assert_equal("/articles/3", jat_class.document_links[:last].value(nil, nil))
107
123
  end
108
124
 
109
125
  it "inherits `object_meta`, `relationship_meta`, `document_meta`" do
@@ -112,9 +128,9 @@ describe "Jat::Plugins::JsonApi" do
112
128
  jat_class.document_meta(:last) { "foo/3" }
113
129
  child = Class.new(jat_class)
114
130
 
115
- assert_equal("foo/1", child.added_object_meta[:self].call)
116
- assert_equal("foo/2", child.added_relationship_meta[:related].call)
117
- assert_equal("foo/3", child.added_document_meta[:last].call)
131
+ assert_equal("foo/1", child.added_object_meta[:self].value(nil, nil))
132
+ assert_equal("foo/2", child.added_relationship_meta[:related].value(nil, nil))
133
+ assert_equal("foo/3", child.added_document_meta[:last].value(nil, nil))
118
134
  end
119
135
 
120
136
  it "does not change parents meta when children meta changed" do
@@ -127,27 +143,27 @@ describe "Jat::Plugins::JsonApi" do
127
143
  child.added_relationship_meta.delete(:related)
128
144
  child.added_document_meta.delete(:last)
129
145
 
130
- assert_equal("foo/1", jat_class.added_object_meta[:self].call)
131
- assert_equal("foo/2", jat_class.added_relationship_meta[:related].call)
132
- assert_equal("foo/3", jat_class.added_document_meta[:last].call)
146
+ assert_equal("foo/1", jat_class.added_object_meta[:self].value(nil, nil))
147
+ assert_equal("foo/2", jat_class.added_relationship_meta[:related].value(nil, nil))
148
+ assert_equal("foo/3", jat_class.added_document_meta[:last].value(nil, nil))
133
149
  end
134
150
  end
135
151
 
136
- describe ".type" do
152
+ describe ".type, .get_type" do
137
153
  it "does not allows to ask for type before type is defined" do
138
154
  new_class = Class.new(Jat) { plugin(:json_api) }
139
155
 
140
- error = assert_raises(Jat::Error) { new_class.type }
156
+ error = assert_raises(Jat::Error) { new_class.get_type }
141
157
  assert_equal "#{new_class} has no defined type", error.message
142
158
  end
143
159
 
144
160
  it "saves and returns current type" do
145
- assert_equal :jat, jat_class.type
161
+ assert_equal :jat, jat_class.get_type
146
162
  end
147
163
 
148
164
  it "symbolizes type" do
149
165
  jat_class.type "users"
150
- assert_equal :users, jat_class.type
166
+ assert_equal :users, jat_class.get_type
151
167
  end
152
168
  end
153
169
  end
@@ -2,8 +2,8 @@
2
2
 
3
3
  require "test_helper"
4
4
 
5
- describe "Jat::Plugins::JsonApi::Params::Fields" do
6
- before { Jat::Plugins.load_plugin(:json_api) }
5
+ describe "Jat::Plugins::JsonApi::FieldsParamParser" do
6
+ before { Jat::Plugins.find_plugin(:json_api) }
7
7
 
8
8
  let(:jat_class) do
9
9
  Class.new(Jat) do
@@ -16,22 +16,23 @@ describe "Jat::Plugins::JsonApi::Params::Fields" do
16
16
  end
17
17
  end
18
18
 
19
- let(:described_class) { Jat::Plugins::JsonApi::Params::Fields }
19
+ let(:described_class) { jat_class::FieldsParamParser }
20
20
 
21
21
  it "returns empty hash when parameters not provided" do
22
- result = described_class.call(jat_class.allocate, nil)
22
+ result = described_class.parse(nil)
23
23
 
24
24
  assert_equal({}, result)
25
25
  end
26
26
 
27
27
  it "returns parsed attributes" do
28
- result = described_class.call(jat_class.allocate, a: "a1,a2")
28
+ result = described_class.parse(a: "a1,a2")
29
29
 
30
30
  assert_equal({a: %i[a1 a2]}, result)
31
31
  end
32
32
 
33
33
  it "validates provided attributes" do
34
- error = assert_raises(Jat::Error) { described_class.call(jat_class.allocate, a: "a1,a2,a3,a4") }
34
+ jat_class.plugin :json_api_validate_params
35
+ error = assert_raises(Jat::Error) { described_class.parse(a: "a1,a2,a3,a4") }
35
36
  assert_match(/a4/, error.message)
36
37
  end
37
38
  end
@@ -3,7 +3,7 @@
3
3
  require "test_helper"
4
4
 
5
5
  describe "Jat::Plugins::JsonApi::Params::Include" do
6
- before { Jat::Plugins.load_plugin(:json_api) }
6
+ before { Jat::Plugins.find_plugin(:json_api) }
7
7
 
8
8
  let(:base_class) { Class.new(Jat) { plugin :json_api } }
9
9
  let(:a_serializer) { Class.new(base_class) }
@@ -27,15 +27,15 @@ describe "Jat::Plugins::JsonApi::Params::Include" do
27
27
  ser.relationship :b4, serializer: a_serializer
28
28
  end
29
29
 
30
- let(:described_class) { Jat::Plugins::JsonApi::Params::Include }
30
+ let(:described_class) { a_serializer::IncludeParamParser }
31
31
 
32
32
  it "returns empty hash when param not provided" do
33
- result = described_class.call(a_serializer.allocate, nil)
33
+ result = described_class.parse(nil)
34
34
  assert_equal({}, result)
35
35
  end
36
36
 
37
37
  it "returns typed keys" do
38
- result = described_class.call(a_serializer.allocate, "a2.b2,a2.b3,a3.b2.a5,a4")
38
+ result = described_class.parse("a2.b2,a2.b3,a3.b2.a5,a4")
39
39
  assert_equal({a: %i[a2 a3 a5 a4], b: %i[b2 b3]}, result)
40
40
  end
41
41
  end
@@ -3,115 +3,186 @@
3
3
  require "test_helper"
4
4
 
5
5
  describe "Jat::Plugins::JsonApi::Map" do
6
- subject { Jat::Plugins::JsonApi::Map.call(jat) }
6
+ before { Jat::Plugins.find_plugin(:json_api) }
7
7
 
8
- let(:jat_class) do
9
- Class.new(Jat) do
10
- plugin :json_api
11
- type :jat
12
- end
13
- end
14
- let(:jat) { jat_class.new(nil, params: {fields: param_fields, include: param_includes}) }
8
+ let(:described_class) { a::Map }
9
+ let(:base_class) { Class.new(Jat) { plugin :json_api } }
10
+
11
+ let(:a) do
12
+ ser = Class.new(base_class)
13
+ ser.type :a
15
14
 
16
- let(:default_map) { {a: :a1, b: :b1, c: :c1} }
17
- let(:includes_map) { {b: :b2, c: :c2} }
18
- let(:fields_map) { {c: :c3} }
15
+ ser.attribute :a1
16
+ ser.attribute :a2
17
+ ser.attribute :a3, exposed: false
19
18
 
20
- before do
21
- jat.traversal_map.expects(:exposed).returns(default_map)
19
+ ser.relationship :b, serializer: b, exposed: true
20
+ ser.relationship :c, serializer: c
21
+ ser.relationship :d, serializer: d
22
+ ser
22
23
  end
23
24
 
24
- describe "when no params given" do
25
- let(:param_includes) { nil }
26
- let(:param_fields) { nil }
25
+ let(:b) do
26
+ ser = Class.new(base_class)
27
+ ser.type :b
28
+ ser.attribute :b1
29
+ ser.attribute :b2
30
+ ser.attribute :b3, exposed: false
27
31
 
28
- it "returns map of exposed by default fields" do
29
- assert_equal default_map, subject
30
- end
32
+ ser.relationship :c, serializer: c
33
+ ser.relationship :d, serializer: d
34
+ ser
31
35
  end
32
36
 
33
- describe "when fields given" do
34
- let(:param_includes) { nil }
35
- let(:param_fields) { "FIELDS" }
37
+ let(:c) do
38
+ ser = Class.new(base_class)
39
+ ser.type :c
40
+ ser.attribute :c1
41
+ ser.attribute :c2
42
+ ser.attribute :c3, exposed: false
43
+ ser
44
+ end
36
45
 
37
- before do
38
- constructor = Jat::Plugins::JsonApi::ConstructTraversalMap.allocate
39
- constructor.expects(:to_h).returns(fields_map)
46
+ let(:d) do
47
+ ser = Class.new(base_class)
48
+ ser.type :d
49
+ ser.attribute :d1
50
+ ser.attribute :d2
51
+ ser.attribute :d3, exposed: false
52
+ ser
53
+ end
40
54
 
41
- Jat::Plugins::JsonApi::Params::Fields
42
- .expects(:call)
43
- .with(jat, "FIELDS")
44
- .returns("PARSED_FIELDS")
55
+ describe "with default :exposed option" do
56
+ it "returns exposed by default attributes" do
57
+ result = described_class.call(exposed: :default)
58
+ expected_result = {
59
+ a: {serializer: a, attributes: %i[a1 a2], relationships: %i[b]},
60
+ b: {serializer: b, attributes: %i[b1 b2], relationships: %i[]}
61
+ }
45
62
 
46
- Jat::Plugins::JsonApi::ConstructTraversalMap
47
- .expects(:new)
48
- .with(jat_class, :manual, manually_exposed: "PARSED_FIELDS")
49
- .returns(constructor)
63
+ assert_equal expected_result, result
50
64
  end
51
65
 
52
- it "constructs map with default and provided fields" do
53
- assert_equal({a: :a1, b: :b1, c: :c3}, subject)
54
- end
55
- end
66
+ it "returns exposed by default attributes when no :exposed param provided" do
67
+ result = described_class.call({})
68
+ expected_result = {
69
+ a: {serializer: a, attributes: %i[a1 a2], relationships: %i[b]},
70
+ b: {serializer: b, attributes: %i[b1 b2], relationships: %i[]}
71
+ }
56
72
 
57
- describe "when includes given" do
58
- let(:param_includes) { "INCLUDES" }
59
- let(:param_fields) { nil }
73
+ assert_equal expected_result, result
74
+ end
60
75
 
61
- before do
62
- constructor = Jat::Plugins::JsonApi::ConstructTraversalMap.allocate
63
- constructor.expects(:to_h).returns(includes_map)
76
+ it "returns additionally included fields specified in :includes option" do
77
+ includes = "c,b.d"
78
+ result = described_class.call(include: includes)
79
+ expected_result = {
80
+ a: {serializer: a, attributes: %i[a1 a2], relationships: %i[b c]},
81
+ b: {serializer: b, attributes: %i[b1 b2], relationships: %i[d]},
82
+ c: {serializer: c, attributes: %i[c1 c2], relationships: %i[]},
83
+ d: {serializer: d, attributes: %i[d1 d2], relationships: %i[]}
84
+ }
85
+
86
+ assert_equal expected_result, result
87
+ end
64
88
 
65
- Jat::Plugins::JsonApi::Params::Include
66
- .expects(:call)
67
- .with(jat, "INCLUDES")
68
- .returns("PARSED_INCLUDES")
89
+ it "returns fields specified in :fields option (only specified fields for specified type)" do
90
+ fields = {b: "b1,d"}
91
+ result = described_class.call(fields: fields)
92
+ expected_result = {
93
+ a: {serializer: a, attributes: %i[a1 a2], relationships: %i[b]},
94
+ b: {serializer: b, attributes: %i[b1], relationships: %i[d]},
95
+ d: {serializer: d, attributes: %i[d1 d2], relationships: %i[]}
96
+ }
69
97
 
70
- Jat::Plugins::JsonApi::ConstructTraversalMap
71
- .expects(:new)
72
- .with(jat_class, :exposed, manually_exposed: "PARSED_INCLUDES")
73
- .returns(constructor)
98
+ assert_equal expected_result, result
74
99
  end
75
100
 
76
- it "constructs map with default and included fields" do
77
- assert_equal({a: :a1, b: :b2, c: :c2}, subject)
101
+ it "returns fields specified in :includes and :fields options" do
102
+ includes = "c"
103
+ fields = {c: "c1"}
104
+ result = described_class.call(include: includes, fields: fields)
105
+ expected_result = {
106
+ a: {serializer: a, attributes: %i[a1 a2], relationships: %i[b c]},
107
+ b: {serializer: b, attributes: %i[b1 b2], relationships: %i[]},
108
+ c: {serializer: c, attributes: %i[c1], relationships: %i[]}
109
+ }
110
+
111
+ assert_equal expected_result, result
78
112
  end
79
113
  end
80
114
 
81
- describe "when fields and includes given" do
82
- let(:param_fields) { "FIELDS" }
83
- let(:param_includes) { "INCLUDES" }
115
+ describe "with exposed: :none option" do
116
+ it "returns no attributes" do
117
+ result = described_class.call(exposed: :none)
118
+ expected_result = {
119
+ a: {serializer: a, attributes: %i[], relationships: %i[]}
120
+ }
121
+
122
+ assert_equal expected_result, result
123
+ end
124
+
125
+ it "returns additionally included fields specified in :includes option" do
126
+ includes = "b.c"
127
+ result = described_class.call(exposed: :none, include: includes)
128
+ expected_result = {
129
+ a: {serializer: a, attributes: %i[], relationships: %i[b]},
130
+ b: {serializer: b, attributes: %i[], relationships: %i[c]},
131
+ c: {serializer: c, attributes: %i[], relationships: %i[]}
132
+ }
84
133
 
85
- before do
86
- constructor1 = Jat::Plugins::JsonApi::ConstructTraversalMap.allocate
87
- constructor1.expects(:to_h).returns(fields_map)
134
+ assert_equal expected_result, result
135
+ end
88
136
 
89
- Jat::Plugins::JsonApi::Params::Fields
90
- .expects(:call)
91
- .with(jat, "FIELDS")
92
- .returns("PARSED_FIELDS")
137
+ it "returns fields specified in :fields option (only specified fields for specified type)" do
138
+ fields = {a: "a1,b", b: "b1,d"}
139
+ result = described_class.call(exposed: :none, fields: fields)
140
+ expected_result = {
141
+ a: {serializer: a, attributes: %i[a1], relationships: %i[b]},
142
+ b: {serializer: b, attributes: %i[b1], relationships: %i[d]},
143
+ d: {serializer: d, attributes: %i[], relationships: %i[]}
144
+ }
93
145
 
94
- Jat::Plugins::JsonApi::ConstructTraversalMap
95
- .expects(:new)
96
- .with(jat_class, :manual, manually_exposed: "PARSED_FIELDS")
97
- .returns(constructor1)
146
+ assert_equal expected_result, result
147
+ end
98
148
 
99
- constructor2 = Jat::Plugins::JsonApi::ConstructTraversalMap.allocate
100
- constructor2.expects(:to_h).returns(includes_map)
149
+ it "returns fields specified in :includes and :fields options" do
150
+ includes = "c"
151
+ fields = {c: "c1"}
152
+ result = described_class.call(exposed: :none, include: includes, fields: fields)
153
+ expected_result = {
154
+ a: {serializer: a, attributes: %i[], relationships: %i[c]},
155
+ c: {serializer: c, attributes: %i[c1], relationships: %i[]}
156
+ }
101
157
 
102
- Jat::Plugins::JsonApi::Params::Include
103
- .expects(:call)
104
- .with(jat, "INCLUDES")
105
- .returns("PARSED_INCLUDES")
158
+ assert_equal expected_result, result
159
+ end
160
+ end
106
161
 
107
- Jat::Plugins::JsonApi::ConstructTraversalMap
108
- .expects(:new)
109
- .with(jat_class, :exposed, manually_exposed: "PARSED_INCLUDES")
110
- .returns(constructor2)
162
+ describe "with exposed: :all option" do
163
+ it "returns all attributes" do
164
+ result = described_class.call(exposed: :all)
165
+ expected_result = {
166
+ a: {serializer: a, attributes: %i[a1 a2 a3], relationships: %i[b c d]},
167
+ b: {serializer: b, attributes: %i[b1 b2 b3], relationships: %i[c d]},
168
+ c: {serializer: c, attributes: %i[c1 c2 c3], relationships: %i[]},
169
+ d: {serializer: d, attributes: %i[d1 d2 d3], relationships: %i[]}
170
+ }
171
+
172
+ assert_equal expected_result, result
111
173
  end
112
174
 
113
- it "constructs map with using everything: defaults, includes, fields" do
114
- assert_equal({a: :a1, b: :b2, c: :c3}, subject)
175
+ it "returns only specified fields for specified fields types" do
176
+ fields = {b: "b1", c: "c2"}
177
+ result = described_class.call(exposed: :all, fields: fields)
178
+ expected_result = {
179
+ a: {serializer: a, attributes: %i[a1 a2 a3], relationships: %i[b c d]},
180
+ b: {serializer: b, attributes: %i[b1], relationships: %i[]},
181
+ c: {serializer: c, attributes: %i[c2], relationships: %i[]},
182
+ d: {serializer: d, attributes: %i[d1 d2 d3], relationships: %i[]}
183
+ }
184
+
185
+ assert_equal expected_result, result
115
186
  end
116
187
  end
117
188
  end