shoulda-change_matchers 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - ree
3
+ - 1.9.2
4
+ - 1.9.3
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise "shoulda2" do
2
+ gem 'shoulda', '~>2.11'
3
+ end
4
+
5
+ appraise "shoulda3" do
6
+ gem 'shoulda', '~>3.1'
7
+ end
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :rubygems
2
+ gemspec
3
+
4
+ gem "appraisal"
5
+ gem "rake"
6
+ gem "test-unit", ">=2.5.1"
7
+ gem "shoulda"
data/Gemfile.lock ADDED
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ shoulda-change_matchers (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ activesupport (3.2.8)
10
+ i18n (~> 0.6)
11
+ multi_json (~> 1.0)
12
+ appraisal (0.4.1)
13
+ bundler
14
+ rake
15
+ i18n (0.6.0)
16
+ multi_json (1.3.6)
17
+ rake (0.9.2)
18
+ shoulda (3.1.1)
19
+ shoulda-context (~> 1.0)
20
+ shoulda-matchers (~> 1.2)
21
+ shoulda-context (1.0.0)
22
+ shoulda-matchers (1.2.0)
23
+ activesupport (>= 3.0.0)
24
+ test-unit (2.5.2)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ appraisal
31
+ rake
32
+ shoulda
33
+ shoulda-change_matchers!
34
+ test-unit (>= 2.5.1)
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'appraisal'
2
+ require 'bundler/gem_tasks'
3
+
4
+ task :test do
5
+ sh "ruby test/shoulda_change_matchers_test.rb"
6
+ end
7
+
8
+ task :default do
9
+ sh "bundle exec rake appraisal:install && bundle exec rake appraisal test"
10
+ end
data/Readme.md ADDED
@@ -0,0 +1,43 @@
1
+ should_change / should_create / should_destroy matchers for shoulda 3 backported from shoulda 2<br/>
2
+ so you can upgrade to shoulda 3 without rewriting major parts of your test-base.
3
+
4
+ gem install shoulda-change_matchers
5
+
6
+ # Gemfile
7
+ gem "shoulda-let", :require => "shoulda/change_matchers"
8
+
9
+ Usage
10
+ =====
11
+
12
+ <!-- example -->
13
+ context "creating" do
14
+ setup do
15
+ User.create!
16
+ User.create!
17
+ end
18
+
19
+ should_change("the number of users", :by => 2) { User.count }
20
+ end
21
+
22
+ context "doing nothing" do
23
+ should_not_change("the number of users") { User.count }
24
+ end
25
+
26
+ context "creating" do
27
+ setup{ User.create! }
28
+ should_create :user
29
+ end
30
+
31
+ context "destroying" do
32
+ setup{ User.delete_all }
33
+ should_destroy :user
34
+ end
35
+ <!-- example -->
36
+
37
+
38
+ Author
39
+ ======
40
+ [Michael Grosser](http://grosser.it)<br/>
41
+ michael@grosser.it<br/>
42
+ License: MIT<br/>
43
+ [![Build Status](https://secure.travis-ci.org/grosser/shoulda_change_matchers.png)](http://travis-ci.org/grosser/shoulda_change_matchers)
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source :rubygems
4
+
5
+ gem "appraisal"
6
+ gem "rake"
7
+ gem "test-unit", ">=2.5.1"
8
+ gem "shoulda", "~>2.11"
9
+
10
+ gemspec :path=>"../"
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: /Users/mgrosser/code/tools/shoulda-change_matchers
3
+ specs:
4
+ shoulda-change_matchers (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ appraisal (0.4.1)
10
+ bundler
11
+ rake
12
+ rake (0.9.2.2)
13
+ shoulda (2.11.3)
14
+ test-unit (2.5.2)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ appraisal
21
+ rake
22
+ shoulda (~> 2.11)
23
+ shoulda-change_matchers!
24
+ test-unit (>= 2.5.1)
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source :rubygems
4
+
5
+ gem "appraisal"
6
+ gem "rake"
7
+ gem "test-unit", ">=2.5.1"
8
+ gem "shoulda", "~>3.1"
9
+
10
+ gemspec :path=>"../"
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: /Users/mgrosser/code/tools/shoulda-change_matchers
3
+ specs:
4
+ shoulda-change_matchers (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ activesupport (3.2.8)
10
+ i18n (~> 0.6)
11
+ multi_json (~> 1.0)
12
+ appraisal (0.4.1)
13
+ bundler
14
+ rake
15
+ i18n (0.6.0)
16
+ multi_json (1.3.6)
17
+ rake (0.9.2.2)
18
+ shoulda (3.1.1)
19
+ shoulda-context (~> 1.0)
20
+ shoulda-matchers (~> 1.2)
21
+ shoulda-context (1.0.0)
22
+ shoulda-matchers (1.3.0)
23
+ activesupport (>= 3.0.0)
24
+ test-unit (2.5.2)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ appraisal
31
+ rake
32
+ shoulda (~> 3.1)
33
+ shoulda-change_matchers!
34
+ test-unit (>= 2.5.1)
@@ -0,0 +1,165 @@
1
+ require "shoulda"
2
+ require "shoulda/context"
3
+
4
+ module Shoulda
5
+ module ChangeMatchers
6
+ # Macro that creates a test asserting a change between the return value
7
+ # of a block that is run before and after the current setup block
8
+ # is run. This is similar to Active Support's <tt>assert_difference</tt>
9
+ # assertion, but supports more than just numeric values. See also
10
+ # should_not_change.
11
+ #
12
+ # The passed description will be used when generating the test name and failure messages.
13
+ #
14
+ # Example:
15
+ #
16
+ # context "Creating a post" do
17
+ # setup { Post.create }
18
+ # should_change("the number of posts", :by => 1) { Post.count }
19
+ # end
20
+ #
21
+ # As shown in this example, the <tt>:by</tt> option expects a numeric
22
+ # difference between the before and after values of the expression. You
23
+ # may also specify <tt>:from</tt> and <tt>:to</tt> options:
24
+ #
25
+ # should_change("the number of posts", :from => 0, :to => 1) { Post.count }
26
+ # should_change("the post title", :from => "old", :to => "new") { @post.title }
27
+ #
28
+ # Combinations of <tt>:by</tt>, <tt>:from</tt>, and <tt>:to</tt> are allowed:
29
+ #
30
+ # # Assert the value changed in some way:
31
+ # should_change("the post title") { @post.title }
32
+ #
33
+ # # Assert the value changed to anything other than "old:"
34
+ # should_change("the post title", :from => "old") { @post.title }
35
+ #
36
+ # # Assert the value changed to "new:"
37
+ # should_change("the post title", :to => "new") { @post.title }
38
+ #
39
+ # This macro was deprecated because these tests aren't as valuable as
40
+ # alternative tests that explicitly test the final state.
41
+ #
42
+ # Consider an alternative:
43
+ #
44
+ # context "updating a post" do
45
+ # setup do
46
+ # @post = Post.create(:title => "old")
47
+ # put :update, :post => {:title => "new"}, :id => @post.to_param
48
+ # end
49
+ # should "update the title" do
50
+ # assert_equal "new", @post.reload.title
51
+ # end
52
+ # end
53
+ def should_change(description, options = {}, &block)
54
+ by, from, to = shoulda_get_options!([options], :by, :from, :to)
55
+ stmt = "change #{description}"
56
+ stmt << " from #{from.inspect}" if from
57
+ stmt << " to #{to.inspect}" if to
58
+ stmt << " by #{by.inspect}" if by
59
+
60
+ before = lambda { @_before_should_change = block.bind(self).call }
61
+ should stmt, :before => before do
62
+ old_value = @_before_should_change
63
+ new_value = block.bind(self).call
64
+ assert_operator from, :===, old_value, "#{description} did not originally match #{from.inspect}" if from
65
+ assert_not_equal old_value, new_value, "#{description} did not change" unless by == 0
66
+ assert_operator to, :===, new_value, "#{description} was not changed to match #{to.inspect}" if to
67
+ assert_equal old_value + by, new_value if by
68
+ end
69
+ end
70
+
71
+ # Deprecated.
72
+ #
73
+ # Macro that creates a test asserting no change between the return value
74
+ # of a block that is run before and after the current setup block
75
+ # is run. This is the logical opposite of should_change.
76
+ #
77
+ # The passed description will be used when generating the test name and failure message.
78
+ #
79
+ # Example:
80
+ #
81
+ # context "Updating a post" do
82
+ # setup { @post.update_attributes(:title => "new") }
83
+ # should_not_change("the number of posts") { Post.count }
84
+ # end
85
+ #
86
+ # This macro was deprecated because these tests aren't as valuable as
87
+ # alternative tests that explicitly test the final state.
88
+ #
89
+ # Consider an alternative:
90
+ #
91
+ # context "updating a post" do
92
+ # setup do
93
+ # @post = Post.create(:title => "old")
94
+ # put :update, :post => {:title => ""}, :id => @post.to_param
95
+ # end
96
+ # should "not update the title" do
97
+ # assert_equal "old", @post.reload.title
98
+ # end
99
+ # end
100
+ def should_not_change(description, &block)
101
+ before = lambda { @_before_should_not_change = block.bind(self).call }
102
+ should "not change #{description}", :before => before do
103
+ new_value = block.bind(self).call
104
+ assert_equal @_before_should_not_change, new_value, "#{description} changed"
105
+ end
106
+ end
107
+
108
+ # Deprecated.
109
+ #
110
+ # Macro that creates a test asserting that a record of the given class was
111
+ # created.
112
+ #
113
+ # Example:
114
+ #
115
+ # context "creating a post" do
116
+ # setup { Post.create(post_attributes) }
117
+ # should_create :post
118
+ # end
119
+ def should_create(class_name)
120
+ should_change_record_count_of(class_name, 1, 'create')
121
+ end
122
+
123
+ # Deprecated.
124
+ #
125
+ # Macro that creates a test asserting that a record of the given class was
126
+ # destroyed.
127
+ #
128
+ # Example:
129
+ #
130
+ # context "destroying a post" do
131
+ # setup { Post.first.destroy }
132
+ # should_destroy :post
133
+ # end
134
+ def should_destroy(class_name)
135
+ should_change_record_count_of(class_name, -1, 'destroy')
136
+ end
137
+
138
+ private
139
+
140
+ def should_change_record_count_of(class_name, amount, action) # :nodoc:
141
+ klass = class_name.to_s.camelize.constantize
142
+ before = lambda do
143
+ @_before_change_record_count = klass.count
144
+ end
145
+ human_name = class_name.to_s.humanize.downcase
146
+ should "#{action} a #{human_name}", :before => before do
147
+ assert_equal @_before_change_record_count + amount,
148
+ klass.count,
149
+ "Expected to #{action} a #{human_name}"
150
+ end
151
+ end
152
+
153
+ # Returns the values for the entries in the args hash who's keys are listed in the wanted array.
154
+ # Will raise if there are keys in the args hash that aren't listed.
155
+ def shoulda_get_options!(args, *wanted)
156
+ ret = []
157
+ opts = (args.last.is_a?(Hash) ? args.pop : {})
158
+ wanted.each {|w| ret << opts.delete(w)}
159
+ raise ArgumentError, "Unsupported options given: #{opts.keys.join(', ')}" unless opts.keys.empty?
160
+ return wanted.size == 1 ? ret.first : ret
161
+ end
162
+ end
163
+ end
164
+
165
+ Test::Unit::TestCase.send :extend, Shoulda::ChangeMatchers
@@ -0,0 +1,10 @@
1
+ name = "shoulda-change_matchers"
2
+
3
+ Gem::Specification.new name, "0.0.1" do |s|
4
+ s.summary = "should_change / should_create / should_destroy matchers for shoulda 3 backported from shoulda 2"
5
+ s.authors = ["Michael Grosser"]
6
+ s.email = "michael@grosser.it"
7
+ s.homepage = "http://github.com/grosser/#{name}"
8
+ s.files = `git ls-files`.split("\n")
9
+ s.license = "MIT"
10
+ end
@@ -0,0 +1,44 @@
1
+ require "test/unit"
2
+ require "shoulda"
3
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
4
+ #require "shoulda/change_matchers"
5
+
6
+ # simulate active_support being here ...
7
+ class String
8
+ def camelize
9
+ "User"
10
+ end
11
+
12
+ def constantize
13
+ eval self
14
+ end
15
+
16
+ def humanize
17
+ camelize
18
+ end
19
+ end
20
+
21
+ class User
22
+ class << self
23
+ attr_accessor :count
24
+
25
+ def create!
26
+ self.count += 1
27
+ end
28
+
29
+ def delete_all
30
+ self.count = 0
31
+ end
32
+ end
33
+ end
34
+
35
+ class ShouldaLetTest < Test::Unit::TestCase
36
+ setup do
37
+ User.count = 1
38
+ end
39
+
40
+ context "Readme" do
41
+ example = File.read(File.expand_path("../../Readme.md", __FILE__)).match(/<!-- example -->(.*)<!-- example -->/m)[1]
42
+ eval example
43
+ end
44
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shoulda-change_matchers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michael Grosser
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-31 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email: michael@grosser.it
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - .travis.yml
21
+ - Appraisals
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - Rakefile
25
+ - Readme.md
26
+ - gemfiles/shoulda2.gemfile
27
+ - gemfiles/shoulda2.gemfile.lock
28
+ - gemfiles/shoulda3.gemfile
29
+ - gemfiles/shoulda3.gemfile.lock
30
+ - lib/shoulda/change_matchers.rb
31
+ - shoulda-change_matchers.gemspec
32
+ - test/shoulda_change_matchers_test.rb
33
+ homepage: http://github.com/grosser/shoulda-change_matchers
34
+ licenses:
35
+ - MIT
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ segments:
47
+ - 0
48
+ hash: 3014986726780787426
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ segments:
56
+ - 0
57
+ hash: 3014986726780787426
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 1.8.24
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: should_change / should_create / should_destroy matchers for shoulda 3 backported
64
+ from shoulda 2
65
+ test_files: []