kookaburra 0.0.4 → 0.1.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.1.0
data/kookaburra.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "kookaburra"
8
- s.version = "0.0.4"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Renewable Funding, LLC"]
12
- s.date = "2012-01-15"
12
+ s.date = "2012-01-16"
13
13
  s.description = "Cucumber + Capybara = Kookaburra? It made sense at the time."
14
14
  s.email = "devteam@renewfund.com"
15
15
  s.extra_rdoc_files = [
@@ -38,9 +38,9 @@ Gem::Specification.new do |s|
38
38
  "lib/kookaburra/ui_driver/mixins/has_subcomponents.rb",
39
39
  "lib/kookaburra/ui_driver/mixins/has_ui_component.rb",
40
40
  "lib/kookaburra/ui_driver/ui_component.rb",
41
- "lib/kookaburra/world_setup.rb",
42
41
  "lib/requires.rb",
43
- "test/helper.rb"
42
+ "test/helper.rb",
43
+ "test/kookaburra_test.rb"
44
44
  ]
45
45
  s.homepage = "http://github.com/projectdx/kookaburra"
46
46
  s.licenses = ["MIT"]
data/lib/kookaburra.rb CHANGED
@@ -1,19 +1,120 @@
1
1
  require File.join(File.dirname(__FILE__), *%w[requires])
2
2
 
3
+ # Kookaburra is a framework for implementing the WindowDriver pattern in order
4
+ # to keep acceptance tests maintainable.
5
+ #
6
+ # For RSpec integration tests, just add the following to
7
+ # `spec/support/kookaburra.rb`:
8
+ #
9
+ # RSpec.configure do |c|
10
+ # c.include(Kookaburra, :type => :request)
11
+ # end
12
+ #
13
+ # That will make #given, #api and #ui entry-points available to your examples,
14
+ # e.g.:
15
+ #
16
+ # describe "Widget Management" do
17
+ # describe "viewing a list of widgets" do
18
+ # example "when there are no widgets" do
19
+ # given.there_is_a_user(:bob)
20
+ # given.user_has_no_widgets(:bob)
21
+ #
22
+ # ui.log_in_as(:bob)
23
+ # ui.navigate_to(:list_of_widgets)
24
+ #
25
+ # ui.list_of_widgets.should be_visible
26
+ # ui.list_of_widgets.should be_empty
27
+ # end
28
+ # end
29
+ # end
30
+ #
31
+ # For Cucumber, add the following to `features/support/kookaburra_setup.rb`:
32
+ #
33
+ # Kookaburra.adapter = Capybara
34
+ # World(Kookaburra)
35
+ #
36
+ # Before do
37
+ # kookaburra_reset!
38
+ # end
39
+ #
40
+ # After doing to, the #api, #given and #ui methods will be available in your
41
+ # Cucumber step definitions.
42
+ #
43
+ # (Obviously, the specific methods on #given and #ui are something that will be
44
+ # unique to your application's domain.)
3
45
  module Kookaburra
