bret-watircraft 0.4.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.
Files changed (83) hide show
  1. data/BUGS.txt +11 -0
  2. data/History.txt +209 -0
  3. data/Manifest.txt +103 -0
  4. data/README.rdoc +75 -0
  5. data/VERSION.yml +4 -0
  6. data/app_generators/watircraft/USAGE +11 -0
  7. data/app_generators/watircraft/templates/config.yml.erb +3 -0
  8. data/app_generators/watircraft/templates/feature_helper.rb +12 -0
  9. data/app_generators/watircraft/templates/initialize.rb.erb +10 -0
  10. data/app_generators/watircraft/templates/rakefile.rb +3 -0
  11. data/app_generators/watircraft/templates/script/console +5 -0
  12. data/app_generators/watircraft/templates/script/console.cmd +1 -0
  13. data/app_generators/watircraft/templates/site_start.rb.erb +12 -0
  14. data/app_generators/watircraft/templates/spec_helper.rb +9 -0
  15. data/app_generators/watircraft/templates/spec_initialize.rb +16 -0
  16. data/app_generators/watircraft/templates/world.rb +12 -0
  17. data/app_generators/watircraft/watircraft_generator.rb +108 -0
  18. data/bin/watircraft +17 -0
  19. data/lib/extensions/array.rb +10 -0
  20. data/lib/extensions/hash.rb +5 -0
  21. data/lib/extensions/object.rb +24 -0
  22. data/lib/extensions/string.rb +17 -0
  23. data/lib/extensions/watir.rb +41 -0
  24. data/lib/taza/browser.rb +45 -0
  25. data/lib/taza/entity.rb +34 -0
  26. data/lib/taza/fixture.rb +66 -0
  27. data/lib/taza/flow.rb +40 -0
  28. data/lib/taza/page.rb +259 -0
  29. data/lib/taza/settings.rb +80 -0
  30. data/lib/taza/site.rb +227 -0
  31. data/lib/taza/tasks.rb +30 -0
  32. data/lib/taza.rb +35 -0
  33. data/lib/watircraft/generator_helper.rb +27 -0
  34. data/lib/watircraft/table.rb +56 -0
  35. data/lib/watircraft/version.rb +3 -0
  36. data/lib/watircraft.rb +1 -0
  37. data/spec/array_spec.rb +16 -0
  38. data/spec/browser_spec.rb +68 -0
  39. data/spec/entity_spec.rb +9 -0
  40. data/spec/fake_table.rb +34 -0
  41. data/spec/fixture_spec.rb +34 -0
  42. data/spec/fixtures_spec.rb +21 -0
  43. data/spec/hash_spec.rb +12 -0
  44. data/spec/object_spec.rb +29 -0
  45. data/spec/page_generator_spec.rb +111 -0
  46. data/spec/page_spec.rb +342 -0
  47. data/spec/project_generator_spec.rb +103 -0
  48. data/spec/sandbox/config/config.yml +1 -0
  49. data/spec/sandbox/config/environments.yml +4 -0
  50. data/spec/sandbox/config/simpler.yml +1 -0
  51. data/spec/sandbox/config/simpler_site.yml +2 -0
  52. data/spec/sandbox/config.yml +2 -0
  53. data/spec/sandbox/fixtures/examples.yml +8 -0
  54. data/spec/sandbox/fixtures/users.yml +2 -0
  55. data/spec/sandbox/flows/batman.rb +5 -0
  56. data/spec/sandbox/flows/robin.rb +4 -0
  57. data/spec/sandbox/pages/foo/bar_page.rb +9 -0
  58. data/spec/sandbox/pages/foo/partials/partial_the_reckoning.rb +2 -0
  59. data/spec/settings_spec.rb +103 -0
  60. data/spec/site_generator_spec.rb +62 -0
  61. data/spec/site_spec.rb +249 -0
  62. data/spec/spec_generator_helper.rb +40 -0
  63. data/spec/spec_generator_spec.rb +24 -0
  64. data/spec/spec_helper.rb +21 -0
  65. data/spec/steps_generator_spec.rb +29 -0
  66. data/spec/string_spec.rb +17 -0
  67. data/spec/table_spec.rb +32 -0
  68. data/spec/taza_spec.rb +12 -0
  69. data/spec/watircraft_bin_spec.rb +14 -0
  70. data/watircraft.gemspec +53 -0
  71. data/watircraft_generators/page/USAGE +11 -0
  72. data/watircraft_generators/page/page_generator.rb +65 -0
  73. data/watircraft_generators/page/templates/page.rb.erb +8 -0
  74. data/watircraft_generators/site/site_generator.rb +51 -0
  75. data/watircraft_generators/site/templates/environments.yml.erb +4 -0
  76. data/watircraft_generators/site/templates/site.rb.erb +10 -0
  77. data/watircraft_generators/spec/USAGE +8 -0
  78. data/watircraft_generators/spec/spec_generator.rb +54 -0
  79. data/watircraft_generators/spec/templates/spec.rb.erb +17 -0
  80. data/watircraft_generators/steps/USAGE +13 -0
  81. data/watircraft_generators/steps/steps_generator.rb +62 -0
  82. data/watircraft_generators/steps/templates/steps.rb.erb +12 -0
  83. metadata +229 -0
