active_model_serializers_matchers 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aebf6c344b00ad0333dcd6cb258c6c1a76037897
4
- data.tar.gz: 44d578eab83b1f8766cb31358fcacadcfc056289
3
+ metadata.gz: f077a6f2b1a3a40b7ee1b140eb7bcc717a345efd
4
+ data.tar.gz: ecd3e42fe80ca954a55d2b6de3d7faad34dd9709
5
5
  SHA512:
6
- metadata.gz: 324fbdb1a050601a50eaa0b949660c91e7a7e00cc702cfeedbce03ffbb6883c4fb6d19e2511d35a20f1d812539847453fa32ff92a458daf36be7d88d36044fa8
7
- data.tar.gz: df4d83517d5011d9c858ccea3555a7f9922ef71eff6a1c756decb49d515dacbaed82f4d9621170c941c308310842d4628d5043968be555edb2b7f2e0f5972d9d
6
+ metadata.gz: 8234d7c88ae9b5d0075a5399df1fbf38b7d54020b77de42b9fb64547f00888c8294db376956ce31cc8b9b4ab37a10ad536d2ff81f48f7a09fc7632bd58155c2a
7
+ data.tar.gz: 05f2dcd60af24ee521703f6c25f9e11ec1e7d40f114955b013530f419c00140550f77f33524fa0e7020e5bfade3f4910a8737940ce8a7efd4c840529b583f6c8
data/README.md CHANGED
@@ -7,8 +7,7 @@ RSpec matchers for testing ActiveModel::Serializer
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ruby
10
- gem 'active_model_serializers_matchers', '0.0.1',
11
- git: 'git://github.com/tonyta/active_model_serializers_matchers.git'
10
+ gem 'active_model_serializers_matchers', '0.0.3'
12
11
  ```
13
12
 
14
13
  And then execute:
@@ -20,8 +19,64 @@ Or install it yourself as:
20
19
  $ gem install active_model_serializers_matchers
21
20
 
22
21
  ## Usage
22
+ ### Simple `has_many` and `has_one` Associations
23
+ ``` ruby
24
+ class ListSerializer < ActiveModel::Serializer
25
+ has_one :title
26
+ has_many :items
27
+ end
23
28
 
24
- TODO: Write usage instructions here
29
+ RSpec.describe ListSerializer do
30
+ it { should have_one(:title) }
31
+ it { should have_many(:items) }
32
+ end
33
+
34
+ #=> should have one title
35
+ #=> should have many items
36
+ ```
37
+
38
+ ### Association Options
39
+ #### Key
40
+ use: `#as`
41
+ ``` ruby
42
+ class ShoeRackSerializer < ActiveModel::Serializer
43
+ has_many :shoes, key: :kicks
44
+ end
45
+
46
+ RSpec.describe ShoeRackSerializer do
47
+ it { should have_many(:shoes).as(:kicks) }
48
+ end
49
+
50
+ #=> should have many shoes as "kicks"
51
+ ```
52
+ #### Serializer
53
+ use: `#serialized_with`
54
+ ``` ruby
55
+ class ShoppingCartSerializer < ActiveModel::Serializer
56
+ has_many :items, serializer: ProductSerializer
57
+ end
58
+
59
+ RSpec.describe ShoppingCartSerializer do
60
+ it { should have_many(:items).serialized_with(ProductSerializer) }
61
+ end
62
+
63
+ #=> should have many items serialized with ProductSerializer
64
+ ```
65
+ #### Chainable
66
+ These can be chained in any order.
67
+ ``` ruby
68
+ class MenuSerializer < ActiveModel::Serializer
69
+ has_many :entrees, key: dishes, serializer: FoodSerializer
70
+ end
71
+
72
+ RSpec.describe MenuSerializer do
73
+ it { should have_many(:entrees).as(:dishes).serialized_with(FoodSerializer) }
74
+ it { should have_many(:entrees).serialized_with(FoodSerializer).as(:dishes) }
75
+ end
76
+
77
+ #=> should have many entrees as "dishes" serialized with FoodSerializer
78
+ #=> should have many entrees as "dishes" serialized with FoodSerializer
79
+ ```
25
80
 
