polonium 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/CHANGES +1 -0
  2. data/Rakefile +1 -1
  3. data/lib/polonium/adapters/rspec.rb +21 -0
  4. data/lib/polonium/{extensions/testrunnermediator.rb → adapters/test_unit.rb} +1 -1
  5. data/lib/polonium/configuration.rb +35 -33
  6. data/lib/polonium/dsl/selenium_dsl.rb +6 -3
  7. data/lib/polonium/dsl/test_unit_dsl.rb +4 -1
  8. data/lib/polonium/element.rb +13 -12
  9. data/lib/polonium/page.rb +14 -4
  10. data/lib/polonium/test_case.rb +3 -37
  11. data/lib/polonium/values_match.rb +9 -0
  12. data/lib/polonium.rb +6 -1
  13. data/spec/main_spec_suite.rb +11 -0
  14. data/spec/polonium/{selenium_configuration_spec.rb → configuration_spec.rb} +0 -0
  15. data/spec/polonium/{selenium_driver_spec.rb → driver_spec.rb} +0 -0
  16. data/spec/polonium/element_spec.rb +601 -0
  17. data/spec/polonium/{selenium_page_spec.rb → page_spec.rb} +95 -60
  18. data/spec/polonium/{selenium_server_runner_spec.rb → server_runner_spec.rb} +0 -0
  19. data/spec/polonium/test_case_class_method_spec.rb +14 -0
  20. data/spec/polonium/{selenium_test_case_spec.rb → test_case_spec.rb} +16 -7
  21. data/spec/polonium/{selenium_test_case_spec_helper.rb → test_case_spec_helper.rb} +1 -1
  22. data/spec/polonium/values_match_spec.rb +30 -0
  23. data/spec/rspec/options_spec.rb +30 -0
  24. data/spec/rspec/rspec_spec_helper.rb +1 -0
  25. data/spec/rspec_spec_suite.rb +11 -0
  26. data/spec/spec_helper.rb +2 -2
  27. data/spec/spec_suite.rb +17 -4
  28. data/spec/test_unit/test_unit_spec_helper.rb +1 -0
  29. data/spec/{polonium/extensions → test_unit}/testrunnermediator_spec.rb +1 -1
  30. data/spec/test_unit_spec_suite.rb +11 -0
  31. metadata +21 -12
  32. data/spec/polonium/selenium_element_spec.rb +0 -551
  33. data/spec/polonium/selenium_test_case_class_method_spec.rb +0 -41
data/CHANGES CHANGED
@@ -1,3 +1,4 @@
1
+ 0.1.0
1
2
  * Renamed to Polonium
2
3
  * Methods renamed to match Test::Unit assertions
3
4
  * Page and Element delegate to Driver [Paired with Jeff Whitmore]
data/Rakefile CHANGED
@@ -26,7 +26,7 @@ def run_suite
26
26
  end
27
27
 
28
28
  PKG_NAME = "polonium"
