kookaburra 0.21.1 → 0.22.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.
@@ -1,6 +1,8 @@
1
1
  require 'active_support/core_ext/hash'
2
- require 'kookaburra/dependency_accessor'
2
+ require 'active_support/core_ext/module/delegation'
3
+ require 'kookaburra/assertion'
3
4
  require 'kookaburra/ui_driver/ui_component'
5
+ require 'kookaburra/ui_driver/ui_component/address_bar'
4
6
 
5
7
  class Kookaburra
6
8
  # You UIDriver subclass is where you define the DSL for testing your
@@ -20,15 +22,15 @@ class Kookaburra
20
22
  # ui_component :questionnaire, Questionnaire
21
23
  #
22
24
  # def view_the_widgets
23
- # widget_list.show
25
+ # address_bar.go_to(widget_list)
24
26
  # end
25
27
  #
26
28
  # def view_all_of_the_widgets
27
- # widget_list.show(:include_hidden => true)
29
+ # address_bar.go_to(widget_list.url(:include_hidden => true))
28
30
  # end
29
31
  #
30
32
  # def complete_the_widget_questionnaire(answers = {})
31
- # questionnaire.show
33
+ # address_bar.go_to(questionnaire)
32
34
  # questionnaire.page_1.submit(answers[:page_1])
33
35
  # questionnaire.page_2.submit(answers[:page_2])
34
36
  # questionnaire.page_3.submit(answers[:page_3])
@@ -57,7 +59,7 @@ class Kookaburra
57
59
  #
58
60
  # ui.account_management.account_list.should be_visible
59
61
  class UIDriver
60
- extend DependencyAccessor
62
+ include Assertion
61
63
 
62
64
  class << self
63
65
  # Tells the UIDriver about your {UIComponent} subclasses.
@@ -68,7 +70,7 @@ class Kookaburra
68
70
  # this component.
69
71
  def ui_component(component_name, component_class)
70
72
  define_method(component_name) do
71
- component_class.new(options.slice(:browser, :server_error_detection, :app_host))
73
+ component_class.new(@configuration)
72
74
  end
73
75
  end
74
76
 
@@ -80,7 +82,7 @@ class Kookaburra
80
82
  # this driver.
81
83
  def ui_driver(driver_name, driver_class)
82
84
  define_method(driver_name) do
83
- driver_class.new(options.slice(:browser, :server_error_detection, :app_host, :mental_model))
85
+ driver_class.new(@configuration)
84
86
  end
85
87
  end
86
88
  end
@@ -88,25 +90,19 @@ class Kookaburra
88
90
  # It is unlikely that you would instantiate your UIDriver on your own; the
89
91
  # object is configured for you when you call {Kookaburra#ui}.
90
92
  #
91
- # @option options [Capybara::Session] :browser Most likely a
92
- # `Capybara::Session` instance.
93
- # @option options [Kookaburra::MentalModel] :mental_model
94
- # @option options [String] :app_host The root URL of your running
95
- # application (e.g. "http://my_app.example.com:12345")
96
- # @option options [Proc] :server_error_detection A lambda that is passed the
97
- # `:browser` object and should return `true` if the page indicates a server
98
- # error has occured
99
- def initialize(options = {})
100
- @options = options
101
- @mental_model = options[:mental_model]
93
+ # @param [Kookaburra::Configuration] configuration (Kookaburra.configuration)
94
+ def initialize(configuration)
95
+ @configuration = configuration
102
96
  end
103
97
 
104
98
  protected
105
99
 
106
- # Provides access to the options with which the object was initialized
107
- attr_reader :options
100
+ # @attribute [r] address_bar
101
+ # @return [Kookaburra::UIComponent::UIComponent::AddressBar]
102
+ ui_component :address_bar, UIComponent::AddressBar
108
103
 
109
104
  # @attribute [r] mental_model
110
- dependency_accessor :mental_model
105
+ # @return [Kookaburra::MentalModel]
106
+ delegate :mental_model, :to => :@configuration
111
107
  end
112
108
  end
data/lib/kookaburra.rb CHANGED
@@ -2,52 +2,47 @@ require 'kookaburra/exceptions'
2
2
  require 'kookaburra/mental_model'
3
3
  require 'kookaburra/given_driver'
4
4
  require 'kookaburra/ui_driver'
5
+ require 'kookaburra/configuration'
5
6
 