data/lib/taza/site.rb ADDED
@@ -0,0 +1,227 @@
1
+ require 'rubygems'
2
+ require 'activesupport'
3
+ require 'taza/settings'
4
+
5
+ module Taza
6
+ # An abstraction of a website, but more really a container for a sites pages.
7
+ #
8
+ # You can generate a site by performing the following command:
9
+ # $ ./script/generate site google
10
+ #
11
+ # This will generate a site file for google, a flows folder, and a pages folder in lib
12
+ #
13
+ # Example:
14
+ #
15
+ # require 'taza'
16
+ #
17
+ # class Google < Taza::Site
18
+ #
19
+ # end
20
+ class Site
21
+
22
+ # These methods are available for user contexts, including Site itself
23
+ module Methods
24
+ attr_accessor :browser, :site
25
+
26
+ # Return an instance of the specified page. The name
27
+ # Given should be the human-form of the page, without the
28
+ # "page" suffix.
29
+ # If a block is given, it yields to the page.
30
+ def page(page_name, &block)
31
+ method_name = page_name.computerize + '_page'
32
+ send method_name, &block
33
+ end
34
+
35
+ # Send the browser to a url, relative to the site origin.
36
+ def goto relative_url
37
+ destination = File.join(@site.origin, relative_url)
38
+ @browser.goto destination
39
+ end
40
+
41
+ def pages
42
+ @pages || @site.pages
43
+ end
44
+
45
+ end
46
+
47
+ @@before_browser_closes = Proc.new() {}
48
+ # Use this to do something with the browser before it closes, but note that it is a class method which
49
+ # means that this will get called for any instance of a site.
50
+ #
51
+ # Here's an example of how you might use it to print the DOM output of a browser before it closes:
52
+ #
53
+ # Taza::Site.before_browser_closes do |browser|
54
+ # puts browser.html
55
+ # end
56
+ def self.before_browser_closes(&block)
57
+ @@before_browser_closes = block
58
+ end
59
+
60
+ # Site
61
+ attr_accessor :methods_module
62
+
63
+ # A site can be called a few different ways
64
+ #
65
+ # The following example creates a new browser object and closes it:
66
+ # Google.new do
67
+ # google.search.set "taza"
68
+ # google.submit.click
69
+ # end
70
+ #
71
+ # This example will create a browser object but not close it:
72
+ # Google.new.search.set "taza"
73
+ #
74
+ # Sites can take a couple of parameters in the constructor:
75
+ # :browser => a browser object to act on instead of creating one automatically
76
+ # (not sure if this is a useful feature or not)
77
+ def initialize(params={}, &block)
78
+ @site = self
79
+ @module_name = self.class.parent.to_s
80
+ @class_name = self.class.to_s.split("::").last
81
+
82
+ define_flows
83
+
84
+ if params[:browser]
85
+ @browser = params[:browser]
86
+ else
87
+ @browser = Browser.create(config)
88
+ @i_created_browser = true
89
+ end
90
+
91
+ page_loader = PageLoader.new(@module_name, pages_path)
92
+ @pages = page_loader.page_names
93
+ @methods_module = page_loader.page_methods
94
+ @methods_module.send(:include, Methods)
95
+ self.extend(@methods_module)
96
+
97
+ @browser.goto origin
98
+
99
+ execute_block_and_close_browser(&block) if block_given?
100
+ end
101
+
102
+ def config
103
+ Settings.config(@class_name)
104
+ end
105
+
106
+ # The base url of the site. This is configured in environments.yml.
107
+ def origin
108
+ config[:url]
109
+ end
110
+
111
+ def execute_block_and_close_browser
112
+ begin
113
+ yield self
114
+ rescue => site_block_exception
115
+ ensure
116
+ begin
117
+ close
118
+ rescue => close_exception
119
+ ""
120
+ end
121
+ exception = site_block_exception || close_exception
122
+ raise exception if exception
123
+ end
124
+ end
125
+ private :execute_block_and_close_browser
126
+
127
+ def close
128
+ begin
129
+ @@before_browser_closes.call(@browser)
130
+ rescue => before_browser_closes_block_exception
131
+ "" # so basically rcov has a bug where it would insist this block is uncovered when empty
132
+ end
133
+ begin
134
+ @browser.close if @i_created_browser
135
+ ensure
136
+ raise before_browser_closes_block_exception if before_browser_closes_block_exception
137
+ end
138
+ end
139
+
140
+ # Return a context that supports the "watircraft" commands.
141
+ # Currently used by the script\console
142
+ def execution_context
143
+ initialize_context!(Object.new)
144
+ end
145
+
146
+ def initialize_context!(context)
147
+ context.extend @methods_module
148
+ context.site = @site
149
+ context.browser = @site.browser
150
+ context
151
+ end
152
+
153
+ private
154
+ def pages_path # :nodoc:
155
+ File.join(path,'pages','**','*.rb') # does this need to include partials?
156
+ end
157
+
158
+ def define_flows # :nodoc:
159
+ Dir.glob(flows_path) do |file|
160
+ require file
161
+ end
162
+ end
163
+
164
+ # This is used to call a flow belonging to the site
165
+ #
166
+ # Example:
167
+ # Google.new do |google|
168
+ # google.flow(:perform_search, :query => "taza")
169
+ # end
170
+ #
171
+ # Where the flow would be defined under lib/sites/google/flows/perform_search.rb and look like:
172
+ # class PerformSearch < Taza::Flow
173
+ # alias :google :site
174
+ #
175
+ # def run(params={})
176
+ # google.search.set params[:query]
177
+ # google.submit.click
178
+ # end
179
+ # end
180
+
181
+ #
182
+ # methods that neither depend on or modify state
183
+ #
184
+
185
+ private
186
+ def flows_path # :nodoc:
187
+ File.join(path,'flows','*.rb')
188
+ end
189
+
190
+ def path # :nodoc:
191
+ File.join(base_path,'lib')
192
+ end
193
+
194
+ def base_path # :nodoc:
195
+ APP_ROOT
196
+ end
197
+
198
+ class PageLoader
199
+ attr_reader :page_methods, :page_names
200
+ def initialize site_module, pages_path
201
+ @site_module = site_module
202
+ @pages_path = pages_path
203
+ @page_methods = Module.new
204
+ @page_names = []
205
+ define_site_pages
206
+ end
207
+ private
208
+ def define_site_pages # :nodoc:
209
+ Dir.glob(@pages_path) do |file|
210
+ require file
211
+ page_name = File.basename(file,'.rb')
212
+ @page_names << page_name
213
+ page_class = "#{@site_module}::#{page_name.camelize}"
214
+ @page_methods.module_eval <<-EOS
215
+ def #{page_name}
216
+ page = #{page_class}.new
217
+ page.browser = @browser
218
+ page.site = @site
219
+ yield page if block_given?
220
+ page
221
+ end
222
+ EOS
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
data/lib/taza/tasks.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rubygems'
4
+ require 'taglob/rake/tasks'
5
+ require 'spec/rake/spectask'
6
+
7
+ def tags
8
+ ENV['TAGS']
9
+ end
10
+
11
+ def format_options(file_name)
12
+ file_name = "artifacts/#{file_name}/index.html"
13
+ dir_name = File.dirname(file_name)
14
+ FileUtils.mkdir_p(dir_name) unless File.directory?(dir_name)
15
+ ["--format","html:#{file_name}","--format","p"]
16
+ end
17
+
18
+ desc "Run all functional specs"
19
+ Spec::Rake::SpecTask.new :spec do |t|
20
+ t.spec_files = Dir.taglob('test/specs/**/*_spec.rb',tags)
21
+ t.spec_opts << format_options("functional/all")
22
+ end
23
+ task :specs => :spec
24
+
25
+ require 'cucumber/rake/task'
26
+ Cucumber::Rake::Task.new do |t|
27
+ t.cucumber_opts = '--format pretty'
28
+ t.step_pattern = "lib/steps/**/*.rb"
29
+ t.feature_pattern = "test/features/**/*.feature"
30
+ end
data/lib/taza.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'taza/page'
2
+ require 'taza/site'
3
+ require 'taza/browser'
4
+ require 'taza/settings'
5
+ require 'taza/flow'
6
+ require 'taza/entity'
7
+ require 'taza/fixture'
8
+ require 'extensions/object'
9
+ require 'extensions/string'
10
+ require 'extensions/hash'
11
+ require 'extensions/array'
12
+
13
+ module Taza
14
+ VERSION = '0.8.1'
15
+
16
+ def self.windows?
17
+ PLATFORM.include?("mswin")
18
+ end
19
+ def self.osx?
20
+ PLATFORM.include?("darwin")
21
+ end
22
+ end
23
+
24
+ module ForwardInitialization
25
+ module ClassMethods
26
+ def new(*args,&block)
27
+ const_get("#{name.split("::").last}").new(*args,&block)
28
+ end
29
+ end
30
+
31
+ def self.included(klass)
32
+ klass.extend(ClassMethods)
33
+ end
34
+ end
35
+
@@ -0,0 +1,27 @@
1
+ require 'taza/settings'
2
+
3
+ module WatirCraft
4
+ # Assumes #site_name and #destination_root and #usage methods are defined.
5
+ module GeneratorHelper
6
+ protected
7
+ def configured_validated_site
8
+ site = configured_site
9
+ check_if_site_exists site
10
+ site
11
+ end
12
+ def configured_site
13
+ site_name = Taza::Settings.config_file[:site]
14
+ end
15
+ def check_if_site_exists site_name=@site_name
16
+ if site_name.nil?
17
+ raise RubiGen::UsageError,
18
+ "Error. A site must first be specified in config.yml"
19
+ end
20
+ site_file = File.join(destination_root,'lib',"#{site_name.underscore}.rb")
21
+ unless File.exists?(site_file)
22
+ raise RubiGen::UsageError,
23
+ "Error. Site file #{site_file} not found. (Check config.yml)"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,56 @@
1
+ module WatirCraft
2
+ class Table
3
+ class << self
4
+ def row_class
5
+ @row_class ||= Class.new(Row)
6
+ end
7
+ def field(name, &block)
8
+ row_class.field(name, &block)
9
+ end
10
+ def element(name, &block)
11
+ row_class.element(name, &block)
12
+ end
13
+ end
14
+ def initialize watir_table, &block
15
+ @watir_table = watir_table
16
+ end
17
+ def row selector
18
+ @watir_table.rows.each do | row |
19
+ wrapped = self.class.row_class.new row
20
+ # note: we are only looking at the first key/value
21
+ method = selector.keys[0]
22
+ value = selector[method]
23
+ return wrapped if wrapped.send(method) == value
24
+ end
25
+ nil
26
+ end
27
+ end
28
+
29
+ class Row
30
+ class << self
31
+ def element name, &block
32
+ define_method(name) do
33
+ instance_eval &block
34
+ end
35
+ end
36
+ def field name, &block
37
+ element_name = "#{name}_element"
38
+ element element_name, &block
39
+ define_method(name) do
40
+ send(element_name).display_value
41
+ end
42
+ define_method("#{name}=") do | value |
43
+ send(element_name).set value
44
+ end
45
+ end
46
+ end
47
+ def initialize watir_row
48
+ @row = watir_row
49
+ end
50
+ # Returns true. If the row doesn't exist, you'll get nil as the return
51
+ # value of Table#row.
52
+ def exist?
53
+ true
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ # This file is autogenerated. Do not edit.
2
+ # Use 'rake version.rb' to update.
3
+ module WatirCraft; VERSION = '0.4.0'; end
data/lib/watircraft.rb ADDED
@@ -0,0 +1 @@
1
+ require 'watircraft/version'
@@ -0,0 +1,16 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe 'Array Extensions' do
4
+ it "should know if elements are not equivilent to a subset of those elements" do
5
+ [1,2,3].should_not be_equivalent([2,3])
6
+ end
7
+ it "should know if elements are not equivilent to a larger set including those elements" do
8
+ [1,2,3].should_not be_equivalent([1,2,3,4])
9
+ end
10
+ it "should know it is equivalent if the same order" do
11
+ [1,2,3].should be_equivalent([1,2,3])
12
+ end
13
+ it "should know it is equivalent if the different orders" do
14
+ [1,2,3].should be_equivalent([2,1,3])
15
+ end
16
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec/spec_helper'
2
+ require 'taza/browser'
3
+ require 'taza/settings'
4
+ require 'selenium'
5
+ require 'watir'
6
+
7
+ describe Taza::Browser do
8
+
9
+ before :each do
10
+ reset_env_vars
11
+ Taza::Settings.stubs(:config_file).returns({})
12
+ ENV['ENVIRONMENT'] = 'test'
13
+ end
14
+
15
+ after :all do
16
+ reset_env_vars
17
+ end
18
+ def reset_env_vars
19
+ ENV['ENVIRONMENT'] = nil
20
+ ENV['SERVER_PORT'] = nil
21
+ ENV['SERVER_IP'] = nil
22
+ ENV['BROWSER'] = nil
23
+ ENV['DRIVER'] = nil
24
+ ENV['TIMEOUT'] = nil
25
+ end
26
+
27
+ it "should raise unknown browser error for unsupported watir browsers" do
28
+ lambda { Taza::Browser.create(:browser => :foo_browser_9000,:driver => :watir) }.should raise_error(StandardError)
29
+ end
30
+
31
+ it "should use params browser type when creating selenium" do
32
+ browser_type = :opera
33
+ Selenium::SeleniumDriver.expects(:new).with(anything,anything,'*opera',anything)
34
+ Taza::Browser.create(:browser => browser_type, :driver => :selenium)
35
+ end
36
+
37
+ it "should raise selenium unsupported browser error" do
38
+ Taza::Browser.create(:browser => :foo, :driver => :selenium)
39
+ end
40
+
41
+ it "should be able to create a selenium instance" do
42
+ browser = Taza::Browser.create(:browser => :firefox, :driver => :selenium)
43
+ browser.should be_a_kind_of(Selenium::SeleniumDriver)
44
+ end
45
+
46
+ it "should use environment settings for server port and ip" do
47
+ Taza::Settings.stubs(:path).returns(File.join('spec','sandbox'))
48
+ ENV['SERVER_PORT'] = 'server_port'
49
+ ENV['SERVER_IP'] = 'server_ip'
50
+ ENV['DRIVER'] = 'selenium'
51
+ Selenium::SeleniumDriver.expects(:new).with('server_ip','server_port',anything,anything)
52
+ Taza::Browser.create(Taza::Settings.config("SiteName"))
53
+ end
54
+
55
+ it "should use environment settings for timeout" do
56
+ Taza::Settings.stubs(:path).returns(File.join('spec','sandbox'))
57
+ ENV['TIMEOUT'] = 'timeout'
58
+ ENV['DRIVER'] = 'selenium'
59
+ Selenium::SeleniumDriver.expects(:new).with(anything,anything,anything,'timeout')
60
+ Taza::Browser.create(Taza::Settings.config("SiteName"))
61
+ end
62
+
63
+ # a test of a stub for testing the test harness of our tests
64
+ it "should provide a fake browser, so we can test our test harness" do
65
+ Taza::Browser.create(:driver => :fake).should be_a(Taza::FakeBrowser)
66
+ end
67
+
68
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec/spec_helper'
2
+ require 'taza'
3
+
4
+ describe Taza::Entity do
5
+ it "should add methods for hash string keys" do
6
+ entity = Taza::Entity.new({'apple' => 'pie'},nil)
7
+ entity.should respond_to(:apple)
8
+ end
9
+ end
@@ -0,0 +1,34 @@
1
+ require 'ostruct'
2
+
3
+ # Replaces watir table in WatirCraft unit tests
4
+ class FakeTable
5
+ attr_accessor :rows
6
+ def initialize structure
7
+ @rows = structure.map {|hash| FakeRow.new(hash)}
8
+ end
9
+ end
10
+
11
+ class FakeRow
12
+ def initialize hash
13
+ @hash = hash
14
+ end
15
+ def element name
16
+ FakeElement.new @hash, name
17
+ end
18
+ end
19
+
20
+ class FakeElement
21
+ def initialize hash, name
22
+ @hash = hash
23
+ @name = name
24
+ end
25
+ def display_value
26
+ @hash[@name]
27
+ end
28
+ def exist?
29
+ true
30
+ end
31
+ def set value
32
+ @hash[@name] = value
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec/spec_helper'
2
+ require 'taza'
3
+
4
+ describe Taza::Fixture do
5
+
6
+ it "should be able to load entries from fixtures" do
7
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
8
+ fixture = Taza::Fixture.new
9
+ fixture.load_all
10
+ example = fixture.get_fixture_entity(:examples,'first_example')
11
+ example.name.should eql("first")
12
+ example.price.should eql(1)
13
+ end
14
+
15
+ it "should use the spec folder as the base path" do
16
+ Taza::Fixture.new.base_path.should eql('./spec')
17
+ end
18
+
19
+ it "should know if a pluralized fixture of that name exists" do
20
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
21
+ fixture = Taza::Fixture.new
22
+ fixture.load_all
23
+ fixture.pluralized_fixture_exists?('example').should be_true
24
+ fixture.pluralized_fixture_exists?('foo').should be_false
25
+ end
26
+
27
+ it "should be able to get all fixtures loaded" do
28
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
29
+ fixture = Taza::Fixture.new
30
+ fixture.load_all
31
+ fixture.fixture_names.should be_equivalent([:examples,:users])
32
+ end
33
+
34
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec/spec_helper'
2
+ require 'taza/fixture'
3
+
4
+ describe Taza::Fixtures do
5
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
6
+ include Taza::Fixtures
7
+
8
+ it "should be able to look up a fixture entity off fixture_methods module" do
9
+ examples(:first_example).name.should eql('first')
10
+ end
11
+
12
+ it "should still raise method missing error" do
13
+ lambda{zomgwtf(:first_example)}.should raise_error(NoMethodError)
14
+ end
15
+
16
+ #TODO: this test tests what is in entity's instance eval not happy with it being here
17
+ it "should be able to look up a fixture entity off fixture_methods module" do
18
+ examples(:first_example).user.name.should eql(users(:shatner).name)
19
+ end
20
+
21
+ end
data/spec/hash_spec.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe 'Hash Extensions' do
4
+ it "should add methods for hash keys to some instance" do
5
+ entity = {'apple' => 'pie'}.convert_hash_keys_to_methods(nil)
6
+ entity.should respond_to(:apple)
7
+ end
8
+ it "should not add the methods to a hash" do
9
+ entity = {'apple' => 'pie'}.convert_hash_keys_to_methods(nil)
10
+ entity.should_not be_a_instance_of(Hash)
11
+ end
12
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "Object" do
4
+ before :all do
5
+ @orig_version = VERSION
6
+ Object.send :remove_const, :VERSION
7
+ Object.const_set :VERSION, "1.8.6"
8
+ load 'lib/extensions/object.rb'
9
+ end
10
+
11
+ after :all do
12
+ Object.send :remove_const, :VERSION
13
+ Object.const_set :VERSION, @orig_version
14
+ end
15
+
16
+ it "should execute blocks with args in instance context" do
17
+ str = "string"
18
+
19
+ class << str
20
+ def my_singleton_method(arg)
21
+ arg
22
+ end
23
+ end
24
+
25
+ block = Proc.new { |arg| my_singleton_method(arg) }
26
+
27
+ str.instance_exec("foo",&block).should == "foo"
28
+ end
29
+ end