minitest-hooks 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6a0a8293b0c8dbbad1e27c3d3e6cb9bf92fc59a3
4
+ data.tar.gz: 56adcfa31aaaea60a526c44f092216d315ffa082
5
+ SHA512:
6
+ metadata.gz: ade327c7055a6f152143ad1f8f6d20d7142c43cfc54f76f2a281c99cd00df52751f81abf301b74c5ce14c7382d13afa7a9d7038d5d7669bc200f68ebfe23ba64
7
+ data.tar.gz: b4020676c1ce37af3cd6f2903c1455c44cef0229365a08f83caa93832134a3b29aa21724ddfa682bf38bd09642f80495127a135e17601ad08b4eb76b7726035b
@@ -0,0 +1,3 @@
1
+ === 1.0.0 (2015-04-26)
2
+
3
+ * Initial Public Release
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2015 Jeremy Evans
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,95 @@
1
+ = minitest-hooks
2
+
3
+ minitest-hooks adds around and before_all/after_all/around_all hooks for Minitest.
4
+ This allows you do things like run each suite of specs inside a database transaction,
5
+ running each spec inside its own savepoint inside that transaction, which can
6
+ significantly speed up testing for specs that share expensive database setup code.
7
+
8
+ = Installation
9
+
10
+ gem install enum_csv
11
+
12
+ = Source Code
13
+
14
+ Source code is available on GitHub at https://github.com/jeremyevans/minitest-hooks
15
+
16
+ = Usage
17
+
18
+ == Using the library
19
+
20
+ === For all specs
21
+
22
+ require 'minitest/hooks/default'
23
+
24
+ === For some specs
25
+
26
+ First, you need to require the library.
27
+
28
+ require 'minitest/hooks'
29
+
30
+ Or you can set the default for some specs to be <tt>Minitest::HooksSpec</tt>:
31
+
32
+ MiniTest::Spec.register_spec_type(/something/, Minitest::HooksSpec)
33
+
34
+ Alternatively, you can include <tt>Minitest::Hooks</tt> in a specific spec class:
35
+
36
+ describe 'something' do
37
+ include Minitest::Hooks
38
+ end
39
+
40
+ But if you do this, you need to make sure that any +around+ and +around_all+
41
+ methods defined in the class itself call +yield+ instead of +super+.
42
+
43
+ == before_all Hooks
44
+
45
+ To run code before any specs in the suite are executed, pass +:all+ to +before+:
46
+
47
+ describe 'something' do
48
+ before(:all) do
49
+ DB[:table].insert(:column=>1)
50
+ end
51
+ end
52
+
53
+ == after_all Hooks
54
+
55
+ To run code after all specs in the suite are executed, pass +:all+ to +after+:
56
+
57
+ describe 'something' do
58
+ after(:all) do
59
+ DB[:table].delete
60
+ end
61
+ end
62
+
63
+ == around Hooks
64
+
65
+ To run code around each spec in a suite, define the +around+ method and have it
66
+ call +super+:
67
+
68
+ describe 'something' do
69
+ def around
70
+ DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true) do
71
+ super
72
+ end
73
+ end
74
+ end
75
+
76
+ == around_all Hooks
77
+
78
+ To run code around all specs in a suite, define the +around_all+ method and have
79
+ it call +super+:
80
+
81
+ describe 'something' do
82
+ def around_all
83
+ DB.transaction(:rollback=>:always) do
84
+ super
85
+ end
86
+ end
87
+ end
88
+
89
+ = License
90
+
91
+ MIT
92
+
93
+ = Author
94
+
95
+ Jeremy Evans <code@jeremyevans.net>
@@ -0,0 +1,46 @@
1
+ require "rake"
2
+ require "rake/clean"
3
+ require 'rake/testtask'
4
+
5
+ CLEAN.include ["enum_csv-*.gem", "rdoc", "coverage"]
6
+
7
+ desc "Build minitest-hooks gem"
8
+ task :package=>[:clean] do |p|
9
+ sh %{#{FileUtils::RUBY} -S gem build minitest-hooks.gemspec}
10
+ end
11
+
12
+ ### Specs
13
+
14
+ desc "Run specs"
15
+ task :spec do
16
+ sh %{#{FileUtils::RUBY} -I lib spec/minitest_hooks_spec.rb}
17
+ end
18
+
19
+ task :default=>:spec
20
+
21
+ ### RDoc
22
+
23
+ RDOC_DEFAULT_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', 'minitest-hooks: around and before_all/after_all/around_all hooks for Minitest']
24
+
25
+ begin
26
+ gem 'hanna-nouveau'
27
+ RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
28
+ rescue Gem::LoadError
29
+ end
30
+
31
+ rdoc_task_class = begin
32
+ require "rdoc/task"
33
+ RDoc::Task
34
+ rescue LoadError
35
+ require "rake/rdoctask"
36
+ Rake::RDocTask
37
+ end
38
+
39
+ RDOC_OPTS = RDOC_DEFAULT_OPTS + ['--main', 'README.rdoc']
40
+
41
+ rdoc_task_class.new do |rdoc|
42
+ rdoc.rdoc_dir = "rdoc"
43
+ rdoc.options += RDOC_OPTS
44
+ rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb"
45
+ end
46
+
@@ -0,0 +1,107 @@
1
+ require 'minitest/spec'
2
+
3
+ # Add support for around and before_all/after_all/around_all hooks to
4
+ # minitest spec classes.
5
+ module Minitest::Hooks
6
+ # Add the class methods to the class. Also, include an additional
7
+ # module in the class that before(:all) and after(:all) methods
8
+ # work on a class that directly includes this module.
9
+ def self.included(mod)
10
+ super
11
+ mod.instance_exec do
12
+ include(@hooks_module ||= Module.new)
13
+ extend(Minitest::Hooks::ClassMethods)
14
+ end
15
+ end
16
+
17
+ # Empty method, necessary so that super calls in spec subclasses work.
18
+ def before_all
19
+ end
20
+
21
+ # Empty method, necessary so that super calls in spec subclasses work.
22
+ def after_all
23
+ end
24
+
25
+ # Method that just yields, so that super calls in spec subclasses work.
26
+ def around_all
27
+ yield
28
+ end
29
+
30
+ # Method that just yields, so that super calls in spec subclasses work.
31
+ def around
32
+ yield
33
+ end
34
+
35
+ # Run around hook inside, since time_it is run around every spec.
36
+ def time_it
37
+ super do
38
+ around do
39
+ yield
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ module Minitest::Hooks::ClassMethods
46
+ # Object used to get an empty new instance, as new by default will return
47
+ # a dup of the singleton instance.
48
+ NEW = Object.new.freeze
49
+
50
+ # Unless name is NEW, return a dup singleton instance.
51
+ def new(name)
52
+ if name.equal?(NEW)
53
+ return super
54
+ end
55
+
56
+ instance = @instance.dup
57
+ instance.name = name
58
+ instance.failures = []
59
+ instance
60
+ end
61
+
62
+ # When running the specs in the class, first create a singleton instance, the singleton is
63
+ # used to implement around_all/before_all/after_all hooks, and each spec will run as a
64
+ # dup of the singleton instance.
65
+ def run(reporter, options={})
66
+ r = nil
67
+ @instance = new(NEW)
68
+
69
+ @instance.around_all do
70
+ @instance.before_all
71
+ r = super
72
+ @instance.after_all
73
+ end
74
+ r
75
+ end
76
+
77
+ # If type is :all, set the before_all hook instead of the before hook.
78
+ def before(type=nil, &block)
79
+ if type == :all
80
+ (defined?(@hooks_module) ? @hooks_module : self).send(:define_method, :before_all) do
81
+ super()
82
+ instance_exec(&block)
83
+ end
84
+ nil
85
+ else
86
+ super
87
+ end
88
+ end
89
+
90
+ # If type is :all, set the after_all hook instead of the after hook.
91
+ def after(type=nil, &block)
92
+ if type == :all
93
+ (defined?(@hooks_module) ? @hooks_module : self).send(:define_method, :after_all) do
94
+ instance_exec(&block)
95
+ super()
96
+ end
97
+ nil
98
+ else
99
+ super
100
+ end
101
+ end
102
+ end
103
+
104
+ # Spec subclass that includes the hook methods.
105
+ class Minitest::HooksSpec < Minitest::Spec
106
+ include Minitest::Hooks
107
+ end
@@ -0,0 +1,3 @@
1
+ require 'minitest/hooks'
2
+
3
+ MiniTest::Spec.register_spec_type(//, Minitest::HooksSpec)
@@ -0,0 +1,111 @@
1
+ require 'rubygems'
2
+ require 'sequel'
3
+ require 'minitest/autorun'
4
+ require 'minitest/hooks/default'
5
+ require 'logger'
6
+
7
+ DB = Sequel.connect(ENV['DATABASE_URL'] || 'sqlite:/')
8
+
9
+ describe 'Minitest::Hooks with transactions/savepoints' do
10
+ before(:all) do
11
+ @ds_ba = @ds_aa
12
+ @ds_ba.count.must_equal 1 + @i
13
+ end
14
+ before do
15
+ @ds_be = @ds_ae
16
+ @ds_be.count.must_equal 2 + @i * 2
17
+ end
18
+ after do
19
+ @ds_be.count.must_equal 2 + @i * 2
20
+ end
21
+ after(:all) do
22
+ @ds_ba.count.must_equal 1 + @i
23
+ end
24
+ def around
25
+ @ds_aa.count.must_equal 1 + @i
26
+ DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true) do
27
+ @ds_ae = @ds_aa
28
+ @ds_ae.insert(1)
29
+ super
30
+ end
31
+ @ds_aa.count.must_equal 1 + @i
32
+ end
33
+ def around_all
34
+ @i ||= 0
35
+ DB.transaction(:rollback=>:always) do
36
+ DB.create_table(:a){Integer :a}
37
+ @ds_aa = DB[:a]
38
+ @ds_aa.count.must_equal 0
39
+ @ds_aa.insert(1)
40
+ super
41
+ end
42
+ DB.table_exists?(:a).must_equal false
43
+ end
44
+
45
+ 3.times do |i|
46
+ it "should work try #{i}" do
47
+ @ds_aa.count.must_equal 2
48
+ @ds_ae.count.must_equal 2
49
+ @ds_ba.count.must_equal 2
50
+ @ds_be.count.must_equal 2
51
+ end
52
+ end
53
+
54
+ describe "in nested describe" do
55
+ before(:all) do
56
+ @ds_ba3 = @ds_ba
57
+ @ds_ba2 = @ds_aa2
58
+ @ds_ba2.count.must_equal 2
59
+ end
60
+ before do
61
+ @ds_be3 = @ds_be
62
+ @ds_be2 = @ds_ae2
63
+ @ds_be2.count.must_equal 4
64
+ end
65
+ after do
66
+ @ds_be2.count.must_equal 4
67
+ end
68
+ after(:all) do
69
+ @ds_ba2.count.must_equal 2
70
+ end
71
+ def around
72
+ @ds_aa.count.must_equal 2
73
+ super do
74
+ @ds_aa.count.must_equal 3
75
+ @ds_ae3 = @ds_ae
76
+ @ds_ae2 = @ds_aa2
77
+ @ds_ae2.insert(1)
78
+ yield
79
+ @ds_aa.count.must_equal 4
80
+ end
81
+ @ds_aa.count.must_equal 2
82
+ end
83
+ def around_all
84
+ @i ||= 1
85
+ super do
86
+ @ds_aa.count.must_equal 1
87
+ @ds_aa2 = @ds_aa
88
+ @ds_aa2.insert(1)
89
+ yield
90
+ @ds_aa.count.must_equal 2
91
+ end
92
+ DB.table_exists?(:a).must_equal false
93
+ end
94
+
95
+ 3.times do |i|
96
+ it "should work try #{i}" do
97
+ @ds_aa.count.must_equal 4
98
+ @ds_ae.count.must_equal 4
99
+ @ds_ba.count.must_equal 4
100
+ @ds_be.count.must_equal 4
101
+ @ds_aa2.count.must_equal 4
102
+ @ds_ae2.count.must_equal 4
103
+ @ds_ba2.count.must_equal 4
104
+ @ds_be2.count.must_equal 4
105
+ @ds_ae3.count.must_equal 4
106
+ @ds_ba3.count.must_equal 4
107
+ @ds_be3.count.must_equal 4
108
+ end
109
+ end
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minitest-hooks
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jeremy Evans
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: '5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sequel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">"
32
+ - !ruby/object:Gem::Version
33
+ version: '4'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">"
39
+ - !ruby/object:Gem::Version
40
+ version: '4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: |
56
+ minitest-hooks adds around and before_all/after_all/around_all hooks for Minitest.
57
+ This allows you do things like run each suite of specs inside a database transaction,
58
+ running each spec inside its own savepoint inside that transaction, which can
59
+ significantly speed up testing for specs that share expensive database setup code.
60
+ email: code@jeremyevans.net
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files:
64
+ - README.rdoc
65
+ - CHANGELOG
66
+ - MIT-LICENSE
67
+ files:
68
+ - CHANGELOG
69
+ - MIT-LICENSE
70
+ - README.rdoc
71
+ - Rakefile
72
+ - lib/minitest/hooks.rb
73
+ - lib/minitest/hooks/default.rb
74
+ - spec/minitest_hooks_spec.rb
75
+ homepage: http://github.com/jeremyevans/minitest_hooks
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options:
81
+ - "--quiet"
82
+ - "--line-numbers"
83
+ - "--inline-source"
84
+ - "--title"
85
+ - 'minitest-hooks: around and before_all/after_all/around_all hooks for Minitest'
86
+ - "--main"
87
+ - README.rdoc
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.4.5
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: Around and before_all/after_all/around_all hooks for Minitest
106
+ test_files: []