6
7
  # Kookaburra provides the top-level API that you will access in your test
7
8
  # implementation, namely the {#given}, {#ui}, and the {#get_data} methods.
8
9
  #
9
10
  # The Kookaburra object ensures that your GivenDriver and UIDriver share the
10
- # same state with regard to any fixture data that is created during your test
11
- # run. As such, it is important to ensure that a new instance of Kookaburra is
12
- # created for each individual test, otherwise you may wind up with test state
13
- # bleeding over from one test to the next. The {Kookaburra::TestHelpers} module
14
- # is intended to be mixed in to your testing context for this purpose.
11
+ # same state with regard to any {Kookaburra::MentalModel} data that is created
12
+ # during your test run. As such, it is important to ensure that a new instance
13
+ # of Kookaburra is created for each individual test, otherwise you may wind up
14
+ # with test state bleeding over from one test to the next. The
15
+ # {Kookaburra::TestHelpers} module is intended to be mixed in to your testing
16
+ # context for this purpose.
15
17
  #
16
18
  # @see Kookaburra::TestHelpers
17
19
  class Kookaburra
18
20
  class << self
19
- # {Kookaburra::TestHelpers#k} uses the value stored here as the options
20
- # argument to {Kookaburra#initialize}. See {Kookaburra#initialize} for the
21
- # list of valid keys and their contents.
22
- attr_accessor :configuration
23
-
21
+ # Stores the configuration object that is used by default when creating new
22
+ # instances of Kookaburra
23
+ #
24
+ # @return [Kookaburra::Configuration] return value is memoized
24
25
  def configuration
25
- @configuration ||= {}
26
+ @configuration ||= Configuration.new
27
+ end
28
+
29
+ # Yields the current configuration so that it can be modified
30
+ #
31
+ # @yield [Kookaburra::Configuration]
32
+ def configure(&blk)
33
+ blk.call(configuration)
26
34
  end
27
35
  end
28
36
 
29
37
  # Returns a new Kookaburra instance that wires together your application's
30
- # APIDriver, GivenDriver, and UIDriver.
38
+ # GivenDriver and UIDriver with a shared {Kookaburra::MentalModel}.
31
39
  #
32
- # @option options [Class] :given_driver_class Your
33
- # application's subclass of {Kookaburra::GivenDriver}
34
- # @option options [Class] :ui_driver_class Your application's
35
- # subclass of {Kookaburra::UIDriver}
36
- # @option options [Capybara::Session] :browser The browser driver
37
- # that Kookaburra will interact with to run the tests.
38
- # @option options [String] :app_host The URL of your running application
39
- # server against which the tests will be run (e.g.
40
- # "http://my_app.example.com:12345")
41
- # @option options [Proc] :server_error_detection A proc that will receive the
42
- # object passed in to the :browser option as an argument and must return
43
- # `true` if the server responded with an unexpected error or `false` if it
44
- # did not.
45
- def initialize(options = {})
46
- @given_driver_class = options[:given_driver_class]
47
- @ui_driver_class = options[:ui_driver_class]
48
- @browser = options[:browser]
49
- @app_host = options[:app_host]
50
- @server_error_detection = options[:server_error_detection]
40
+ # @param [Kookaburra::Configuration] configuration (Kookaburra.configuration)
41
+ def initialize(configuration = Kookaburra.configuration)
42
+ @configuration = configuration
43
+ @configuration.mental_model = MentalModel.new
44
+ @given_driver_class = configuration.given_driver_class
45
+ @ui_driver_class = configuration.ui_driver_class
51
46
  end
52
47
 
53
48
  # Returns an instance of your GivenDriver class configured to share test
@@ -55,7 +50,7 @@ class Kookaburra
55
50
  #
56
51
  # @return [Kookaburra::GivenDriver]
57
52
  def given
58
- given_driver_class.new(:mental_model => mental_model, :app_host => @app_host)
53
+ @given ||= @given_driver_class.new(@configuration)
59
54
  end
60
55
 
61
56
  # Returns an instance of your UIDriver class configured to share test fixture
@@ -64,10 +59,7 @@ class Kookaburra
64
59
  #
65
60
  # @return [Kookaburra::UIDriver]
66
61
  def ui