26
81
  ## Contributing
27
82
 
@@ -2,6 +2,7 @@ require "active_support"
2
2
 
3
3
  require "active_model_serializers_matchers/version"
4
4
  require "active_model_serializers_matchers/have_many_association_matcher"
5
+ require "active_model_serializers_matchers/have_one_association_matcher"
5
6
 
6
7
  module ActiveModelSerializersMatchers
7
8
  extend ActiveSupport::Concern
@@ -13,4 +14,8 @@ module ActiveModelSerializersMatchers
13
14
  def have_many(association_root)
14
15
  HaveManyAssociationMatcher.new(association_root)
15
16
  end
17
+
18
+ def have_one(association_root)
19
+ HaveOneAssociationMatcher.new(association_root)
20
+ end
16
21
  end
@@ -10,7 +10,7 @@ module ActiveModelSerializersMatchers
10
10
 
11
11
  def matches?(actual)
12
12
  @actual = actual.is_a?(Class) ? actual : actual.class
13
- association and match_root? && match_key? && match_serializer?
13
+ match_association? && match_key? && match_serializer?
14
14
  end
15
15
 
16
16
  def as(key)
@@ -33,18 +33,18 @@ module ActiveModelSerializersMatchers
33
33
  end
34
34
 
35
35
  def failure_message
36
- if association && match_root?
37
- "expected #{actual} association options for #{root}: #{association.options} to include: #{expected_association}"
36
+ if match_association?
37
+ "expected #{actual} association options for #{root}: #{root_association.options} to include: #{expected_association}"
38
38
  else
39
- "expected #{actual} associations: #{associations.keys} to include: #{root.inspect}"
39
+ "expected #{actual} associations: #{associations} to include: {#{root.inspect}=>(subclass of ActiveModel::Serializer::Associations::HasMany)}"
40
40
  end
41
41
  end
42
42
 
43
43
  def failure_message_when_negated
44
- if association && match_root?
45
- "expected #{actual} associations: #{associations.keys} to not include: #{root.inspect}"
44
+ if match_association?
45
+ "expected #{actual} associations: #{associations} to not include: {#{root.inspect}=>(subclass of ActiveModel::Serializer::Associations::HasMany)}"
46
46
  else
47
- "expected #{actual} association options for #{root}: #{association.options} to not include: #{expected_options}"
47
+ "expected #{actual} association options for #{root}: #{root_association.options} to not include: #{expected_options}"
48
48
  end
49
49
  end
50
50
 
@@ -61,23 +61,23 @@ module ActiveModelSerializersMatchers
61
61
  actual._associations
62
62
  end
63
63
 
64
- def association
65
- return false if associations[root].nil?
64
+ def root_association
66
65
  associations[root]
67
66
  end
68
67
 
69
- def match_root?
70
- association.options[:root] == root
68
+ def match_association?
69
+ return false if root_association.nil?
70
+ root_association.superclass == ActiveModel::Serializer::Associations::HasMany
71
71
  end
72
72
 
73
73
  def match_key?
74
74
  return true unless key_check
75
- association.options[:key] == key
75
+ root_association.options[:key] == key
76
76
  end
77
77
 
78
78
  def match_serializer?
79
79
  return true unless serializer_check
80
- association.options[:serializer].to_s == serializer.to_s
80
+ root_association.options[:serializer].to_s == serializer.to_s
81
81
  end
82
82
  end
83
83
  end