4
- def self.drivers
5
- test_data = Kookaburra::TestData.new
6
- api_driver = Kookaburra::APIDriver.new({
7
- :app => Capybara.app,
8
- :test_data => test_data,
9
- })
10
- given_driver = Kookaburra::GivenDriver.new({
11
- :api_driver => api_driver,
12
- })
13
- ui_driver = Kookaburra::UIDriver.new({
14
- :browser => Capybara.current_session,
15
- :test_data => test_data,
16
- })
17
- { :api_driver => api_driver, :given_driver => given_driver, :ui_driver => ui_driver }
46
+ class << self
47
+ # Provides the default adapter for the Kookaburra library. In most cases,
48
+ # this will probably be the `Capybara` class:
49
+ #
50
+ # Kookaburra.adapter = Capybara
51
+ #
52
+ # We allow this to be passed in, so that we can avoid a hard-coded
53
+ # dependency on Capybara in this gem.
54
+ attr_accessor :adapter
55
+ end
56
+
57
+ # Whatever was set in `Kookaburra.adapter can be overriden in the mixin
58
+ # context. For example, in an RSpec example:
59
+ #
60
+ # describe "Something" do
61
+ # it "does something" do
62
+ # self.kookaburra_adapter = CapybaraLikeThing
63
+ # ...
64
+ # end
65
+ # end
66
+ #
67
+ attr_accessor :kookaburra_adapter
68
+
69
+ def kookaburra_adapter #:nodoc:
70
+ @kookaburra_adapter ||= Kookaburra.adapter
71
+ end
72
+
73
+ # Returns a configured instance of the `Kookaburra::APIDriver`
74
+ def api
75
+ kookaburra_drivers[:api] ||= Kookaburra::APIDriver.new(
76
+ :app => kookaburra_adapter.app,
77
+ :test_data => kookaburra_test_data)
78
+ end
79
+
80
+ # Returns a configured instance of the `Kookaburra::GivenDriver`
81
+ def given
82
+ kookaburra_drivers[:given] ||= Kookaburra::GivenDriver.new(:api_driver => api)
83
+ end
84
+
85
+ # Returns a configured instance of the `Kookaburra::UIDriver`
86
+ def ui
87
+ kookaburra_drivers[:ui] ||= Kookaburra::UIDriver.new(
88
+ :browser => kookaburra_adapter.current_session,
89
+ :test_data => kookaburra_test_data)
90
+ end
91
+
92
+ # This method causes new instances of all the Kookaburra drivers to be created
93
+ # the next time they are used, and, in particular, resets the state of any
94
+ # test data that is shared between the various drivers. This is necessary when
95
+ # Kookaburra is mixed in to Cucumber's World, because World does not get a new
96
+ # instance for each scenario. Instead, just be sure to call this method from a
97
+ # `Before` block in your cucumber setup, i.e.:
98
+ #
99
+ # Before do
100
+ # kookaburra_reset!
101
+ # end
102
+ def kookaburra_reset!
103
+ @kookaburra_drivers = {}
104
+ end
105
+
106
+ private
107
+
108
+ # The Kookaburra::TestData instance should not be used directly, but all of
109
+ # the drivers should reference the same instance.
110
+ def kookaburra_test_data
111
+ kookaburra_drivers[:test_data] ||= Kookaburra::TestData.new
112
+ end
113
+
114
+ # Holds references to all drivers in a single hash, so that
115
+ # Kookaburra#kookaburra_reset! can easily clear all Kookaburra state on the
116
+ # instance of the including class.
117
+ def kookaburra_drivers
118
+ @kookaburra_drivers ||= {}
18
119
  end
19
120
  end
@@ -1,3 +1,5 @@
1
+ require 'rack/test'
2
+
1
3
  module Kookaburra
2
4
  # Pattern:
3
5
  # - Get some data from test_data.factory
@@ -1,3 +1,5 @@
1
+ require 'active_support/hash_with_indifferent_access'
2
+
1
3
  # This is the mechanism for sharing state between Cucumber steps.
2
4
  # If you're using instance variables, YOU'RE DOING IT WRONG.
3
5
  module Kookaburra
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+
1
3
  module Kookaburra
2
4
  class UIDriver
3
5
  module HasStrategies
data/lib/requires.rb CHANGED
@@ -1,5 +1,3 @@
1
- require 'active_support/hash_with_indifferent_access'
2
-
3
1
  def kookaburra_require_glob(path_glob)
4
2
  Dir.glob(path_glob).each do |file|
5
3
  require file
data/test/helper.rb CHANGED
@@ -8,6 +8,7 @@ rescue Bundler::BundlerError => e
8
8
  exit e.status_code
9
9
  end
10
10
  require 'minitest/unit'
11
+ require 'minitest/autorun'
11
12
 
12
13
  $LOAD_PATH.unshift(File.dirname(__FILE__))
