polonium 0.1.0 → 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.
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