@@ -0,0 +1,83 @@
1
+ module ActiveModelSerializersMatchers
2
+ class HaveOneAssociationMatcher
3
+ attr_accessor :actual, :root, :key, :serializer, :key_check, :serializer_check
4
+
5
+ def initialize(root)
6
+ @root = root
7
+ @key_check = false
8
+ @serializer_check = false
9
+ end
10
+
11
+ def matches?(actual)
12
+ @actual = actual.is_a?(Class) ? actual : actual.class
13
+ match_association? && match_key? && match_serializer?
14
+ end
15
+
16
+ def as(key)
17
+ self.key_check = true
18
+ self.key = key
19
+ self
20
+ end
21
+
22
+ def serialized_with(serializer)
23
+ self.serializer_check = true
24
+ self.serializer = serializer
25
+ self
26
+ end
27
+
28
+ def description
29
+ msg = "have one #{root}"
30
+ msg << " as \"#{key}\"" if key_check
31
+ msg << " serialized with #{serializer}" if serializer_check
32
+ msg
33
+ end
34
+
35
+ def failure_message
36
+ if match_association?
37
+ "expected #{actual} association options for #{root}: #{root_association.options} to include: #{expected_association}"
38
+ else
39
+ "expected #{actual} associations: #{associations} to include: {#{root.inspect}=>(subclass of ActiveModel::Serializer::Associations::HasOne)}"
40
+ end
41
+ end
42
+
43
+ def failure_message_when_negated
44
+ if match_association?
45
+ "expected #{actual} associations: #{associations} to not include: {#{root.inspect}=>(subclass of ActiveModel::Serializer::Associations::HasOne)}"
46
+ else
47
+ "expected #{actual} association options for #{root}: #{root_association.options} to not include: #{expected_options}"
48
+ end
49
+ end
50
+
51
+ def expected_options
52
+ expected = { root: root }
53
+ expected[:key] = key if key_check
54
+ expected[:serializer] = serializer if serializer_check
55
+ expected
56
+ end
57
+
58
+ private
59
+
60
+ def associations
61
+ actual._associations
62
+ end
63
+
64
+ def root_association
65
+ associations[root]
66
+ end
67
+
68
+ def match_association?
69
+ return false if root_association.nil?
70
+ root_association.superclass == ActiveModel::Serializer::Associations::HasOne
71
+ end
72
+
73
+ def match_key?
74
+ return true unless key_check
75
+ root_association.options[:key] == key
76
+ end
77
+
78
+ def match_serializer?
79
+ return true unless serializer_check
80
+ root_association.options[:serializer].to_s == serializer.to_s
81
+ end
82
+ end
83
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveModelSerializersMatchers
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -9,7 +9,7 @@ describe ActiveModelSerializersMatchers::HaveManyAssociationMatcher do
9
9
  describe '#matches?' do
10
10
  context 'when called with a class' do
11
11
  it 'sets @actual to that class' do
12
- allow(subject).to receive(:association)
12
+ allow(subject).to receive(:root_association)
13
13
  subject.matches?(Object)
14
14
  expect(subject.actual).to be Object
15
15
  end
@@ -17,25 +17,24 @@ describe ActiveModelSerializersMatchers::HaveManyAssociationMatcher do
17
17
 
18
18
  context 'when called with an instance of class' do
19
19
  it 'sets @actual to the class of that instance' do
20
- allow(subject).to receive(:association)
20
+ allow(subject).to receive(:root_association)
21
21
  subject.matches?(Object.new)
22
22
  expect(subject.actual).to be Object
23
23
  end
24
24
  end
25
25
 
26
26
  describe 'return value' do
27
- context 'when association, match_root?, match_key?, and match_serializer? are all true' do
27
+ context 'when match_association?, match_key?, and match_serializer? are all true' do
28
28
  before do
29
- expect(subject).to receive(:association ) { true }
30
- expect(subject).to receive(:match_root? ) { true }
31
- expect(subject).to receive(:match_key? ) { true }
32
- expect(subject).to receive(:match_serializer?) { true }
29
+ expect(subject).to receive(:match_association?) { true }
30
+ expect(subject).to receive(:match_key? ) { true }
31
+ expect(subject).to receive(:match_serializer? ) { true }
33
32
  end
34
33
  specify { expect(subject.matches?(serializer)).to be true }
35
34
  end
36
35
 