29
- PKG_VERSION = "0.1.0"
29
+ PKG_VERSION = "0.1.1"
30
30
  PKG_FILES = FileList[
31
31
  '[A-Z]*',
32
32
  '*.rb',
@@ -0,0 +1,21 @@
1
+ class Spec::Runner::Options
2
+ attr_accessor :selenium_configuration, :selenium_app_runner
3
+
4
+ def run_examples_with_selenium_runner(*args)
5
+ success = run_examples_without_selenium_runner(*args)
6
+ selenium_app_runner.stop
7
+ selenium_configuration.stop_driver_if_necessary(success)
8
+ success
9
+ end
10
+ alias_method_chain :run_examples, :selenium_runner
11
+ end
12
+
13
+ rspec_options.selenium_configuration = Polonium::Configuration.instance
14
+ rspec_options.selenium_app_runner = nil
15
+
16
+ Spec::Example::ExampleMethods.before(:all) do
17
+ unless rspec_options.selenium_app_runner
18
+ rspec_options.selenium_app_runner = rspec_options.selenium_configuration.create_server_runner
19
+ rspec_options.selenium_app_runner.start
20
+ end
21
+ end
@@ -1,11 +1,11 @@
1
1
  class Test::Unit::UI::TestRunnerMediator
2
- alias_method :run_suite_without_seleniumrc, :run_suite
3
2
  def run_suite_with_seleniumrc
4
3
  start_app_server
5
4
  result = run_suite_without_seleniumrc
6
5
  stop_app_server(result)
7
6
  result
8
7
  end
8
+ alias_method :run_suite_without_seleniumrc, :run_suite
9
9
  alias_method :run_suite, :run_suite_with_seleniumrc
10
10
 
11
11
  protected
@@ -49,8 +49,8 @@ module Polonium
49
49
 
50
50
  private
51
51
  def establish_environment
52
- @instance.rails_env = env['RAILS_ENV'] if env.include?('RAILS_ENV')
53
- @instance.rails_root = Object.const_get(:RAILS_ROOT) if Object.const_defined?(:RAILS_ROOT)
52
+ instance.rails_env = env['RAILS_ENV'] if env.include?('RAILS_ENV')
53
+ instance.rails_root = Object.const_get(:RAILS_ROOT) if Object.const_defined?(:RAILS_ROOT)
54
54
  [
55
55
  'selenium_server_host',
56
56
  'selenium_server_port',
@@ -61,7 +61,7 @@ module Polonium
61
61
  'external_app_server_port'
62
62
  ].each do |env_key|
63
63
  if env.include?(env_key)
64
- @instance.send("#{env_key}=", env[env_key])
64
+ instance.send("#{env_key}=", env[env_key])
65
65
  end
66
66
  end
67
67
  [
@@ -69,35 +69,37 @@ module Polonium
69
69
  'verify_remote_app_server_is_running'
70
70
  ].each do |env_key|
71
71
  if env.include?(env_key)
72
- @instance.send("#{env_key}=", env[env_key].to_s != false.to_s)
72
+ instance.send("#{env_key}=", env[env_key].to_s != false.to_s)
73
73
  end
74
74
  end
75
- @instance.browser = env['browser'] if env.include?('browser')
75
+ instance.browser = env['browser'] if env.include?('browser')
76
76
  end
77
77
 
78
78
  def env
79
- @instance.env
79
+ instance.env
80
80
  end
81
81
  end
82
82
 
83
- attr_accessor :configuration,
84
- :env,
85
- :rails_env,
86
- :rails_root,
87
- :browser,
88
- :driver,
89
- :browser_mode,
90
- :selenium_server_host,
91
- :selenium_server_port,
92
- :app_server_engine,
93
- :internal_app_server_host,
94
- :internal_app_server_port,
95
- :external_app_server_host,
96
- :external_app_server_port,
97
- :server_engine,
98
- :keep_browser_open_on_failure,
99
- :verify_remote_app_server_is_running,
100
- :app_server_initialization
83
+ attr_accessor(
84
+ :configuration,
85
+ :env,
86
+ :rails_env,
87
+ :rails_root,
88
+ :browser,
89
+ :driver,
90
+ :browser_mode,
91
+ :selenium_server_host,
92
+ :selenium_server_port,
93
+ :app_server_engine,
94
+ :internal_app_server_host,
95
+ :internal_app_server_port,
96
+ :external_app_server_host,
97
+ :external_app_server_port,
98
+ :server_engine,
99
+ :keep_browser_open_on_failure,
100
+ :verify_remote_app_server_is_running,
101
+ :app_server_initialization
102
+ )
101
103
 
102
104
  def initialize
103
105
  self.verify_remote_app_server_is_running = true
@@ -164,7 +166,7 @@ module Polonium
164
166
  @driver ||= create_and_initialize_driver
165
167
  end
166
168
 
167
- def stop_driver_if_necessary(suite_passed) # nodoc
169
+ def stop_driver_if_necessary(suite_passed) #:nodoc:
168
170
  failure_has_occurred unless suite_passed
169
171
  if @driver && stop_driver?(suite_passed)
170
172
  @driver.stop
@@ -172,19 +174,19 @@ module Polonium
172
174
  end
173
175
  end
174
176
 
175
- def stop_driver?(passed) # nodoc
177
+ def stop_driver?(passed) #:nodoc:
176
178
  return true if passed
177
179
  return !keep_browser_open_on_failure
178
180
  end
179
181
 
180
- def create_and_initialize_driver # nodoc
182
+ def create_and_initialize_driver #:nodoc:
181
183
  driver = create_driver
182
184
  driver.start
183
185
  notify_after_driver_started(driver)
184
186
  driver
185
187
  end
186
188
 
187
- def create_driver # nodoc
189
+ def create_driver #:nodoc:
188
190
  return ::Polonium::Driver.new(
189
191
  selenium_server_host,
190
192
  selenium_server_port,
@@ -194,7 +196,7 @@ module Polonium
194
196
  )
195
197
  end
196
198
 
197
- def create_server_runner # nodoc
199
+ def create_server_runner #:nodoc:
198
200
  case @app_server_engine.to_sym
199
201
  when :mongrel
200
202
  create_mongrel_runner
@@ -205,7 +207,7 @@ module Polonium
205
207
  end
206
208
  end
207
209
 
208
- def create_webrick_runner # nodoc
210
+ def create_webrick_runner #:nodoc:
209
211
  require 'webrick_server'
210
212
  runner = WebrickSeleniumServerRunner.new
211
213
  runner.configuration = self
@@ -216,7 +218,7 @@ module Polonium
216
218
  runner
217
219
  end
218
220
 
219
- def create_webrick_server # nodoc
221
+ def create_webrick_server #:nodoc:
220
222
  WEBrick::HTTPServer.new({
221
223
  :Port => @internal_app_server_port,
222
224
  :BindAddress => @internal_app_server_host,
@@ -231,14 +233,14 @@ module Polonium
231
233
  Logger.new(StringIO.new)
232
234
  end
233
235
 
234
- def create_mongrel_runner # nodoc
236
+ def create_mongrel_runner #:nodoc:
235
237
  runner = MongrelSeleniumServerRunner.new
236
238
  runner.configuration = self
237
239
  runner.thread_class = Thread
238
240
  runner
239
241
  end
240
242
 
241
- def create_mongrel_configurator # nodoc
243
+ def create_mongrel_configurator #:nodoc:
242
244
  dir = File.dirname(__FILE__)
243
245
  require 'mongrel/rails'
244
246
  settings = {
@@ -21,11 +21,14 @@ module Polonium
21
21
  end
22
22
 
23
23
  protected
24
- Driver.public_instance_methods(false).each do |method_name|
25
- delegate method_name, :to => :selenium_driver
24
+ def method_missing(method_name, *args, &block)
25
+ selenium_driver.__send__(method_name, *args, &block)
26
26
  end
27
+ delegate :open,
28
+ :type,
29
+ :to => :selenium_driver
27
30
 
28
- def should_stop_driver?
31
+ def stop_driver?
29
32
  return false unless configuration.test_browser_mode?
30
33
  configuration.stop_driver?(passed?)
31
34
  end
@@ -30,7 +30,6 @@ module Polonium
30
30
  deprecate :assert_location_ends_in, :assert_location_ends_with
31
31
 
32
32
  element_assertion :value
33
- element_assertion :attribute # yes, it's a little weird... in this case element is really an attribute
34
33
  element_assertion :selected
35
34
  element_assertion :checked
36
35
  element_assertion :not_checked
@@ -42,6 +41,10 @@ module Polonium
42
41
  element_assertion :visible
43
42
  element_assertion :not_visible
44
43
 
44
+ def assert_attribute(element_locator, attribute_name, expected_value)
45
+ element(element_locator).assert_attribute(attribute_name, expected_value)
46
+ end
47
+
45
48
  # Assert and wait for locator element to contain text.
46
49
  def assert_element_contains(locator, text, options = {})
47
50
  element(locator).assert_contains(text, options)
@@ -1,6 +1,6 @@
1
1
  module Polonium
2
2
  class Element
3
- include WaitFor
3
+ include WaitFor, ValuesMatch
4
4
  attr_reader :driver, :locator
5
5
 
6
6
  def initialize(driver, locator)
@@ -25,12 +25,13 @@ module Polonium
25
25
  end
26
26
  end
27
27
 
28
- def assert_attribute(expected_value)
28
+ def assert_attribute(expected_name, expected_value)
29
29
  assert_element_present
30
+ attr_locator = "#{locator}@#{expected_name}"
30
31
  wait_for do |configuration|
31
- actual = driver.get_attribute(locator) #todo: actual value
32
- configuration.message = "Expected attribute '#{locator}' to be '#{expected_value}' but was '#{actual}'"
33
- expected_value == actual
32
+ actual = driver.get_attribute(attr_locator) #todo: actual value
33
+ configuration.message = "Expected attribute '#{attr_locator}' to be '#{expected_value}' but was '#{actual}'"
34
+ values_match? actual, expected_value
34
35
  end
35
36
  end
36
37
 
@@ -39,7 +40,7 @@ module Polonium
39
40
  wait_for do |configuration|
40
41
  actual = driver.get_selected_label(locator)
41
42
  configuration.message = "Expected '#{locator}' to be selected with '#{expected_value}' but was '#{actual}"
42
- expected_value == actual
43
+ values_match? actual, expected_value
43
44
  end
44
45
  end
45
46
 
@@ -72,7 +73,7 @@ module Polonium
72
73
 
73
74
  def assert_not_checked
74
75
  assert_element_present
75
- wait_for(:message => "Expected '#{locator}' to be checked") do
76
+ wait_for(:message => "Expected '#{locator}' to not be checked") do
76
77
  !driver.is_checked(locator)
77
78
  end
78
79
  end
@@ -82,7 +83,7 @@ module Polonium
82
83
  wait_for(options) do |configuration|
83
84
  actual = driver.get_text(locator)
84
85
  configuration.message = "Expected text '#{expected_text}' to be full contents of #{locator} but was '#{actual}')"
85
- expected_text == actual
86
+ values_match? actual, expected_text
86
87
  end
87
88
  end
88
89
 
@@ -100,7 +101,7 @@ module Polonium
100
101
  def assert_does_not_contain(expected_text, options={})
101
102
  assert_element_present
102
103
  wait_for(options) do
103
- !inner_html.include?(expected_text)
104
+ !contains?(expected_text)
104
105
  end
105
106
  end
106
107
 
@@ -157,7 +158,7 @@ module Polonium
157
158
  end
158
159
 
159
160
  def contains?(text)
160
- inner_html.include?(text)
161
+ inner_html.match(text) ? true : false
161
162
  end
162
163
 
163
164
  def ==(other)
@@ -176,7 +177,7 @@ module Polonium
176
177
  super
177
178
  end
178
179
  end
179
-
180
+
180
181
  def find_text_order_error_fragments(html, text_fragments)
181
182
  fragments_not_found = []
182
183
  fragments_out_of_order = []
@@ -204,4 +205,4 @@ module Polonium
204
205
  }
205
206
  end
206
207
  end
207
- end
208
+ end
data/lib/polonium/page.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Polonium
2
2
  class Page
3
- include WaitFor
3
+ include WaitFor, ValuesMatch
4
4
  attr_reader :driver
5
5
  PAGE_LOADED_COMMAND = "this.browserbot.getDocument().body ? true : false"
6
6
 
@@ -17,7 +17,7 @@ module Polonium
17
17
  wait_for(params) do |configuration|
18
18
  actual_title = title
19
19
  configuration.message = "Expected title '#{expected_title}' but was '#{actual_title}'"
20
- expected_title == actual_title
20
+ values_match?(actual_title, expected_title)
21
21
  end
22
22
  end
23
23
  def title
@@ -33,7 +33,12 @@ module Polonium
33
33
  end
34
34
  end
35
35
  def is_text_present?(expected_text)
36
- page_loaded? && driver.is_text_present(expected_text)
36
+ if expected_text.is_a?(Regexp)
37
+ text_finder = "regexp:#{expected_text.source}"
38
+ else
39
+ text_finder = expected_text
40
+ end
41
+ page_loaded? && driver.is_text_present(text_finder)
37
42
  end
38
43
 
39
44
  def assert_text_not_present(unexpected_text, options = {})
@@ -45,7 +50,12 @@ module Polonium
45
50
  end
46
51
  end
47
52
  def is_text_not_present?(unexpected_text)
48
- page_loaded? && !driver.is_text_present(unexpected_text)
53
+ if unexpected_text.is_a?(Regexp)
54
+ text_finder = "regexp:#{unexpected_text.source}"
55
+ else
56
+ text_finder = unexpected_text
57
+ end
58
+ page_loaded? && !driver.is_text_present(text_finder)
49
59
  end
50
60
 
51
61
  def page_loaded?
@@ -2,46 +2,12 @@ module Polonium
2
2
  # The Test Case class that runs your Selenium tests.
3
3
  # You are able to use all methods provided by Selenium::SeleneseInterpreter with some additions.
4
4
  class TestCase < Test::Unit::TestCase
5
- module ClassMethods
6
- def subclasses
7
- @subclasses ||= []
8
- end
9
-
10
- def inherited(subclass)
11
- # keep a list of all subclasses on the fly, so we can run them all later from the Runner
12
- subclasses << subclass unless subclasses.include?(subclass)
13
- super
14
- end
15
-
16
- def all_subclasses_as_suite(configuration)
17
- suite = Test::Unit::TestSuite.new
18
- all_descendant_classes.each do |test_case_class|
19
- test_case_class.suite.tests.each do |test_case|
20
- test_case.configuration = configuration
21
- suite << test_case
22
- end
23
- end
24
- suite
25
- end
26
-
27
- def all_descendant_classes
28
- extract_subclasses(self)
29
- end
30
-
31
- def extract_subclasses(parent_class)
32
- classes = []
33
- parent_class.subclasses.each do |subclass|
34
- classes << subclass
35
- classes.push(*extract_subclasses(subclass))
36
- end
37
- classes
38
- end
39
-
5
+ class << self
40
6
  unless Object.const_defined?(:RAILS_ROOT)
41
7
  attr_accessor :use_transactional_fixtures, :use_instantiated_fixtures
42
8
  end
43
9
  end
44
- extend ClassMethods
10
+ undef_method 'default_test' if instance_methods.include?('default_test')
45
11
 
46
12
  self.use_transactional_fixtures = false
47
13
  self.use_instantiated_fixtures = true
@@ -71,7 +37,7 @@ module Polonium
71
37
  end
72
38
 
73
39
  def teardown
74
- selenium_driver.stop if should_stop_driver?
40
+ selenium_driver.stop if stop_driver?
75
41
  super
76
42
  if @beginning
77
43
  duration = (time_class.now - @beginning).to_f
@@ -0,0 +1,9 @@
1
+ module ValuesMatch
2
+ def values_match?(actual, expected)
3
+ if expected.is_a? Regexp
4
+ (actual =~ expected) ? true : false
5
+ else
6
+ expected == actual
7
+ end
8
+ end
9
+ end
data/lib/polonium.rb CHANGED
@@ -11,7 +11,6 @@ require 'test/unit/ui/testrunnermediator'
11
11
 
12
12
  require "selenium"
13
13
  require "polonium/extensions/module"
14
- require "polonium/extensions/testrunnermediator"
15
14
  require "polonium/wait_for"
16
15
  require "polonium/driver"
17
16
  require "polonium/server_runner"
@@ -20,9 +19,15 @@ require "polonium/webrick_selenium_server_runner"
20
19
  require "polonium/dsl/selenium_dsl"
21
20
  require "polonium/dsl/test_unit_dsl"
22
21
  require "polonium/configuration"
22
+ require "polonium/values_match"
23
23
  require "polonium/page"
24
24
  require "polonium/element"
25
25
  require "polonium/test_case"
26
26
  require "polonium/tasks/selenium_test_task"
27
27
 
28
28
  require 'webrick_server' if self.class.const_defined? :RAILS_ROOT
29
+
30
+ require "polonium/adapters/test_unit"
31
+ if Object.const_defined?(:Spec)
32
+ require "polonium/adapters/rspec"
33
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/spec_suite")
2
+
3
+ class MainSpecSuite < SpecSuite
4
+ def files
5
+ Dir["#{File.dirname(__FILE__)}/polonium/**/*_spec.rb"]
6
+ end
7
+ end
8
+
9
+ if $0 == __FILE__
10
+ MainSpecSuite.new.run
11
+ end