13
14
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
@@ -0,0 +1,111 @@
1
+ require 'helper'
2
+
3
+ describe Kookaburra do
4
+ describe 'as a mixin' do
5
+ let(:mixer_class) do
6
+ Class.new do
7
+ include Kookaburra
8
+ end
9
+ end
10
+
11
+ let(:mixer) do
12
+ mixer_class.new.tap do |m|
13
+ m.kookaburra_adapter = adapter
14
+ end
15
+ end
16
+
17
+ let(:mixer2) do
18
+ mixer_class.new.tap do |m|
19
+ m.kookaburra_adapter = adapter
20
+ end
21
+ end
22
+
23
+ let(:adapter) do
24
+ capybara_like_thing = Class.new do
25
+ def app
26
+ :an_application
27
+ end
28
+
29
+ def current_session
30
+ :a_current_session
31
+ end
32
+ end
33
+
34
+ capybara_like_thing.new
35
+ end
36
+
37
+ describe '#kookaburra_adapter' do
38
+ it 'is a read/write attribute' do
39
+ mixer = mixer_class.new
40
+ assert_nil mixer.kookaburra_adapter
41
+ mixer.kookaburra_adapter = :probably_Capybara
42
+ assert_equal :probably_Capybara, mixer.kookaburra_adapter
43
+ end
44
+ end
45
+
46
+ describe '#api' do
47
+ it 'is an instance of Kookaburra::APIDriver' do
48
+ assert_kind_of(Kookaburra::APIDriver, mixer.api)
49
+ end
50
+
51
+ it 'only creates a new one once for an instance of the including class' do
52
+ assert_same(mixer.api, mixer.api)
53
+ end
54
+
55
+ it 'is a different instance of APIDriver for each instance of the including class' do
56
+ refute_same mixer.api, mixer2.api
57
+ end
58
+ end
59
+
60
+ describe '#given' do
61
+ it 'is an instance of Kookaburra::GivenDriver' do
62
+ assert_kind_of(Kookaburra::GivenDriver, mixer.given)
63
+ end
64
+
65
+ it 'only creates a new one once for an instance of the including class' do
66
+ assert_same(mixer.given, mixer.given)
67
+ end
68
+
69
+ it 'is a different instance of GivenDriver for each instance of the including class' do
70
+ refute_same mixer.given, mixer2.given
71
+ end
72
+ end
73
+
74
+ describe '#ui' do
75
+ it 'is an instance of Kookaburra::UIDriver' do
76
+ assert_kind_of(Kookaburra::UIDriver, mixer.ui)
77
+ end
78
+
79
+ it 'only creates a new one once for an instance of the including class' do
80
+ assert_same(mixer.ui, mixer.ui)
81
+ end
82
+
83
+ it 'is a different instance of UIDriver for each instance of the including class' do
84
+ refute_same mixer.ui, mixer2.ui
85
+ end
86
+ end
87
+
88
+ describe '#kookaburra_reset!' do
89
+ it 'resets the api driver' do
90
+ api = mixer.api
91
+ mixer.kookaburra_reset!
92
+ api2 = mixer.api
93
+ refute_same api, api2
94
+ end
95
+
96
+ it 'resets the given driver' do
97
+ given = mixer.given
98
+ mixer.kookaburra_reset!
99
+ given2 = mixer.given
100
+ refute_same given, given2
101
+ end
102
+
103
+ it 'resets the ui driver' do
104
+ ui = mixer.ui
105
+ mixer.kookaburra_reset!
106
+ ui2 = mixer.ui
107
+ refute_same ui, ui2
108
+ end
109
+ end
110
+ end
111
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kookaburra
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 4
10
- version: 0.0.4
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Renewable Funding, LLC
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-15 00:00:00 Z
18
+ date: 2012-01-16 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  version_requirements: &id001 !ruby/object:Gem::Requirement
@@ -183,9 +183,9 @@ files:
183
183
  - lib/kookaburra/ui_driver/mixins/has_subcomponents.rb
184
184
  - lib/kookaburra/ui_driver/mixins/has_ui_component.rb
185
185
  - lib/kookaburra/ui_driver/ui_component.rb
186
- - lib/kookaburra/world_setup.rb
187
186
  - lib/requires.rb
188
187
  - test/helper.rb
188
+ - test/kookaburra_test.rb
189
189
  homepage: http://github.com/projectdx/kookaburra
190
190
  licenses:
191
191
  - MIT
@@ -1,12 +0,0 @@
1
- # Can't use a custom World class, because cucumber-rails is already doing that
2
- module Kookaburra
3
- module WorldSetup
4
- def ui; @drivers[:ui_driver ]; end
5
- def api; @drivers[:api_driver ]; end
6
- def given; @drivers[:given_driver]; end
7
-
8
- def kookaburra_world_setup
9
- @drivers = Kookaburra.drivers
10
- end
11
- end
12
- end