37
- context 'when any association, match_root?, match_key?, or match_serializer? is false' do
38
- match_check_methods = [:association, :match_root?, :match_key?, :match_serializer?]
36
+ context 'when any match_association?, match_key?, or match_serializer? is false' do
37
+ match_check_methods = [:match_association?, :match_key?, :match_serializer?]
39
38
 
40
39
  match_check_methods.each do |false_method|
41
40
  before do
@@ -83,9 +82,17 @@ describe ActiveModelSerializersMatchers::HaveManyAssociationMatcher do
83
82
  end
84
83
  end
85
84
 
86
- describe 'integration tests' do
85
+ describe 'feature tests' do
87
86
  include ActiveModelSerializersMatchers
88
87
 
88
+ context 'a serializer with one foo' do
89
+ subject do
90
+ Class.new(ActiveModel::Serializer) { has_one :foo }
91
+ end
92
+ it { should_not have_many :foo }
93
+ it { should_not have_many :foos }
94
+ end
95
+
89
96
  context 'a serializer with many foos' do
90
97
  subject do
91
98
  Class.new(ActiveModel::Serializer) { has_many :foos }
@@ -0,0 +1,137 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveModelSerializersMatchers::HaveOneAssociationMatcher do
4
+
5
+ subject { described_class.new(:foos) }
6
+
7
+ let(:serializer) { Class.new(ActiveModel::Serializer) }
8
+
9
+ describe '#matches?' do
10
+ context 'when called with a class' do
11
+ it 'sets @actual to that class' do
12
+ allow(subject).to receive(:root_association)
13
+ subject.matches?(Object)
14
+ expect(subject.actual).to be Object
15
+ end
16
+ end
17
+
18
+ context 'when called with an instance of class' do
19
+ it 'sets @actual to the class of that instance' do
20
+ allow(subject).to receive(:root_association)
21
+ subject.matches?(Object.new)
22
+ expect(subject.actual).to be Object
23
+ end
24
+ end
25
+
26
+ describe 'return value' do
27
+ context 'when match_association?, match_key?, and match_serializer? are all true' do
28
+ before do
29
+ expect(subject).to receive(:match_association?) { true }
30
+ expect(subject).to receive(:match_key? ) { true }
31
+ expect(subject).to receive(:match_serializer? ) { true }
32
+ end
33
+ specify { expect(subject.matches?(serializer)).to be true }
34
+ end
35
+
36
+ context 'when any match_association?, match_key?, or match_serializer? is false' do
37
+ match_check_methods = [:match_association?, :match_key?, :match_serializer?]
38
+
39
+ match_check_methods.each do |false_method|
40
+ before do
41
+ match_check_methods.each do |method|
42
+ allow(subject).to receive(method) { method == false_method ? false : true }
43
+ end
44
+ end
45
+ specify { expect(subject.matches?(serializer)).to be false }
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#as' do
52
+ it 'should return self' do
53
+ expect(subject.as(:a_key)).to be subject
54
+ end
55
+
56
+ context 'when it is not called' do
57
+ its(:key_check) { should be false }
58
+ its(:key) { should be_nil }
59
+ end
60
+
61
+ context 'when it is called with :a_key' do
62
+ before { subject.as(:a_key) }
63
+ its(:key_check) { should be true }
64
+ its(:key) { should be :a_key }
65
+ end
66
+ end
67
+
68
+ describe '#serialized_with' do
69
+ it 'should return self' do
70
+ expect(subject.serialized_with(:a_serializer)).to be subject
71
+ end
72
+
73
+ context 'when it is not called' do
74
+ its(:serializer_check) { should be false }
75
+ its(:serializer) { should be_nil }
76
+ end
77
+
78
+ context 'when it is called with :a_serializer' do
79
+ before { subject.serialized_with(:a_serializer) }
80
+ its(:serializer_check) { should be true }
81
+ its(:serializer) { should be :a_serializer }
82
+ end
83
+ end
84
+
85
+ describe 'feature tests' do
86
+ include ActiveModelSerializersMatchers
87
+
88
+ context 'a serializer with one foo' do
89
+ subject do
90
+ Class.new(ActiveModel::Serializer) { has_many :foos }
91
+ end
92
+ it { should_not have_one :foo }
93
+ it { should_not have_one :foos }
94
+ end
95
+
96
+ context 'a serializer with one foo' do
97
+ subject do
98
+ Class.new(ActiveModel::Serializer) { has_one :foo }
99
+ end
100
+ it { should have_one(:foo) }
101
+ it { should_not have_one(:bar) }
102
+ it { should_not have_one(:foo).as(:bar) }
103
+ it { should_not have_one(:foo).serialized_with(:baz) }
104
+ end
105
+
106
+ context 'a serializer with one foo as bar' do
107
+ subject do
108
+ Class.new(ActiveModel::Serializer) { has_one :foo, key: :bar }
109
+ end
110
+ it { should have_one(:foo) }
111
+ it { should have_one(:foo).as(:bar) }
112
+ it { should_not have_one(:foo).as(:baz) }
113
+ end
114
+
115
+ context 'a serializer with one foo serialized with baz' do
116
+ subject do
117
+ Class.new(ActiveModel::Serializer) { has_one :foo, serializer: :baz }
118
+ end
119
+ it { should have_one(:foo) }
120
+ it { should have_one(:foo).serialized_with(:baz) }
121
+ it { should_not have_one(:foo).serialized_with(:bar) }
122
+ end
123
+
124
+ context 'a serializer with one foo as bar serialized with baz' do
125
+ subject do
126
+ Class.new(ActiveModel::Serializer) { has_one :foo, key: :bar, serializer: :baz }
127
+ end
128
+ it { should have_one(:foo) }
129
+ it { should have_one(:foo).as(:bar) }
130
+ it { should have_one(:foo).serialized_with(:baz) }
131
+ it { should have_one(:foo).as(:bar).serialized_with(:baz) }
132
+ it { should_not have_one(:fuu).as(:bar).serialized_with(:baz) }
133
+ it { should_not have_one(:foo).as(:bor).serialized_with(:baz) }
134
+ it { should_not have_one(:foo).as(:bar).serialized_with(:biz) }
135
+ end
136
+ end
137
+ end
@@ -11,4 +11,12 @@ describe ActiveModelSerializersMatchers do
11
11
  have_many(:association_root)
