active_model_serializers-matchers 0.1.0

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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in active_model_serializer-matchers.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 adman65
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # ActiveModelSerializer::Matchers
2
+
3
+ RSpec Matchers for testing ActiveModel::Serializers
4
+
5
+ This gem currently works with the **0.1.0** release. It will be updated
6
+ for the next public release when that happens.
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ gem 'active_model_serializer-matchers'
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install active_model_serializer-matchers
21
+
22
+ ## Usage
23
+
24
+ Matchers are automatically included in all specs in `spec/serializers`.
25
+
26
+ Here are some examples
27
+
28
+ ```ruby
29
+ describe BlogPostSerializer do
30
+ it { should have_attribute(:title) }
31
+ it { should have_attribute(:text) }
32
+
33
+ it { should have_one(:author) }
34
+
35
+ it { should have_many(:comments) }
36
+ it { should have_many(:comments).as(:responses) }
37
+
38
+ it { should embed(:objects) }
39
+
40
+ it { should include_root }
41
+
42
+ it { should include_root(:blog_post) } # if you want to test the root is specifically set to a different value
43
+ end
44
+ ```
45
+
46
+ ## Contributing
47
+
48
+ 1. Fork it
49
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
50
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
51
+ 4. Push to the branch (`git push origin my-new-feature`)
52
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rspec/core'
7
+ require 'rspec/core/rake_task'
8
+ RSpec::Core::RakeTask.new(:spec) do |spec|
9
+ spec.pattern = FileList['spec/**/*_spec.rb']
10
+ spec.rspec_opts = ['-c']
11
+ end
12
+
13
+ task :default => :spec
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/active_model_serializers/matchers/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["adman65"]
6
+ gem.email = ["me@broadcastingadam.com"]
7
+ gem.description = %q{RSpec matchers for ActiveModel::Serializers}
8
+ gem.summary = %q{}
9
+ gem.homepage = ""
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "active_model_serializers-matchers"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = ActiveModel::Serializers::Matchers::VERSION
17
+
18
+ gem.add_dependency "active_model_serializers", "~> 0.1.0"
19
+ gem.add_dependency "rspec", "~> 2.0"
20
+
21
+ gem.add_development_dependency "simplecov"
22
+ end
@@ -0,0 +1,24 @@
1
+ require 'active_model_serializers'
2
+
3
+ module ActiveModel::Serializers::Matchers
4
+ end
5
+
6
+ require "active_model_serializers/matchers/version"
7
+ require "active_model_serializers/matchers"
8
+
9
+ module SerializerExampleGroup
10
+ extend ActiveSupport::Concern
11
+ include ActiveModel::Serializers::Matchers
12
+
13
+ included do
14
+ subject { described_class }
15
+
16
+ metadata[:type] = :serializer
17
+ end
18
+ end
19
+
20
+ RSpec.configure do |config|
21
+ config.include SerializerExampleGroup, :example_group => {
22
+ :file_path => /spec\/serializers/
23
+ }
24
+ end
@@ -0,0 +1,185 @@
1
+ module ActiveModel
2
+ module Serializers
3
+ module Matchers
4
+ class Root
5
+ attr_accessor :name, :actual
6
+
7
+ def initialize(name = true)
8
+ @name = name
9
+ end
10
+
11
+ def matches?(actual)
12
+ @actual = actual
13
+
14
+ serializer._root == name
15
+ end
16
+
17
+ def description
18
+ "have attribute #{name}"
19
+ end
20
+
21
+ def failure_message_for_should
22
+ %Q{expected "#{actual._root}" to be "#{name}", but it wasn't}
23
+ end
24
+
25
+ def failure_message_for_should_not
26
+ %Q{expected "#{actual._root}" to be "#{name}", but it was}
27
+ end
28
+
29
+ private
30
+ def serializer
31
+ if actual.is_a?(Class)
32
+ actual
33
+ else
34
+ actual.class
35
+ end
36
+ end
37
+ end
38
+
39
+ def include_root(key = nil)
40
+ Root.new key
41
+ end
42
+
43
+ class Embed
44
+ attr_accessor :expected, :actual
45
+
46
+ def initialize(expected)
47
+ @expected = expected
48
+ end
49
+
50
+ def matches?(actual)
51
+ @actual = actual
52
+
53
+ serializer._embed == expected
54
+ end
55
+
56
+ def description
57
+ "embed #{name}"
58
+ end
59
+
60
+ def failure_message_for_should
61
+ %Q{expected "#{actual._embed}" to be "#{name}", but it wasn't}
62
+ end
63
+
64
+ def failure_message_for_should_not
65
+ %Q{expected "#{actual._embed}" to be "#{name}", but it was}
66
+ end
67
+
68
+ private
69
+ def serializer
70
+ if actual.is_a?(Class)
71
+ actual
72
+ else
73
+ actual.class
74
+ end
75
+ end
76
+ end
77
+
78
+ def embed(value)
79
+ Embed.new value
80
+ end
81
+
82
+ class HaveAttribute
83
+ attr_accessor :name, :actual
84
+
85
+ def initialize(name)
86
+ @name = name
87
+ end
88
+
89
+ def matches?(actual)
90
+ @actual = actual
91
+
92
+ attributes.has_key?(name)
93
+ end
94
+
95
+ def description
96
+ "have attribute #{name}"
97
+ end
98
+
99
+ def failure_message_for_should
100
+ %Q{expected #{actual.inspect} to include "#{name}", but it did not}
101
+ end
102
+
103
+ def failure_message_for_should_not
104
+ %Q{expected #{actual.inspect} to not include: "#{name}", but it did}
105
+ end
106
+
107
+ private
108
+ def serializer
109
+ if actual.is_a?(Class)
110
+ actual
111
+ else
112
+ actual.class
113
+ end
114
+ end
115
+
116
+ def attributes
117
+ serializer._attributes
118
+ end
119
+ end
120
+
121
+ def have_attribute(name)
122
+ HaveAttribute.new name
123
+ end
124
+
125
+ class AssociationMatcher
126
+ attr_accessor :name, :actual, :key
127
+
128
+ def initialize(name)
129
+ @name = name
130
+ end
131
+
132
+ def matches?(actual)
133
+ @actual = actual
134
+
135
+ matched_association = associations.select do |assc|
136
+ assc.name == name
137
+ end.first
138
+
139
+ return false unless matched_association
140
+
141
+ if key
142
+ return false if matched_association.key != key
143
+ end
144
+
145
+ true
146
+ end
147
+
148
+ def as(value)
149
+ self.key = value
150
+ self
151
+ end
152
+
153
+ def description
154
+ "have attribute #{name}"
155
+ end
156
+
157
+ def failure_message_for_should
158
+ %Q{expected #{actual.inspect} to include a "#{name}" association, but it did not}
159
+ end
160
+
161
+ def failure_message_for_should_not
162
+ %Q{expected #{actual.inspect} to not include a "#{name}" association, but it did}
163
+ end
164
+
165
+ private
166
+ def serializer
167
+ if actual.is_a?(Class)
168
+ actual
169
+ else
170
+ actual.class
171
+ end
172
+ end
173
+
174
+ def associations
175
+ serializer._associations
176
+ end
177
+ end
178
+
179
+ def have_many(name)
180
+ AssociationMatcher.new(name)
181
+ end
182
+ alias :have_one :have_many
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,7 @@
1
+ module ActiveModel
2
+ module Serializers
3
+ module Matchers
4
+ VERSION = "0.1.0"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveModel::Serializers::Matchers do
4
+ include ActiveModel::Serializers::Matchers
5
+
6
+ it "should be false if the serializer does not have an attribute" do
7
+ serializer = Class.new ActiveModel::Serializer do
8
+ attributes :foo
9
+ end
10
+
11
+ serializer.should_not have_attribute :bar
12
+ serializer.should have_attribute :foo
13
+ end
14
+
15
+ it "should match the embed setting" do
16
+ serializer = Class.new ActiveModel::Serializer do
17
+ embed :ids
18
+ end
19
+
20
+ serializer.should embed(:ids)
21
+ serializer.should_not embed(:objects)
22
+ end
23
+
24
+ describe "The root key" do
25
+ it "should match the root setting" do
26
+ serializer = Class.new ActiveModel::Serializer do
27
+
28
+ end
29
+
30
+ serializer.should include_root
31
+ end
32
+
33
+ it "should be able to match a specific key" do
34
+ serializer = Class.new ActiveModel::Serializer do
35
+ root :foo
36
+ end
37
+
38
+ serializer.should include_root(:foo)
39
+ serializer.should_not include_root(:bar)
40
+ end
41
+ end
42
+
43
+ describe "Associations" do
44
+ it "should work with has_many" do
45
+ serializer = Class.new ActiveModel::Serializer do
46
+ has_many :foos
47
+ end
48
+
49
+ serializer.should have_many(:foos)
50
+ serializer.should_not have_many(:bars)
51
+ end
52
+
53
+ it "should work with has_one" do
54
+ serializer = Class.new ActiveModel::Serializer do
55
+ has_one :foo
56
+ end
57
+
58
+ serializer.should have_one(:foo)
59
+ serializer.should_not have_one(:bar)
60
+ end
61
+
62
+ it "should work with has_one key options" do
63
+ serializer = Class.new ActiveModel::Serializer do
64
+ has_one :foo, :key => :bar
65
+ end
66
+
67
+ serializer.should have_one(:foo).as(:bar)
68
+ serializer.should have_one(:foo)
69
+ serializer.should_not have_one(:foo).as(:qux)
70
+ end
71
+
72
+ it "should work with has_many key options" do
73
+ serializer = Class.new ActiveModel::Serializer do
74
+ has_one :foos, :key => :bars
75
+ end
76
+
77
+ serializer.should have_one(:foos).as(:bars)
78
+ serializer.should have_one(:foos)
79
+ serializer.should_not have_one(:foos).as(:qux)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Metadata" do
4
+ it "should be included for spec/serializers" do
5
+ example.metadata[:type].should == :serializer
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ $: << File.expand_path("../../lib", __FILE__)
5
+
6
+ require "active_model_serializers-matchers"
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_model_serializers-matchers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - adman65
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: active_model_serializers
16
+ requirement: &70326449488760 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.1.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70326449488760
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70326449487760 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70326449487760
36
+ - !ruby/object:Gem::Dependency
37
+ name: simplecov
38
+ requirement: &70326449485580 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70326449485580
47
+ description: RSpec matchers for ActiveModel::Serializers
48
+ email:
49
+ - me@broadcastingadam.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - Gemfile
56
+ - LICENSE
57
+ - README.md
58
+ - Rakefile
59
+ - active_model_serializers-matchers.gemspec
60
+ - lib/active_model_serializers-matchers.rb
61
+ - lib/active_model_serializers/matchers.rb
62
+ - lib/active_model_serializers/matchers/version.rb
63
+ - spec/active_model_serializers_matcher_spec.rb
64
+ - spec/serializers/serializer_spec.rb
65
+ - spec/spec_helper.rb
66
+ homepage: ''
67
+ licenses: []
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ segments:
79
+ - 0
80
+ hash: -1030459714318226783
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ segments:
88
+ - 0
89
+ hash: -1030459714318226783
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 1.8.11
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: ''
96
+ test_files:
97
+ - spec/active_model_serializers_matcher_spec.rb
98
+ - spec/serializers/serializer_spec.rb
99
+ - spec/spec_helper.rb