jat 0.0.3 → 0.0.5

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 (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