67
- ui_driver_class.new(:mental_model => mental_model,
68
- :browser => browser,
69
- :app_host => @app_host,
70
- :server_error_detection => @server_error_detection)
62
+ @ui ||= @ui_driver_class.new(@configuration)
71
63
  end
72
64
 
73
65
  # Returns a frozen copy of the specified {MentalModel::Collection}.
@@ -86,19 +78,6 @@ class Kookaburra
86
78
  #
87
79
  # @return [Kookaburra::MentalModel::Collection]
88
80
  def get_data(collection_name)
89
- mental_model.send(collection_name).dup.freeze
90
- end
91
-
92
- private
93
-
94
- extend DependencyAccessor
95
- dependency_accessor :given_driver_class, :ui_driver_class
96
-
97
- def mental_model
98
- @mental_model ||= MentalModel.new
99
- end
100
-
101
- def browser
102
- @browser ||= NullBrowser.new
81
+ @configuration.mental_model.send(collection_name).dup.freeze
103
82
  end
104
83
  end
@@ -1,4 +1,4 @@
1
- require 'kookaburra'
1
+ require 'kookaburra/test_helpers'
2
2
  require 'kookaburra/json_api_driver'
3
3
  require 'capybara'
4
4
 
@@ -190,7 +190,7 @@ describe "testing a Rack application with Kookaburra" do
190
190
 
191
191
  class MyGivenDriver < Kookaburra::GivenDriver
192
192
  def api
193
- MyAPIDriver.new(:app_host => initialization_options[:app_host])
193
+ MyAPIDriver.new(configuration)
194
194
  end
195
195
 
196
196
  def a_user(name)
@@ -277,19 +277,23 @@ describe "testing a Rack application with Kookaburra" do
277
277
  ui_component :widget_form, WidgetForm
278
278
 
279
279
  def sign_in(name)
280
- sign_in_screen.show
280
+ address_bar.go_to sign_in_screen
281
281
  sign_in_screen.sign_in(mental_model.users[name])
282
282
  end
283
283
 
284
+ def view_widget_list
285
+ address_bar.go_to widget_list
286
+ end
287
+
284
288
  def create_new_widget(name, attributes = {})
285
- widget_list.show
289
+ assert widget_list.visible?, "Widget list is not visible!"
286
290
  widget_list.choose_to_create_new_widget
287
291
  widget_form.submit('name' => 'My Widget')
288
292
  mental_model.widgets[name] = widget_list.last_widget_created
289
293
  end
290
294
 
291
295
  def delete_widget(name)
292
- widget_list.show
296
+ assert widget_list.visible?, "Widget list is not visible!"
293
297
  widget_list.choose_to_delete_widget(mental_model.widgets[name])
294
298
  end
295
299
  end
@@ -314,31 +318,31 @@ describe "testing a Rack application with Kookaburra" do
314
318
  end
315
319
 
316
320
  it "runs the tests against the app" do
317
- server_error_detection = lambda { |browser|
318
- browser.has_css?('head title', :text => 'Internal Server Error')
319
- }
320
-
321
- k = Kookaburra.new({
322
- :ui_driver_class => MyUIDriver,
323
- :given_driver_class => MyGivenDriver,
324
- :app_host => 'http://127.0.0.1:%d' % @rack_server_port,
325
- :browser => Capybara::Session.new(:selenium),
326
- :server_error_detection => server_error_detection
327
- })
328
-
329
- k.given.a_user(:bob)
330
- k.given.a_widget(:widget_a)
331
- k.given.a_widget(:widget_b, :name => 'Foo')
332
-
333
- k.ui.sign_in(:bob)
334
- k.ui.widget_list.show
335
- k.ui.widget_list.widgets.should == k.get_data(:widgets).slice(:widget_a, :widget_b)
336
-
337
- k.ui.create_new_widget(:widget_c, :name => 'Bar')
338
- k.ui.widget_list.widgets.should == k.get_data(:widgets).slice(:widget_a, :widget_b, :widget_c)
339
-
340
- k.ui.delete_widget(:widget_b)
341
- k.ui.widget_list.widgets.should == k.get_data(:widgets).slice(:widget_a, :widget_c)
321
+ Kookaburra.configure do |c|
322
+ c.ui_driver_class = MyUIDriver
323
+ c.given_driver_class = MyGivenDriver
324
+ c.app_host = 'http://127.0.0.1:%d' % @rack_server_port
325
+ c.browser = Capybara::Session.new(:selenium)
326
+ c.server_error_detection do |browser|
327
+ browser.has_css?('head title', :text => 'Internal Server Error')
328
+ end
329
+ end
330
+
331
+ extend Kookaburra::TestHelpers
332
+
333
+ given.a_user(:bob)
334
+ given.a_widget(:widget_a)
335
+ given.a_widget(:widget_b, :name => 'Foo')
336
+
337
+ ui.sign_in(:bob)
338
+ ui.view_widget_list
339
+ ui.widget_list.widgets.should == k.get_data(:widgets).slice(:widget_a, :widget_b)
340
+
341
+ ui.create_new_widget(:widget_c, :name => 'Bar')
342
+ ui.widget_list.widgets.should == k.get_data(:widgets).slice(:widget_a, :widget_b, :widget_c)
343
+
344
+ ui.delete_widget(:widget_b)
345
+ ui.widget_list.widgets.should == k.get_data(:widgets).slice(:widget_a, :widget_c)
342
346
  end
