minitest-spec-magic 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ require 'minitest/spec/magic'
2
+
@@ -0,0 +1,46 @@
1
+ require 'minitest/spec'
2
+ require 'test/unit/testcase'
3
+
4
+ # Define the main module
5
+ module MiniTest::Spec::Magic
6
+ end
7
+
8
+ require 'minitest/spec/magic/context'
9
+ require 'minitest/spec/magic/expectations'
10
+ require 'minitest/spec/magic/assertions'
11
+
12
+ # Extend Test::Unit::TestCase
13
+ class Test::Unit::TestCase
14
+ extend MiniTest::Spec::Magic::Context
15
+ include MiniTest::Spec::Magic::Expectations
16
+ include MiniTest::Spec::Magic::Assertions
17
+ end
18
+
19
+ # Add magic for ActionController::TestCase
20
+ if defined?(ActionController)
21
+ require 'minitest/spec/magic/controller'
22
+
23
+ class ActionController::TestCase
24
+ extend MiniTest::Spec::Magic::Controller
25
+ subject { @controller }
26
+ end
27
+ end
28
+
29
+ # Filter backtrace with Rails.backtrace_cleaner (Rails pre 3.1.2 only)
30
+ # Shamelessly "stolen" from https://github.com/metaskills/mini_backtrace
31
+ if defined?(::Rails) && Rails::VERSION::STRING < '3.1.2' && !MiniTest.method_defined?(:filter_backtrace_with_rails)
32
+
33
+ module MiniTest
34
+ class << self
35
+
36
+ def filter_backtrace_with_rails(bt)
37
+ filter_backtrace_without_rails Rails.backtrace_cleaner.clean(bt)
38
+ end
39
+
40
+ alias :filter_backtrace_without_rails :filter_backtrace
41
+ alias :filter_backtrace :filter_backtrace_with_rails
42
+
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,96 @@
1
+ # Shamelessly "stolen" from https://github.com/thoughtbot/shoulda-context
2
+ #
3
+ # Adds the following expectations to MiniTest:
4
+ #
5
+ # array.must_be_same_as(other) # => see #assert_same_elements
6
+ # array.must_contain(item) # => see #assert_contains
7
+ # array.wont_contain(item) # => see #assert_does_not_contain
8
+ #
9
+ module MiniTest::Spec::Magic::Assertions
10
+
11
+ def self.included(*)
12
+ MiniTest::Expectations.tap do |x|
13
+ x.infect_an_assertion :assert_contains, :must_contain, :reverse
14
+ x.infect_an_assertion :assert_does_not_contain, :wont_contain, :reverse
15
+ x.infect_an_assertion :assert_same_elements, :must_be_same_as
16
+ end
17
+ super
18
+ end
19
+
20
+ # Asserts that two arrays contain the same elements, the same number of times. Essentially ==, but unordered.
21
+ #
22
+ # assert_same_elements([:a, :b, :c], [:c, :a, :b]) => passes
23
+ def assert_same_elements(a1, a2, msg = nil)
24
+ [:select, :inject, :size].each do |m|
25
+ [a1, a2].each {|a| assert_respond_to(a, m, "Are you sure that #{a.inspect} is an array? It doesn't respond to #{m}.") }
26
+ end
27
+
28
+ assert a1h = a1.inject({}) { |h,e| h[e] = a1.select { |i| i == e }.size; h }
29
+ assert a2h = a2.inject({}) { |h,e| h[e] = a2.select { |i| i == e }.size; h }
30
+
31
+ assert_equal(a1h, a2h, msg)
32
+ end
33
+
34
+ # Asserts that the given collection contains item x. If x is a regular expression, ensure that
35
+ # at least one element from the collection matches x. +extra_msg+ is appended to the error message if the assertion fails.
36
+ #
37
+ # assert_contains(['a', '1'], /\d/) => passes
38
+ # assert_contains(['a', '1'], 'a') => passes
39
+ # assert_contains(['a', '1'], /not there/) => fails
40
+ def assert_contains(collection, x, extra_msg = "")
41
+ collection = [collection] unless collection.is_a?(Array)
42
+ msg = "#{x.inspect} not found in #{collection.to_a.inspect} #{extra_msg}"
43
+ case x
44
+ when Regexp
45
+ assert(collection.detect { |e| e =~ x }, msg)
46
+ else
47
+ assert(collection.include?(x), msg)
48
+ end
49
+ end
50
+
51
+ # Asserts that the given collection does not contain item x. If x is a regular expression, ensure that
52
+ # none of the elements from the collection match x.
53
+ def assert_does_not_contain(collection, x, extra_msg = "")
54
+ collection = [collection] unless collection.is_a?(Array)
55
+ msg = "#{x.inspect} found in #{collection.to_a.inspect} " + extra_msg
56
+ case x
57
+ when Regexp
58
+ assert(!collection.detect { |e| e =~ x }, msg)
59
+ else
60
+ assert(!collection.include?(x), msg)
61
+ end
62
+ end
63
+
64
+ # Asserts that the given matcher returns true when +target+ is passed to #matches?
65
+ def assert_accepts(matcher, target, options = {})
66
+ if matcher.respond_to?(:in_context)
67
+ matcher.in_context(self)
68
+ end
69
+
70
+ if matcher.matches?(target)
71
+ assert_block { true }
72
+ if options[:message]
73
+ assert_match options[:message], matcher.negative_failure_message
74
+ end
75
+ else
76
+ assert_block(matcher.failure_message) { false }
77
+ end
78
+ end
79
+
80
+ # Asserts that the given matcher returns false when +target+ is passed to #matches?
81
+ def assert_rejects(matcher, target, options = {})
82
+ if matcher.respond_to?(:in_context)
83
+ matcher.in_context(self)
84
+ end
85
+
86
+ unless matcher.matches?(target)
87
+ assert_block { true }
88
+ if options[:message]
89
+ assert_match options[:message], matcher.failure_message
90
+ end
91
+ else
92
+ assert_block(matcher.negative_failure_message) { false }
93
+ end
94
+ end
95
+
96
+ end
@@ -0,0 +1,22 @@
1
+ module MiniTest::Spec::Magic::Context
2
+
3
+ # Returns the test context. Example:
4
+ #
5
+ # class UserTest < ActiveSupport::TestCase
6
+ # self.described_type # => User
7
+ #
8
+ # describe "something" do
9
+ # self.described_type # => User, here too
10
+ # end
11
+ # end
12
+ #
13
+ # @return [Class] the described type
14
+ def described_type
15
+ @described_type ||= begin
16
+ klass = self
17
+ klass = klass.superclass while klass && klass.name !~ /Test$/
18
+ klass.name.sub(/Test$/, '').constantize if klass
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,10 @@
1
+ module MiniTest::Spec::Magic::Controller
2
+
3
+ # @override fallback on described_type
4
+ def determine_default_controller_class(name)
5
+ name.sub(/Test$/, '').constantize
6
+ rescue NameError
7
+ described_type
8
+ end
9
+
10
+ end
@@ -0,0 +1,63 @@
1
+ module MiniTest::Spec::Magic::Expectations
2
+
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ super
6
+ end
7
+
8
+
9
+ # Tests a matcher for validity. Example:
10
+ #
11
+ # class UserTest < ActiveSupport::TestCase
12
+ # it { should validate_presesence_of(:email) }
13
+ # end
14
+ #
15
+ # @param [Matcher] matcher the matcher to test
16
+ def should(matcher)
17
+ assert_accepts matcher, subject
18
+ end
19
+
20
+ # Tests a matcher for negative validity. Example:
21
+ #
22
+ # class UserTest < ActiveSupport::TestCase
23
+ # it { should_not validate_presesence_of(:email) }
24
+ # end
25
+ #
26
+ # @param [Matcher] matcher the matcher to test
27
+ def should_not(matcher)
28
+ assert_rejects matcher, subject
29
+ end
30
+
31
+ module ClassMethods
32
+
33
+ # Accepts either a matcher or a message with a block. Example:
34
+ #
35
+ # class UserTest < ActiveSupport::TestCase
36
+ #
37
+ # should validate_presesence_of(:email)
38
+ #
39
+ # should "be valid" do
40
+ # subject.must_be :valid?
41
+ # end
42
+ #
43
+ # end
44
+ #
45
+ # @param [Matcher|String] expectation either a matcher or a message
46
+ def should(expectation, &block)
47
+ message = if expectation.respond_to?(:description)
48
+ block = lambda { should expectation }
49
+ expectation.description
50
+ else
51
+ expectation
52
+ end
53
+ it "should #{message}", &block
54
+ end
55
+
56
+ # @param [Matcher] matcher a matcher
57
+ def should_not(matcher)
58
+ block = lambda { should_not matcher }
59
+ it "should not #{matcher.description}", &block
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,19 @@
1
+ # Define Test::Unit::TestCase as a subclass of MiniTest::Spec
2
+ # Partially "stolen" from https://github.com/metaskills/mini_specunit
3
+ module Test
4
+ module Unit
5
+ class TestCase < ::MiniTest::Spec
6
+
7
+ # Ensure ActiveSupport::TestCase::Declarative doesn't override MiniTest::Spec's `describe`
8
+ def self.method_defined?(sym, *args)
9
+ sym.to_sym == :describe || super
10
+ end
11
+
12
+ def build_message(head, template=nil, *arguments)
13
+ template &&= template.chomp
14
+ template.gsub(/\?/) { arguments.shift.inspect.chomp }
15
+ end
16
+
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minitest-spec-magic
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dimitrij Denissenko
9
+ - Ken Collins
10
+ - thoughtbot, inc.
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2011-10-26 00:00:00.000000000Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: minitest
18
+ requirement: &10169260 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 2.6.0
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *10169260
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: &10168760 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *10168760
38
+ - !ruby/object:Gem::Dependency
39
+ name: bundler
40
+ requirement: &10167780 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *10167780
49
+ description: Combines Minitest::Spec with shoulda-like goodies
50
+ email: dimitrij@blacksquaremedia.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - lib/test/unit/testcase.rb
56
+ - lib/minitest/spec/magic/controller.rb
57
+ - lib/minitest/spec/magic/context.rb
58
+ - lib/minitest/spec/magic/expectations.rb
59
+ - lib/minitest/spec/magic/assertions.rb
60
+ - lib/minitest/spec/magic.rb
61
+ - lib/minitest-spec-magic.rb
62
+ homepage: https://github.com/bsm/minitest-spec-magic
63
+ licenses: []
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: 1.8.7
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: 1.6.0
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 1.8.10
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Minitest::Spec extensions for Rails and beyond
86
+ test_files: []