12
12
  end
13
13
  end
14
+
15
+ describe '#have_one' do
16
+ it 'instantiates a new HaveOneAssociationMatcher' do
17
+ expect(described_class::HaveOneAssociationMatcher)
18
+ .to receive(:new).with(:association_root)
19
+ have_one(:association_root)
20
+ end
21
+ end
14
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_model_serializers_matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Ta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-23 00:00:00.000000000 Z
11
+ date: 2014-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -110,8 +110,10 @@ files:
110
110
  - active_model_serializers_matchers.gemspec
111
111
  - lib/active_model_serializers_matchers.rb
112
112
  - lib/active_model_serializers_matchers/have_many_association_matcher.rb
113
+ - lib/active_model_serializers_matchers/have_one_association_matcher.rb
113
114
  - lib/active_model_serializers_matchers/version.rb
114
115
  - spec/active_model_serializers_matchers/have_many_association_matcher_spec.rb
116
+ - spec/active_model_serializers_matchers/have_one_association_matcher_spec.rb
115
117
  - spec/active_model_serializers_matchers_spec.rb
116
118
  - spec/spec_helper.rb
117
119
  homepage: ''
@@ -140,5 +142,6 @@ specification_version: 4
140
142
  summary: RSpec matchers for testing ActiveModel::Serializer
141
143
  test_files:
142
144
  - spec/active_model_serializers_matchers/have_many_association_matcher_spec.rb
145
+ - spec/active_model_serializers_matchers/have_one_association_matcher_spec.rb
143
146
  - spec/active_model_serializers_matchers_spec.rb
144
147
  - spec/spec_helper.rb