343
347
  end
344
348
  end
@@ -1,7 +1,9 @@
1
1
  require 'kookaburra/api_driver'
2
2
 
3
3
  describe Kookaburra::APIDriver do
4
- let(:api) { Kookaburra::APIDriver.new(:http_client => client) }
4
+ let(:configuration) { stub('Configuration', :app_host => 'http://example.com') }
5
+
6
+ let(:api) { Kookaburra::APIDriver.new(configuration, client) }
5
7
 
6
8
  let(:response) {
7
9
  stub('Patron::Response', :body => 'foo', :status => 200, :url => '/foo')
@@ -9,18 +11,18 @@ describe Kookaburra::APIDriver do
9
11
 
10
12
  let(:client) {
11
13
  mock('Patron::Session', :post => response, :get => response,
12
- :put => response, :delete => response)
14
+ :put => response, :delete => response, :base_url= => nil)
13
15
  }
14
16
 
15
17
  describe '#initialize' do
16
18
  it 'instantiates a new http client if no :http_client option is passed' do
17
19
  Patron::Session.should_receive(:new).and_return(stub.as_null_object)
18
- Kookaburra::APIDriver.new({})
20
+ Kookaburra::APIDriver.new(configuration)
19
21
  end
20
22
 
21
23
  it 'does not instantiate a new http client if an :http_client option is passed' do
22
24
  Patron::Session.should_receive(:new).never
23
- Kookaburra::APIDriver.new(:http_client => stub.as_null_object)
25
+ Kookaburra::APIDriver.new(configuration, client)
24
26
  end
25
27
  end
26
28
 
@@ -0,0 +1,18 @@
1
+ require 'kookaburra/configuration'
2
+ require 'support/shared_examples/it_has_a_dependency_accessor'
3
+
4
+ describe Kookaburra::Configuration do
5
+ it_behaves_like :it_has_a_dependency_accessor, :given_driver_class
6
+ it_behaves_like :it_has_a_dependency_accessor, :ui_driver_class
7
+ it_behaves_like :it_has_a_dependency_accessor, :browser
8
+ it_behaves_like :it_has_a_dependency_accessor, :app_host
9
+ it_behaves_like :it_has_a_dependency_accessor, :mental_model
10
+
11
+ describe '#server_error_detection' do
12
+ it 'returns the block that it was last given' do
13
+ block = lambda { 'foo' }
14
+ subject.server_error_detection(&block)
15
+ subject.server_error_detection.should == block
16
+ end
17
+ end
18
+ end
@@ -8,21 +8,27 @@ describe Kookaburra::JsonApiDriver do
8
8
  :delete => response, :headers => {})
9
9
  }
10
10
 
11
- let(:json) { Kookaburra::JsonApiDriver.new(:api_driver => api) }
11
+ let(:configuration) {
12
+ stub('Configuration')
13
+ }
14
+
15
+ let(:json) { Kookaburra::JsonApiDriver.new(stub('Configuration'), api) }
12
16
 
13
17
  describe '#initialize' do
14
18
  it 'instantiates a new APIDriver if no :api_driver option is passed' do
15
- Kookaburra::APIDriver.should_receive(:new).and_return(stub.as_null_object)
16
- Kookaburra::JsonApiDriver.new({})
19
+ Kookaburra::APIDriver.should_receive(:new) \
20
+ .with(configuration) \
21
+ .and_return(api)
22
+ Kookaburra::JsonApiDriver.new(configuration)
17
23
  end
