greenbar 0.1.1

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/LICENSE ADDED
@@ -0,0 +1,47 @@
1
+ NOTE: this is essentially the same license as Ruby has, without paragraphs
2
+ that do not apply.
3
+
4
+
5
+ Greenbar is copyrighted free software.
6
+ You can redistribute it and/or modify it under the conditions below:
7
+
8
+ 1. You may make and give away verbatim copies of the source form of the
9
+ software without restriction, provided that you duplicate all of the
10
+ original copyright notices and associated disclaimers.
11
+
12
+ 2. You may modify your copy of the software in any way, provided that
13
+ you do at least ONE of the following:
14
+
15
+ a) place your modifications in the Public Domain or otherwise
16
+ make them Freely Available, such as by posting said
17
+ modifications to Usenet or an equivalent medium, or by allowing
18
+ the author to include your modifications in the software.
19
+
20
+ b) use the modified software only within your corporation or
21
+ organization.
22
+
23
+ c) rename any non-standard executables so the names do not conflict
24
+ with standard executables, which must also be provided.
25
+
26
+ d) make other distribution arrangements with the author.
27
+
28
+ 3. You may distribute the software in object code or executable
29
+ form, provided that you do at least ONE of the following:
30
+
31
+ a) distribute the executables and library files of the software,
32
+ together with instructions (in the manual page or equivalent)
33
+ on where to get the original distribution.
34
+
35
+ b) accompany the distribution with the machine-readable source of
36
+ the software.
37
+
38
+ c) give non-standard executables non-standard names, with
39
+ instructions on where to get the original software distribution.
40
+
41
+ d) make other distribution arrangements with the author.
42
+
43
+ 4. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
44
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
45
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
46
+ PURPOSE.
47
+
data/README ADDED
@@ -0,0 +1,33 @@
1
+ = Greenbar -- Test::Unit Tools
2
+
3
+ Greenbar provides aids for testing with Test::Unit.
4
+
5
+ == Download
6
+
7
+ Get the latest version of Greenbar at
8
+
9
+ * http://greenbar.rubyforge.org/downloads.html
10
+
11
+ == Installation
12
+
13
+ === Normal Installation
14
+
15
+ "Standard" installation using ruby install.rb is not yet supported.
16
+
17
+ === GEM Installation
18
+
19
+ Download and install Greenbar with the following.
20
+
21
+ gem install --remote greenbar
22
+
23
+ == Getting Started
24
+ Greenbar provides a framework for re-using setup and teardown code across multiple Test::Unit::TestCases. The key
25
+ to this is the TestSetup module. Greenbar also provides several generally useful TestSetup mix-ins.
26
+
27
+ == Online Resources
28
+
29
+
30
+ == License
31
+
32
+ :include: LICENSE
33
+
@@ -0,0 +1,32 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require_gem 'greenbar'
4
+
5
+
6
+ class UserTest < Test::Unit::TestCase
7
+ include Greenbar::ClassMethodSetup
8
+
9
+ def test_signup
10
+ confirmation_args=
11
+ define_class_method(Mailer, :deliver_confirmation) do |*args|
12
+ confirmation_args = args
13
+ end
14
+ user = User.new('user@test.domain')
15
+ user.signup()
16
+ assert_equal ['user@test.domain'], confirmation_args
17
+ end
18
+ end
19
+
20
+ class User
21
+ def initialize(email)
22
+ @email = email
23
+ end
24
+
25
+ def signup
26
+ Mailer.deliver_confirmation(@email)
27
+ end
28
+ end
29
+
30
+ class Mailer
31
+ # assume that 'deliver_confirmation' is handled by a method_missing method
32
+ end
@@ -0,0 +1,25 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require_gem 'greenbar'
4
+
5
+ class FooTest < Test::Unit::TestCase
6
+ include Greenbar::ClassMethodSetup
7
+
8
+ def test_dot_files
9
+ files= [ '.rails', '.ruby', 'timesheet']
10
+ dirs = [ 'a', 'b', '.', '..', '.bash.d']
11
+ replace_class_method(Dir, :entries) do
12
+ dirs + files
13
+ end
14
+ replace_class_method(File, :directory?) do |file_name|
15
+ dirs.include? file_name
16
+ end
17
+ assert_equal ['.rails', '.ruby'], ConfigFinder.dotFiles('/root')
18
+ end
19
+ end
20
+
21
+ class ConfigFinder
22
+ def self.dotFiles homeDir
23
+ Dir.entries(homeDir).select {|file_name| !File.directory?(file_name) && file_name =~ /^\./}
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require_gem 'greenbar'
4
+
5
+ class DataCounterTest < Test::Unit::TestCase
6
+ include Greenbar::ClassMethodSetup
7
+
8
+ def test_DataCounter
9
+ replace_new(DataService, { ['testhost'] => MockDataService.new })
10
+ assert_equal 5, DataCounter.new.count('testhost')
11
+ end
12
+ end
13
+
14
+ class DataCounter
15
+ def count host
16
+ DataService.new(host).fetch.length
17
+ end
18
+ end
19
+
20
+ # assume fetch accesses a remote system, normally
21
+ class DataService
22
+ def fetch
23
+ end
24
+ end
25
+
26
+ class MockDataService
27
+ def fetch
28
+ "x,y,z"
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require_gem 'greenbar'
3
+
4
+ require 'test/unit'
5
+
6
+ class DateDueCalculatorTest < Test::Unit::TestCase
7
+ include Greenbar::DateSetup
8
+
9
+ def test_calculate_date_due
10
+ Date.today = Date.civil(2006, 4, 15)
11
+ calculator = DateDueCalculator.new
12
+ assert_equal Date.civil(2006, 4, 22), calculator.calculate_due_date(Movie.new(:standard))
13
+ assert_equal Date.civil(2006, 4, 19), calculator.calculate_due_date(Movie.new(:hotflick))
14
+ end
15
+ end
16
+
17
+ class Movie
18
+ def initialize group
19
+ @group = group
20
+ end
21
+
22
+ def checkout_duration
23
+ return 4 if @group == :hotflick
24
+ return 7
25
+ end
26
+ end
27
+
28
+ class DateDueCalculator
29
+ def calculate_due_date movie
30
+ Date.today + movie.checkout_duration
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require_gem 'greenbar'
3
+
4
+ require 'test/unit'
5
+
6
+ class HomeFinderTest < Test::Unit::TestCase
7
+ include Greenbar::EnvSetup
8
+
9
+ def setup
10
+ @finder = HomeFinder.new
11
+ end
12
+
13
+ def test_find_home
14
+ ENV['APP_HOME'] = '/usr/lib/app'
15
+
16
+ assert_equal '/usr/lib/app', @finder.find_home
17
+ end
18
+
19
+ def test_find_home_default
20
+ assert_equal '/usr/local/lib/app', @finder.find_home
21
+ end
22
+ end
23
+
24
+ class HomeFinder
25
+ def find_home
26
+ ENV['APP_HOME'] || '/usr/local/lib/app'
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require_gem 'greenbar'
3
+
4
+ require 'test/unit'
5
+
6
+ class DieTest < Test::Unit::TestCase
7
+ include Greenbar::RandSetup
8
+
9
+ def test_roll_one_die
10
+ seed_rand_sequence 6, [5, 1, 3, 2]
11
+ die = Die.new
12
+ assert_equal 5, die.roll(6)
13
+ assert_equal 1, die.roll(6)
14
+ assert_equal 3, die.roll(6)
15
+ assert_equal 2, die.roll(6)
16
+ assert_equal 5, die.roll(6)
17
+ end
18
+ end
19
+
20
+ class Die
21
+ def roll size
22
+ rand(size)
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ require 'rubygems'
2
+ require_gem 'greenbar'
3
+
4
+ require 'test/unit'
5
+
6
+ module BarSetup
7
+ include Greenbar::TestSetup
8
+ def setup_mixin
9
+ @original_bar = $bar
10
+ end
11
+
12
+ def teardown_mixin
13
+ $bar = @original_bar
14
+ end
15
+ end
16
+
17
+ class Foo
18
+ def bar
19
+ $bar
20
+ end
21
+ end
22
+
23
+ class FooTest < Test::Unit::TestCase
24
+ include BarSetup
25
+
26
+ def setup
27
+ $bar = 'xyzzy'
28
+ end
29
+
30
+ def test_foo
31
+ assert_equal 'xyzzy', Foo.new.bar
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+ require_gem 'greenbar'
3
+
4
+ require 'test/unit'
5
+
6
+ class WebServiceTest < Test::Unit::TestCase
7
+ include Greenbar::TimeSetup
8
+
9
+ def test_expires
10
+ Time.now = Time.local(2006, 4, 16, 15, 23)
11
+ response = WebService.new.handle_request
12
+ assert_equal Time.local(2006, 4, 16, 16, 23), response.expires_at
13
+ end
14
+ end
15
+
16
+ class Response
17
+ def initialize expires_at
18
+ @expires_at = expires_at
19
+ end
20
+ attr_reader :expires_at
21
+ end
22
+
23
+ class WebService
24
+ def handle_request
25
+ Response.new Time.now + 60 * 60
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ module Greenbar
2
+ private
3
+ def self.lazyLoad symbol
4
+ autoload symbol, 'greenbar/' + symbol.to_s
5
+ end
6
+ lazyLoad :TestSetup
7
+ lazyLoad :EnvSetup
8
+ lazyLoad :RandSetup
9
+ lazyLoad :TimeSetup
10
+ lazyLoad :ClassMethodSetup
11
+ lazyLoad :DateSetup
12
+
13
+ end
14
+
15
+ # :stopdoc:
16
+ # this rails-related hack doesn't fit normal usage
17
+ require 'greenbar/RailsSetup'
@@ -0,0 +1,133 @@
1
+ #:stopdoc:
2
+ # Copyright 2005, 2006 Enttek, Inc, All Rights Reserved
3
+ # Copyright 2005, 2006 Kiel Hodges, All Rights Reserved
4
+ # Copyright 2005, 2006 David Corbin <dcorbin@users.sourceforge.net>, All Rights Reserved
5
+ #
6
+ # This software may be copied and used only in accordance with the
7
+ # terms provided in the include LICENSE file. If no such file is included
8
+ # then please contact the authors of the Greenbar project at
9
+ # http://rubyforge.org/projects/greenbar/
10
+ #
11
+ require 'greenbar/TestSetup'
12
+
13
+ class Module
14
+ public :define_method
15
+
16
+ def metaclass
17
+ class << self
18
+ return self
19
+ end
20
+ end
21
+
22
+ def alias_class_method new_name, old_name
23
+ metaclass.instance_eval {
24
+ alias_method new_name, old_name
25
+ }
26
+ end
27
+
28
+ def remove_class_method method_name
29
+ metaclass.instance_eval {
30
+ remove_method method_name
31
+ }
32
+ end
33
+ end
34
+ #:startdoc:
35
+ #
36
+ # ===Purpose
37
+ #
38
+ # Sometimes it is very convenient to replace (or even provide)
39
+ # an alternative implementation of a method in class A to aid
40
+ # in testing class B. ClassMethodSetup allows you to do this
41
+ # easily, and restores the original method implementation on
42
+ # completion.
43
+ #
44
+ # ===Usage
45
+ #
46
+ # 1. Include Greenbar::ClassMethodSetup in your test case.
47
+ # 2. Use replace_class_method, define_class_method, or replace_new
48
+ # as needed.
49
+ #
50
+ # You may change 'today' as often as you want.
51
+ #
52
+ # ===Examples
53
+ #
54
+ # ====for define_class_method
55
+ #
56
+ # :include: doc/examples/ClassMethodSetup_define_class_method.rb
57
+ #
58
+ # ====for replace_class_method
59
+ #
60
+ # :include: doc/examples/ClassMethodSetup_replace_class_method.rb
61
+ #
62
+ # ====for replace_new
63
+ #
64
+ # :include: doc/examples/ClassMethodSetup_replace_new.rb
65
+ #
66
+ #
67
+ module Greenbar::ClassMethodSetup
68
+ include Greenbar::TestSetup
69
+
70
+ def setup_mixin #:nodoc:
71
+ @class_methods_to_restore = []
72
+ @class_methods_to_remove = []
73
+ end
74
+
75
+ def teardown_mixin #:nodoc:
76
+ @class_methods_to_restore.each {|target_class, method_name|
77
+ target_class.alias_class_method method_name, name_of_copied_method(method_name)
78
+ }
79
+
80
+ @class_methods_to_remove.each {|target_class, method_name|
81
+ target_class.remove_class_method method_name
82
+ }
83
+ end
84
+
85
+ # Replaces a class method _method_name_ on class _target_class_. The implementation
86
+ # will be the _block_, and may take any number of arguments. The original method
87
+ # will be restored automatically. The primary purpose for this method is when you
88
+ # need to provide a mock implementation of some class_method.
89
+ #
90
+ def replace_class_method target_class, method_name, &block
91
+ @class_methods_to_restore << [target_class, method_name]
92
+ target_class.alias_class_method name_of_copied_method(method_name), method_name
93
+ target_class.metaclass.define_method method_name, &block
94
+ end
95
+
96
+ # Defines a new class method _method_name_ on class _target_class_. The implementation
97
+ # will be the _block_, and may take any number of arguments. The method
98
+ # will be destroyed automatically at the end of the test.
99
+ # The primary purpose for this method is when you
100
+ # need to provide a mock implementation of a method that is usually handled by
101
+ # method_missing implementation
102
+ #
103
+ def define_class_method target_class, method_name, &block
104
+ @class_methods_to_remove << [target_class, method_name]
105
+ target_class.metaclass.define_method method_name, &block
106
+ end
107
+
108
+ # Replaces the new method on class _target_class_.
109
+ #
110
+ # In the canonical form, _results_ should will respond to to_hash.
111
+ # The hash is keyed by arrays that match the expected arguments to the new method.
112
+ # the hash value is the object to return for that set of arguments.
113
+ #
114
+ # If _results_ does not respond to to_hash, is is assumed to be the desired
115
+ # return value for a no-argument call to new.
116
+ #
117
+ def replace_new target_class, results
118
+ argument_instance_map = results.respond_to?(:to_hash) ? results.to_hash : { [] => results }
119
+
120
+ replace_class_method(target_class, :new) {|*args|
121
+ return argument_instance_map[args] if argument_instance_map.has_key? args
122
+ raise "No instance has been set to return from #{target_class}.new for #{args.inspect}."
123
+ }
124
+ end
125
+
126
+
127
+ private
128
+
129
+ def name_of_copied_method(method_name)
130
+ 'original_' + method_name.to_s
131
+ end
132
+
133
+ end