test-harness 0.1.0 → 0.2.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.1.0
1
+ 0.2.0
@@ -0,0 +1,6 @@
1
+ class TestHarness
2
+ class Configuration
3
+ attr_accessor :browser, :server_host
4
+
5
+ end
6
+ end
data/lib/given.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'test_helper'
2
+ class TestHarness
3
+ class Given
4
+ include TestHarness::TestHelper
5
+
6
+ Dir.glob(File.expand_path('../given/*.rb', __FILE__)).each do |file|
7
+ klass = ("TestHarness::Given::%s" % File.basename(file, '.rb').camelize).constantize
8
+ include klass
9
+ end
10
+ end
11
+ end
12
+
13
+
@@ -0,0 +1,5 @@
1
+ class TestHarness
2
+ class MentalModel < OpenStruct
3
+
4
+ end
5
+ end
data/lib/test_harness.rb CHANGED
@@ -0,0 +1,41 @@
1
+ require 'given'
2
+ require 'ui_component'
3
+
4
+ class TestHarness
5
+ class << self
6
+ def configuration
7
+ @configuation ||= Configuration.new
8
+ end
9
+
10
+ def configure(&block)
11
+ yield configuration
12
+ end
13
+
14
+ def given
15
+ @given ||= TestHarness::Given.new
16
+ end
17
+
18
+ def uiv
19
+ @uiv ||= TestHarness::UIView.new
20
+ end
21
+
22
+ def uid
23
+ @uid ||= TestHarness::UIDriver.new
24
+ end
25
+
26
+ def mm
27
+ @mm ||= TestHarness::MentalModel.new
28
+ end
29
+
30
+ def register_instance_option(scope, option_name, default_value = nil)
31
+ scope.send(:define_method, option_name) do |*args, &block|
32
+ if !args[0].nil? || block
33
+ instance_variable_set("@#{option_name}_registered", args[0].nil? ? block : args[0])
34
+ else
35
+ instance_variable_get("@#{option_name}_registered") || default_value || yield
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
@@ -0,0 +1,9 @@
1
+ class TestHarness
2
+ module TestHelper
3
+ delegate :configuration, :given, :uiv, :uid, :mm, :to => TestHarness
4
+
5
+ def browser
6
+ configuration.browser
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class TestHarness
2
+ class UIComponent
3
+ class << self
4
+ def component
5
+ @c ||= OpenStruct.new
6
+ yield @c if block_given?
7
+ @c
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,77 @@
1
+ class TestHarness
2
+ module UIComponentHelper
3
+ def component
4
+ self.class.parent.component
5
+ end
6
+
7
+ # If the UIComponent is sent a message it does not understand, it will
8
+ # forward that message on to its {#browser} but wrap the call in a block
9
+ # provided to the the browser's `#within` method. This provides convenient
10
+ # access to the browser driver's DSL, automatically scoped to this
11
+ # component.
12
+ def method_missing(name, *args, &block)
13
+ if respond_to?(name)
14
+ browser.within(component.within) do
15
+ browser.send(name, *args, &block)
16
+ end
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ # Since Kernel#select is defined, we have to override it specifically here.
23
+ def select(*args, &block)
24
+ browser.within(component.within) do
25
+ browser.select(*args, &block)
26
+ end
27
+ end
28
+
29
+ # We don't want to go through the method_missing above for visit, but go
30
+ # directly to the browser object
31
+ def visit(path)
32
+ path = "%s:%s%s" % [server_host, Capybara.server_port, path] if path !~ /^http/
33
+
34
+ browser.visit(path)
35
+ end
36
+
37
+ def show!
38
+ visit component_path
39
+ end
40
+
41
+ def component_path
42
+ component.path.gsub(/:\w+/) {|match| mm.subject.send(match.tr(':',''))}
43
+ end
44
+
45
+ def submit!
46
+ form_hash.each do |k,v|
47
+ fill_in k.to_s, :with => v
48
+ end
49
+
50
+ if has_css?(locator = component.submit)
51
+ find(:css, component.submit).click
52
+ else
53
+ click_on component.submit
54
+ end
55
+ end
56
+
57
+ def form_hash
58
+ form.instance_variable_get("@table")
59
+ end
60
+
61
+ def form
62
+ @form ||= OpenStruct.new
63
+ end
64
+
65
+ private
66
+ # @private
67
+ # (Not really private, but YARD seemingly lacks RDoc's :nodoc tag, and the
68
+ # semantics here don't differ from Object#respond_to?)
69
+ def respond_to?(name)
70
+ super || browser.respond_to?(name)
71
+ end
72
+
73
+ def server_host
74
+ configuration.server_host || Capybara.default_host || 'http://example.com'
75
+ end
76
+ end
77
+ end
data/lib/ui_driver.rb ADDED
@@ -0,0 +1,7 @@
1
+ class TestHarness
2
+ class UIDriver < TestHarness::UIHelper
3
+ register_ui_components
4
+ end
5
+ end
6
+
7
+
data/lib/ui_helper.rb ADDED
@@ -0,0 +1,13 @@
1
+ class TestHarness
2
+ class UIHelper
3
+ def self.register_ui_components
4
+ Dir.glob(File.expand_path('../ui/*.rb', __FILE__)).each do |file|
5
+ component = File.basename(file, '.rb')
6
+ klass = ("TestHarness::%s::%s" % [component.camelize, self.name.split('::').last]).constantize
7
+ TestHarness.register_instance_option(self, component, klass.new)
8
+ klass.send(:include, TestHarness::UIComponentHelper)
9
+ klass.send(:include, TestHarness::TestHelper)
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/ui_view.rb ADDED
@@ -0,0 +1,7 @@
1
+ class TestHarness
2
+ class UIView < TestHarness::UIHelper
3
+ register_ui_components
4
+ end
5
+ end
6
+
7
+
data/test-harness.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "test-harness"
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Maher Hawash"]
@@ -25,7 +25,16 @@ Gem::Specification.new do |s|
25
25
  "README.rdoc",
26
26
  "Rakefile",
27
27
  "VERSION",
28
+ "lib/configuration.rb",
29
+ "lib/given.rb",
30
+ "lib/mental_model.rb",
28
31
  "lib/test_harness.rb",
32
+ "lib/test_helper.rb",
33
+ "lib/ui_component.rb",
34
+ "lib/ui_component_helper.rb",
35
+ "lib/ui_driver.rb",
36
+ "lib/ui_helper.rb",
37
+ "lib/ui_view.rb",
29
38
  "spec/spec_helper.rb",
30
39
  "spec/test_harness_spec.rb",
31
40
  "test-harness.gemspec"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-harness
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Maher Hawash
@@ -91,7 +91,16 @@ files:
91
91
  - README.rdoc
92
92
  - Rakefile
93
93
  - VERSION
94
+ - lib/configuration.rb
95
+ - lib/given.rb
96
+ - lib/mental_model.rb
94
97
  - lib/test_harness.rb
98
+ - lib/test_helper.rb
99
+ - lib/ui_component.rb
100
+ - lib/ui_component_helper.rb
101
+ - lib/ui_driver.rb
102
+ - lib/ui_helper.rb
103
+ - lib/ui_view.rb
95
104
  - spec/spec_helper.rb
96
105
  - spec/test_harness_spec.rb
97
106
  - test-harness.gemspec