18
24
 
19
25
  it 'does not instantiate a new APIDriver if an :api_driver option is passed' do
20
26
  Kookaburra::APIDriver.should_receive(:new).never
21
- Kookaburra::JsonApiDriver.new(:api_driver => stub.as_null_object)
27
+ Kookaburra::JsonApiDriver.new(configuration, api)
22
28
  end
23
29
 
24
30
  it 'sets appropriate headers for a JSON API request' do
25
- Kookaburra::JsonApiDriver.new(:api_driver => api)
31
+ Kookaburra::JsonApiDriver.new(configuration, api)
26
32
  api.headers.should == {
27
33
  'Content-Type' => 'application/json',
28
34
  'Accept' => 'application/json'
@@ -31,9 +37,7 @@ describe Kookaburra::JsonApiDriver do
31
37
  end
32
38
 
33
39
  it 'delegates to a Kookaburra::APIDriver by default' do
34
- delegate = stub('Kookaburra::APIDriver', :foo => :bar).as_null_object
35
- Kookaburra::APIDriver.should_receive(:new).once.and_return(delegate)
36
- json = Kookaburra::JsonApiDriver.new
40
+ api.stub!(:foo => :bar)
37
41
  json.foo.should == :bar
38
42
  end
39
43
 
@@ -0,0 +1,32 @@
1
+ require 'kookaburra/ui_driver/ui_component/address_bar'
2
+
3
+ describe Kookaburra::UIDriver::UIComponent::AddressBar do
4
+ describe '#go_to' do
5
+ let(:browser) {
6
+ mock('Capybara::Session').tap do |b|
7
+ b.should_receive(:visit).with('http://site.example.com')
8
+ end
9
+ }
10
+
11
+ let(:configuration) {
12
+ stub('Configuration', :browser => browser, :app_host => nil, :server_error_detection => nil)
13
+ }
14
+
15
+ let(:address_bar) {
16
+ address_bar = Kookaburra::UIDriver::UIComponent::AddressBar.new(configuration)
17
+ }
18
+
19
+ context 'when given a string' do
20
+ it 'causes the browser to navigate to the (presumably URL) string' do
21
+ address_bar.go_to 'http://site.example.com'
22
+ end
23
+ end
24
+
25
+ context 'when given a string' do
26
+ it 'causes the browser to navigate to the (presumably URL) string' do
27
+ addressable = stub('addressable', :url => 'http://site.example.com')
28
+ address_bar.go_to addressable
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,60 +1,31 @@
1
1
  require 'kookaburra/ui_driver/ui_component'
2
+ require 'support/shared_examples/it_can_make_assertions'
2
3
 
3
4
  describe Kookaburra::UIDriver::UIComponent do
4
- describe '#show' do
5
- context 'the component is not currently visible' do
6
- it 'causes the browser to navigate to the value of #component_path' do
7
- browser = mock('Browser Session')
8
- browser.should_receive(:visit).with('/foo')
9
- component = Kookaburra::UIDriver::UIComponent.new(:browser => browser)
10
- component.stub!(:component_path => '/foo')
11
- component.stub!(:visible?).and_return(false, true)
12
- component.show
13
- end
14
-
15
- it 'passes any arguments to the #component_path for processing' do
16
- browser = mock('Browser Session', :visit => nil)
17
- component = Kookaburra::UIDriver::UIComponent.new(:browser => browser)
18
- component.should_receive(:component_path).with(:foo => :bar, :baz => :bam)
19
- component.stub!(:visible?).and_return(false, true)
20
- component.show(:foo => :bar, :baz => :bam)
21
- end
22
- end
23
-
24
- context 'the component is already visible' do
25
- it 'does not navigate to #component path' do
26
- browser = mock('Browser Session')
27
- browser.should_receive(:visit).never
28
- component = Kookaburra::UIDriver::UIComponent.new(:browser => browser)
29
- component.stub!(:component_path => '/foo', :visible? => true)
30
- component.show
31
- end
32
- end
33
- end
5
+ let(:configuration) { stub('Configuration', :browser => nil, :app_host => nil, :server_error_detection => nil) }
6
+ let(:component) { Kookaburra::UIDriver::UIComponent.new(configuration) }
34
7
 
35
8
  describe '#respond_to?' do
36
- let(:component_class) do
37
- Class.new(Kookaburra::UIDriver::UIComponent) do
9
+ let(:component) do
10
+ klass = Class.new(Kookaburra::UIDriver::UIComponent) do
38
11
  def foo
39
12
  end
40
13
  end
14
+ klass.new(configuration)
41
15
  end
42
16
 
43
17
  it 'returns true if the UIComponent defines the specified method' do
44
- component = component_class.new
45
18
  component.respond_to?(:foo).should == true
46
19
  end
47
20
 
48
21
  it 'returns true if the #browser defines the specified method' do
49
22
  browser = stub('Browser Driver', :respond_to? => true)
50
- component = component_class.new
51
23
  component.stub!(:browser => browser)
52
24
  component.respond_to?(:a_very_unlikely_method_name).should == true
53
25
  end
54
26
 
55
27
  it 'returns false if neither the UIComponent nor the #browser define the specified method' do
56
28
  browser = stub('Browser Driver', :respond_to? => false)
57
- component = component_class.new
58
29
  component.stub!(:browser => browser)
59
30
  component.respond_to?(:a_very_unlikely_method_name).should == false
60
31
  end
@@ -71,7 +42,7 @@ describe Kookaburra::UIDriver::UIComponent do
71
42
  scope.should == '#my_component'
72
43
  block.call(browser)
73
44
  end
74
- component = Kookaburra::UIDriver::UIComponent.new(:browser => browser)
45
+ configuration.stub!(:browser => browser)
75
46
  component.stub!(:component_locator => '#my_component')
76
47
  component.some_browser_method(:arguments).should == :answer_from_browser
77
48
  end
@@ -79,7 +50,6 @@ describe Kookaburra::UIDriver::UIComponent do
79
50
 
80
51
  context 'the component says it does not respond to the method' do
81
52
  it 'raises a NoMethodError' do
82
- component = Kookaburra::UIDriver::UIComponent.new
83
53
  component.stub!(:respond_to? => false)
84
54
  lambda { component.no_such_method } \
85
55
  .should raise_error(NoMethodError)
@@ -93,41 +63,47 @@ describe Kookaburra::UIDriver::UIComponent do
93
63
  browser.should_receive(:has_css?) \
94
64
  .with('#my_component', :visible) \
95
65
  .and_return(true)
96
- component = Kookaburra::UIDriver::UIComponent.new(:browser => browser)
66
+ configuration.stub!(:browser => browser)
97
67
  component.stub!(:component_locator => '#my_component')
98
68
  component.visible?.should == true
99
69
  end
100
70
 
101
71
  it 'returns false if the component_locator id not found in the DOM' do
102
72
  browser = stub('Browser Driver', :has_css? => false)
103
- component = Kookaburra::UIDriver::UIComponent.new(
104
- :browser => browser,
105
- :server_error_detection => lambda { |browser|
106
- false
107
- }
108
- )
73
+ configuration.stub!(:browser => browser)
74
+ server_error_detection = lambda { |browser|
75
+ false
76
+ }
77
+ configuration.stub!(:server_error_detection => server_error_detection)
109
78
  component.stub!(:component_locator => '#my_component')
110
79
  component.visible?.should == false
111
80
  end
112
81
 
113
82
  it 'raises UnexpectedResponse if the component_locator is not found and a server error is detected' do
114
83
  browser = stub('Browser Driver', :has_css? => false)
115
- component = Kookaburra::UIDriver::UIComponent.new(
116
- :browser => browser,
117
- :server_error_detection => lambda { |browser|
118
- true
119
- }
120
- )
84
+ configuration.stub!(:browser => browser)
85
+ server_error_detection = lambda { |browser|
86
+ true
87
+ }
88
+ configuration.stub!(:server_error_detection => server_error_detection)
89
+ component.stub!(:component_locator => '#my_component')
121
90
  component.stub!(:component_locator => '#my_component')
122
91
  lambda { component.visible? } \
123
92
  .should raise_error(Kookaburra::UnexpectedResponse)
124
93
  end
125
94
  end
126
95
 
127
- describe 'private methods (for use by subclasses)' do
96
+ describe '#url' do
97
+ it 'returns the app_host + #component_path' do
98
+ configuration.stub!(:app_host => 'http://my.example.com')
99
+ component.stub!(:component_path => '/foo/bar')
100
+ component.url.should == 'http://my.example.com/foo/bar'
101
+ end
102
+ end
103
+
104
+ describe 'protected methods (for use by subclasses)' do
128
105
  describe '#component_path' do
129
106
  it 'must be defined by subclasses' do
130
- component = Kookaburra::UIDriver::UIComponent.new
131
107
  lambda { component.send(:component_path) } \
132
108
  .should raise_error(Kookaburra::ConfigurationError)
133
109
  end
@@ -135,23 +111,13 @@ describe Kookaburra::UIDriver::UIComponent do
135
111
 
136
112
  describe '#component_locator' do
137
113
  it 'must be defined by subclasses' do
138
- component = Kookaburra::UIDriver::UIComponent.new
139
114
  lambda { component.send(:component_locator) } \
140
115
  .should raise_error(Kookaburra::ConfigurationError)
141
116
  end
142
117
  end
143
118
 
144
- describe '#assert' do
145
- it 'returns true if the condition is truthy' do
146
- component = Kookaburra::UIDriver::UIComponent.new
147
- component.send(:assert, true, "Shouldn't see this message").should == true
148
- end
149
-
150
- it 'raises a Kookaburra::AssertionFailed exception if the condition is not truthy' do
151
- component = Kookaburra::UIDriver::UIComponent.new
152
- lambda { component.send(:assert, false, "False isn't true, dummy.") } \
153
- .should raise_error(Kookaburra::AssertionFailed, "False isn't true, dummy.")
154
- end
119
+ it_behaves_like :it_can_make_assertions do
120
+ let(:subject) { component }
155
121
  end
156
122
  end
157
123
  end
@@ -1,21 +1,20 @@
1
1
  require 'kookaburra/ui_driver'
2
2
  require 'support/shared_examples/it_has_a_dependency_accessor'
3
+ require 'support/shared_examples/it_can_make_assertions'
3
4
 
4
5
  describe Kookaburra::UIDriver do
5
6
  describe '.ui_component' do
6
7
  it 'adds an accessor method for the named component that defaults to an instance of the specified class' do
7
8
  foo_component_class = mock(Class)
8
9
  foo_component_class.should_receive(:new) \
9
- .with(:browser => :a_browser, :server_error_detection => :server_error_detection,
10
- :app_host => :a_url) \
10
+ .with(:configuration) \
11
11
  .and_return(:a_foo_component)
12
12
 
13
13
  ui_driver_class = Class.new(Kookaburra::UIDriver) do
14
14
  ui_component :foo, foo_component_class
15
15
  end
16
16
 
17
- ui = ui_driver_class.new(:browser => :a_browser, :server_error_detection => :server_error_detection,
18
- :app_host => :a_url)
17
+ ui = ui_driver_class.new(:configuration)
19
18
  ui.foo.should == :a_foo_component
20
19
  end
21
20
  end
@@ -24,23 +23,19 @@ describe Kookaburra::UIDriver do
24
23
  it 'adds an accessor method for the named driver that defaults to an instance of the specified class' do
25
24
  foo_driver_class = mock(Class)
26
25
  foo_driver_class.should_receive(:new) \
27
- .with(:browser => :a_browser, :server_error_detection => :server_error_detection,
28
- :app_host => :a_url, :mental_model => :a_mental_model) \
26
+ .with(:configuration) \
29
27
  .and_return(:a_foo_driver)
30
28
 
31
29
  ui_driver_class = Class.new(Kookaburra::UIDriver) do
32
30
  ui_driver :foo, foo_driver_class
33
31
  end
34
32
 
35
- ui = ui_driver_class.new(:browser => :a_browser, :server_error_detection => :server_error_detection,
36
- :app_host => :a_url, :mental_model => :a_mental_model)
33
+ ui = ui_driver_class.new(:configuration)
37
34
  ui.foo.should == :a_foo_driver
38
35
  end
39
36
  end
40
37
 
41
- describe 'dependency accessors' do
42
- let(:subject_class) { Kookaburra::UIDriver }
43
-
44
- it_behaves_like :it_has_a_dependency_accessor, :mental_model
38
+ it_behaves_like :it_can_make_assertions do
39
+ let(:subject) { Kookaburra::UIDriver.new(stub('Configuration')) }
45
40
  end
46
41
  end