collection_json_serializer 0.0.1

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 (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +137 -0
  7. data/Rakefile +10 -0
  8. data/collection_json_serializer.gemspec +26 -0
  9. data/lib/collection_json_serializer/builder.rb +56 -0
  10. data/lib/collection_json_serializer/core_ext/hash.rb +9 -0
  11. data/lib/collection_json_serializer/core_ext/symbol.rb +8 -0
  12. data/lib/collection_json_serializer/objects/item.rb +70 -0
  13. data/lib/collection_json_serializer/objects/template.rb +25 -0
  14. data/lib/collection_json_serializer/serializer.rb +71 -0
  15. data/lib/collection_json_serializer/support.rb +36 -0
  16. data/lib/collection_json_serializer/validator/url.rb +22 -0
  17. data/lib/collection_json_serializer/validator/value.rb +28 -0
  18. data/lib/collection_json_serializer/validator.rb +131 -0
  19. data/lib/collection_json_serializer/version.rb +5 -0
  20. data/lib/collection_json_serializer.rb +18 -0
  21. data/test/builder/builder_test.rb +157 -0
  22. data/test/fixtures/models.rb +3 -0
  23. data/test/fixtures/poro.rb +26 -0
  24. data/test/fixtures/serializers/custom_item_links_serializer.rb +7 -0
  25. data/test/fixtures/serializers/custom_item_serializer.rb +3 -0
  26. data/test/fixtures/serializers/custom_template_serializer.rb +5 -0
  27. data/test/fixtures/serializers/invalid_serializer.rb +4 -0
  28. data/test/fixtures/serializers/multiple_href_serializer.rb +3 -0
  29. data/test/fixtures/serializers/unknown_attribute_serializer.rb +3 -0
  30. data/test/fixtures/serializers/user_serializer.rb +7 -0
  31. data/test/fixtures/serializers/valid_serializer.rb +5 -0
  32. data/test/minitest_helper.rb +11 -0
  33. data/test/objects/item_test.rb +82 -0
  34. data/test/objects/template_test.rb +40 -0
  35. data/test/serializer/data_test.rb +29 -0
  36. data/test/serializer/href_test.rb +39 -0
  37. data/test/serializer/links_test.rb +23 -0
  38. data/test/serializer/template_test.rb +30 -0
  39. data/test/support/ext_test.rb +23 -0
  40. data/test/support/support_test.rb +29 -0
  41. data/test/validator/invalid_test.rb +138 -0
  42. data/test/validator/url_validator_test.rb +24 -0
  43. data/test/validator/validator_test.rb +64 -0
  44. data/test/validator/value_validator_test.rb +42 -0
  45. metadata +169 -0
@@ -0,0 +1,3 @@
1
+ class CustomItemSerializer < CollectionJson::Serializer
2
+ attributes name: { anything: "at all", whatever: "really" }
3
+ end
@@ -0,0 +1,5 @@
1
+ class CustomTemplateSerializer < CollectionJson::Serializer
2
+ template :name, email: { prompt: "My email",
3
+ anything: "at all",
4
+ whatever: "really" }
5
+ end
@@ -0,0 +1,4 @@
1
+ class InvalidSerializer < CollectionJson::Serializer
2
+ href self: "/users/1", collection: "www.users.com"
3
+ links dashboard: { href: "/my-dashboard" }
4
+ end
@@ -0,0 +1,3 @@
1
+ class MultipleHrefSerializer < CollectionJson::Serializer
2
+ href "/a", "/b", "/c"
3
+ end
@@ -0,0 +1,3 @@
1
+ class UnknownAttributeSerializer < CollectionJson::Serializer
2
+ attributes :unknown
3
+ end
@@ -0,0 +1,7 @@
1
+ class UserSerializer < CollectionJson::Serializer
2
+ href self: "http://example.com/users/{id}",
3
+ collection: "http://example.com/users"
4
+ attributes :name, :email
5
+ template :name, email: { prompt: "My email" }
6
+ links dashboard: { href: "http://example.com/my-dashboard" }
7
+ end
@@ -0,0 +1,5 @@
1
+ class ValidSerializer < CollectionJson::Serializer
2
+ href self: "http://example.com/users/1",
3
+ collection: "http://example.com/users"
4
+ links dashboard: { href: "http://example.com/my-dashboard" }
5
+ end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+ require "collection_json_serializer"
3
+
4
+ require "minitest/autorun"
5
+
6
+ require "fixtures/poro"
7
+ require "fixtures/models"
8
+ Dir.glob(File.dirname(__FILE__) + "/fixtures/serializers/**/*.rb") { |file| require file }
9
+
10
+ require "active_support/json"
11
+ require "active_support/inflector"
@@ -0,0 +1,82 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class Objects
6
+ class Item
7
+ class TestItem < Minitest::Test
8
+ def setup
9
+ @user1 = User.new(name: "Carles Jove", email: "hola@carlus.cat")
10
+ @user2 = User.new(name: "Aina Jove", email: "hola@example.com")
11
+ @user_serializer = UserSerializer.new(@user1)
12
+ @item = Item.new(@user_serializer)
13
+ end
14
+
15
+ def test_that_an_item_can_be_build
16
+ expected = {
17
+ href: "http://example.com/users/#{@user1.id}",
18
+ data: [
19
+ { name: "name", value: "Carles Jove" },
20
+ { name: "email", value: "hola@carlus.cat" }
21
+ ],
22
+ links: [
23
+ { name: "dashboard", href: "http://example.com/my-dashboard" }
24
+ ]
25
+ }
26
+
27
+ assert_equal expected.to_json, @item.create.to_json
28
+ end
29
+
30
+ def test_that_an_item_can_be_built_passing_an_index
31
+ user_serializer = UserSerializer.new([@user1, @user2])
32
+ item = Item.new(user_serializer, item: 1)
33
+
34
+ expected = {
35
+ href: "http://example.com/users/#{@user2.id}",
36
+ data: [
37
+ { name: "name", value: "Aina Jove" },
38
+ { name: "email", value: "hola@example.com" }
39
+ ],
40
+ links: [
41
+ { name: "dashboard", href: "http://example.com/my-dashboard" }
42
+ ]
43
+ }
44
+
45
+ assert_equal expected.to_json, item.create.to_json
46
+ end
47
+
48
+ def test_that_an_item_can_be_build_with_random_attributes
49
+ custom_serializer = CustomItemSerializer.new(@user1)
50
+ item = Item.new(custom_serializer)
51
+
52
+ expected = {
53
+ data: [
54
+ { name: "name", value: "Carles Jove", anything: "at all", whatever: "really" },
55
+ ]
56
+ }
57
+ assert_equal expected.to_json, item.create.to_json
58
+ end
59
+
60
+ def test_that_an_item_link_can_be_build_with_unlimited_attributes
61
+ custom_serializer = CustomItemLinksSerializer.new(@user1)
62
+ item = Item.new(custom_serializer)
63
+
64
+ expected = {
65
+ links: [
66
+ { name: "dashboard", href: "/my-dashboard", anything: "at all", whatever: "really" }
67
+ ]
68
+ }
69
+
70
+ assert_equal expected[:links], item.create[:links]
71
+ end
72
+
73
+ def test_that_unknown_attributes_are_silently_ignored
74
+ serializer_with_unknown_attr = UnknownAttributeSerializer.new(@user1)
75
+ item = Item.new(serializer_with_unknown_attr)
76
+ refute item.create.include?(:unknown)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,40 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class Objects
6
+ class Template
7
+ class TestTemplate < Minitest::Test
8
+ def setup
9
+ @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
10
+ @account = Account.new(id: 1, name: "My Account", created_at: Time.now)
11
+ @user.account = @account
12
+ @user_serializer = UserSerializer.new(@user)
13
+ @template = Template.new(@user_serializer)
14
+ end
15
+
16
+ def test_that_a_template_can_be_build
17
+ expected = [
18
+ { name: "name", value: "" },
19
+ { name: "email", value: "", prompt: "My email" }
20
+ ]
21
+
22
+ assert_equal expected.to_json, @template.create.to_json
23
+ end
24
+
25
+ def test_that_a_template_can_be_build_with_random_attributes
26
+ custom_serializer = CustomTemplateSerializer.new(@user)
27
+ template = Template.new(custom_serializer)
28
+
29
+ expected = [
30
+ { name: "name", value: "" },
31
+ { name: "email", value: "", prompt: "My email", anything: "at all", whatever: "really" }
32
+ ]
33
+
34
+ assert_equal expected.to_json, template.create.to_json
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,29 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class TestData < Minitest::Test
6
+ def setup
7
+ @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
8
+ @user_serializer = UserSerializer.new(@user)
9
+ end
10
+
11
+ def test_attributes_properties
12
+ assert_equal [:name, :email], @user_serializer.class.attributes
13
+ end
14
+
15
+ def test_that_any_attributes_can_be_passed
16
+ custom_serializer = CustomItemSerializer.new(@user)
17
+ expected = [
18
+ name:
19
+ {
20
+ anything: "at all",
21
+ whatever: "really"
22
+ }
23
+ ]
24
+
25
+ assert_equal expected, custom_serializer.class.attributes
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class TestHref < Minitest::Test
6
+ def setup
7
+ @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
8
+ @user_serializer = UserSerializer.new(@user)
9
+ end
10
+
11
+ def test_href_object
12
+ expected = [{
13
+ self: "http://example.com/users/{id}",
14
+ collection: "http://example.com/users"
15
+ }]
16
+ assert_equal expected, @user_serializer.class.href
17
+ end
18
+
19
+ def test_that_only_one_href_value_is_passed_to_builder
20
+ multiple_href_serializer = MultipleHrefSerializer.new(@user)
21
+ assert_equal %w(/a /b /c), multiple_href_serializer.class.href
22
+ assert_equal "/a", multiple_href_serializer.href
23
+ end
24
+
25
+ def test_that_a_placeholder_can_be_used_for_urls
26
+ user_serializer = CollectionJson::Serializer.new(@user)
27
+ user_serializer.class.attributes = [:name]
28
+ user_serializer.class.links = []
29
+ user_serializer.class.template = []
30
+ user_serializer.class.href = [self: "http://example.com/users/{id}"]
31
+ builder = Builder.new(user_serializer)
32
+
33
+ expected = "http://example.com/users/#{@user.id}"
34
+ actual = builder.pack[:collection][:items].first[:href]
35
+ assert_equal expected, actual
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,23 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class TestLinks < Minitest::Test
6
+ def setup
7
+ @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
8
+ @user_serializer = UserSerializer.new(@user)
9
+ end
10
+
11
+ def test_item_links_attributes
12
+ expected = [dashboard: { href: "http://example.com/my-dashboard" }]
13
+ assert_equal expected, @user_serializer.class.links
14
+ end
15
+
16
+ def test_item_links_attributes_can_take_unlimited_properties
17
+ custom_serializer = CustomItemLinksSerializer.new(@user)
18
+ expected = [dashboard: { href: "/my-dashboard", anything: "at all", whatever: "really" }]
19
+ assert_equal expected, custom_serializer.class.links
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,30 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class TestTemplate < Minitest::Test
6
+ def setup
7
+ @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
8
+ @user_serializer = UserSerializer.new(@user)
9
+ end
10
+
11
+ def test_template_attributes
12
+ assert_equal [:name, email: { prompt: "My email" }], @user_serializer.class.template
13
+ end
14
+
15
+ def test_that_any_attributes_can_be_passed
16
+ custom_serializer = CustomTemplateSerializer.new(@user)
17
+ expected = [
18
+ :name,
19
+ email: {
20
+ prompt: "My email",
21
+ anything: "at all",
22
+ whatever: "really"
23
+ }
24
+ ]
25
+
26
+ assert_equal expected, custom_serializer.class.template
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class TestExtractParams < Minitest::Test
6
+ def test_extract_params_for_hash
7
+ attrs = { test: { prompt: "works" } }
8
+
9
+ params = attrs.extract_params
10
+ assert_equal :test, params[:name]
11
+ assert_equal attrs[:test], params[:properties]
12
+ end
13
+
14
+ def test_extract_params_for_symbol
15
+ attrs = :test
16
+
17
+ params = attrs.extract_params
18
+ assert_equal :test, params[:name]
19
+ assert params[:properties].nil?
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ module Support
6
+ class TestSupport < Minitest::Test
7
+ include CollectionJson::Serializer::Support
8
+
9
+ def setup
10
+ @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
11
+ @user_serializer = UserSerializer.new(@user)
12
+ @builder = Builder.new(@user_serializer)
13
+ end
14
+
15
+ def test_extract_value
16
+ actual = extract_value_from(@user_serializer.resources.first, :name)
17
+ assert_equal "Carles Jove", actual
18
+ end
19
+
20
+ def test_that_an_url_with_placeholder_can_be_parsed
21
+ url = "http://example.com/users/{id}"
22
+ expected = "http://example.com/users/#{@user.id}"
23
+
24
+ assert_equal expected, parse_url(url, @user)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,138 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class Validator
6
+ class TestInvalid < Minitest::Test
7
+ def setup
8
+ @user = User.new(
9
+ name: "Carles Jove",
10
+ email: "hola@carlus.cat"
11
+ )
12
+ @account = Account.new(
13
+ id: 1,
14
+ name: "My Account",
15
+ created_at: Time.now
16
+ )
17
+ @user.account = @account
18
+
19
+ @invalid_value_types = [
20
+ /regex/,
21
+ :symbol,
22
+ {},
23
+ []
24
+ ]
25
+
26
+ @invalid = CollectionJson::Serializer.new(@user)
27
+ @invalid.class.attributes = []
28
+ @invalid.class.href = []
29
+ @invalid.class.links = []
30
+ @invalid.class.template = []
31
+ end
32
+
33
+ # href
34
+ def test_that_href_generates_errors
35
+ @invalid.class.href = [self: "/users/1", collection: "www.users.com"]
36
+
37
+ assert @invalid.invalid?
38
+ assert @invalid.errors.include? :href
39
+ assert @invalid.errors[:href][0].
40
+ include? "href:self is an invalid URL"
41
+ assert @invalid.errors[:href][1].
42
+ include? "href:collection is an invalid URL"
43
+
44
+ @invalid.class.href = ["/users/1"]
45
+
46
+ assert @invalid.invalid?
47
+ assert @invalid.errors.include? :href
48
+ assert @invalid.errors[:href][0].
49
+ include? "href is an invalid URL"
50
+ end
51
+
52
+ # links
53
+ def test_that_links_generates_errors
54
+ @invalid.class.links = [dashboard: { href: "/my-dashboard" }]
55
+ assert @invalid.invalid?
56
+ assert @invalid.errors.include? :links
57
+ assert @invalid.errors[:links].first.
58
+ include? "links:dashboard:href is an invalid URL"
59
+
60
+ @invalid.class.links = [
61
+ dashboard: {
62
+ href: "http://valid.url.com",
63
+ prompt: /invalid/
64
+ }
65
+ ]
66
+ assert @invalid.invalid?
67
+ assert @invalid.errors.include? :links
68
+ assert @invalid.errors[:links].first.
69
+ include? "links:dashboard:prompt is an invalid value"
70
+ end
71
+
72
+ def test_that_links_missing_href_generates_error
73
+ @invalid.class.links = [dashboard: {}]
74
+ assert @invalid.invalid?
75
+ assert @invalid.errors.include? :links
76
+ assert @invalid.errors[:links].first.
77
+ include? "links:dashboard:href is missing"
78
+ end
79
+
80
+ # attributes
81
+ def test_that_invalid_attributes_return_values_generate_errors
82
+ @invalid.class.attributes = [:name]
83
+
84
+ @invalid_value_types.each do |invalidate|
85
+ @user.name = invalidate
86
+ assert @invalid.invalid?,
87
+ "#{invalidate} should be invalid"
88
+ assert @invalid.errors.include?(:attributes),
89
+ "#{invalidate} should be invalid"
90
+ assert @invalid.errors[:attributes].
91
+ first.include? "attributes:name is an invalid value"
92
+ end
93
+ end
94
+
95
+ def test_that_invalid_attributes_properties_values_generate_errors
96
+ @invalid_value_types.each do |invalidate|
97
+ @invalid.class.attributes = [
98
+ name: {
99
+ prompt: invalidate,
100
+ test: invalidate
101
+ }
102
+ ]
103
+
104
+ assert @invalid.invalid?,
105
+ "#{invalidate} should be invalid"
106
+ assert @invalid.errors.include?(:attributes),
107
+ "#{invalidate} should be invalid"
108
+ assert @invalid.errors[:attributes][0].
109
+ include? "attributes:name:prompt is an invalid value"
110
+ assert @invalid.errors[:attributes][1].
111
+ include? "attributes:name:test is an invalid value"
112
+ end
113
+ end
114
+
115
+ # template
116
+ def test_that_template_values_validate
117
+ @invalid_value_types.each do |invalidate|
118
+ @invalid.class.template = [
119
+ name: {
120
+ prompt: invalidate,
121
+ name: invalidate
122
+ }
123
+ ]
124
+
125
+ assert @invalid.invalid?,
126
+ "#{invalidate} should be invalid"
127
+ assert @invalid.errors.include?(:template),
128
+ "#{invalidate} should be invalid"
129
+ assert @invalid.errors[:template][0].
130
+ include? "template:name:prompt is an invalid value"
131
+ assert @invalid.errors[:template][1].
132
+ include? "template:name:name is an invalid value"
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end