ferris_watir 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e3144b5948fc00256b3135d0d1c0f61f1497fa67
4
+ data.tar.gz: a63d82bc5af9f8377c1656590d8be5b24f27e189
5
+ SHA512:
6
+ metadata.gz: 6800843dbcd76f05a19662550c01e534f6282ba884979db15adc191b4812c0c17756932495b09496c87a64fcc2515d11dd92e1b13462addc8f222e9ea2a9a4e2
7
+ data.tar.gz: 48297a6ceb0877bcdd5ff9cb7c8b918601b8d375b3b428d12770d507c6810ff97b0590e85f39b722134ef019e42b1f96739992745a31ed0b491ad4a4ce7d7c9e
@@ -0,0 +1,3 @@
1
+ ### 0.1.0 (2017-01-17)
2
+
3
+ * initial commit
@@ -0,0 +1,6 @@
1
+ # Ferris
2
+
3
+ ## Synopsis
4
+
5
+ An un-opinionated testing framework built on top of WATIR which provides massive power with minimal DSL.
6
+
@@ -0,0 +1,2 @@
1
+ require 'watir'
2
+ require 'ferris/core'
@@ -0,0 +1,153 @@
1
+ module Ferris
2
+ module Browser
3
+ class << self
4
+ attr_accessor :browser
5
+ end
6
+
7
+ def browser
8
+ Browser.browser
9
+ end
10
+ end
11
+
12
+ module Region
13
+ def base_url(url = nil)
14
+ @base_url ||= url
15
+ end
16
+
17
+ def region(name, class_name, &blk)
18
+ define_method("#{name}_region_object") do
19
+ class_name.base_url = self.class.base_url
20
+ class_name.new.tap do |region|
21
+ if block_given?
22
+ root = self.instance_exec(&blk)
23
+ return root.map {|root| class_name.new.tap {|region| region.root = root} } if root.respond_to?(:to_a)
24
+ region.root = root
25
+ end
26
+ end
27
+ end
28
+ self.instance_eval { private "#{name}_region_object" }
29
+
30
+ define_method("#{name}!") { self.class.region_list["@_#{name}"] ||= send("#{name}_region_object") }
31
+ define_method(name) { self.class.region_list["@_#{name}"] = send("#{name}_region_object") }
32
+
33
+ # TODO: Convert to .present? use
34
+ define_method("#{name}_present?") { [send(name)].flatten.map(&:root).map(&:present?).all? }
35
+ end
36
+ alias_method :page, :region
37
+
38
+ def region_list
39
+ @regions ||= {}
40
+ end
41
+ end
42
+
43
+ class Core
44
+ extend Region
45
+ include Watir::Waitable
46
+
47
+ attr_reader :browser, :base_url
48
+ attr_accessor :root
49
+
50
+ def initialize(browser = Browser.browser)
51
+ @browser = browser
52
+ @base_url = self.class.base_url || ''
53
+ end
54
+
55
+ def inspect
56
+ '#<%s url=%s title=%s>' % [self.class, url.inspect, title.inspect]
57
+ end
58
+ alias selector_string inspect
59
+
60
+ def present?
61
+ raise 'No root element set.' unless root
62
+ root.present?
63
+ end
64
+
65
+ def visit(*args)
66
+ browser.goto page_url(*args)
67
+ exception = Selenium::WebDriver::Error::WebDriverError
68
+ message = "Expected to be on #{self.class}, but conditions not met"
69
+ raise exception, message if verifiable? && !loaded?
70
+ self
71
+ end
72
+
73
+ def verifiable?
74
+ self.class.require_url || self.respond_to?(:page_title) || self.class.required_element_list.any?
75
+ end
76
+
77
+ def loaded?
78
+ raise Selenium::WebDriver::Error::WebDriverError, 'Cannot verify a page/region without requirements' unless page_verifiable?
79
+ [!self.class.require_url || check_url, !respond_to?(:page_title) || check_title, !self.class.required_element_list.any? || check_required_elements].all?
80
+ end
81
+
82
+ def check_url
83
+ page_url[%r{^#{URI.parse(page_url).scheme}://(.*?)/?$}, 1] == browser.url[%r{^#{URI.parse(browser.url).scheme}://(.*?)/?$}, 1]
84
+ end
85
+
86
+ def check_title
87
+ browser.title == page_title
88
+ end
89
+
90
+ def check_required_elements
91
+ browser.wait_until { |_b| self.class.required_element_list.all? { |e| send(e).present? } }
92
+ rescue Watir::Wait::TimeoutError
93
+ false
94
+ end
95
+
96
+ class << self
97
+ attr_writer :required_element_list
98
+ attr_reader :require_url
99
+ attr_accessor :base_url
100
+
101
+ def page_url(required: false)
102
+ @require_url = required
103
+ define_method('page_url') {|*args| base_url + yield(*args) }
104
+ end
105
+ alias_method :partial_url, :page_url
106
+
107
+ def page_title
108
+ define_method('page_title') {|*args| yield(*args) }
109
+ end
110
+
111
+ def required_element_list
112
+ @required_element_list ||= []
113
+ end
114
+
115
+ def inherited(subclass)
116
+ subclass.required_element_list = required_element_list.dup
117
+ end
118
+
119
+ def element(name, required: false, &block)
120
+ define_method(name) {|*args| self.instance_exec(*args, &block) }
121
+ required_element_list << name.to_sym if required
122
+ end
123
+ end
124
+ end
125
+
126
+ module SiteObject
127
+ def self.configure(&blk)
128
+ raise 'Must provide block with defined regions' unless block_given?
129
+ last_defined_class = defined_classes.last
130
+ last_defined_class.include Browser
131
+ last_defined_class.extend Region
132
+ last_defined_class.instance_exec(&blk)
133
+ end
134
+
135
+ def self.defined_classes
136
+ self.constants.select {|k| self.const_get(k).is_a? Class }.map {|class_name| Object.const_get("#{self.to_s}::#{class_name.to_s}") }
137
+ end
138
+
139
+ def self.included(_kls)
140
+ @@defined_classes = defined_classes
141
+ end
142
+
143
+ def method_missing(name, *arg, &blk)
144
+ @@defined_classes.each {|class_name| return class_name.new.send(name, *arg, &blk) if class_name.new.respond_to?(name) }
145
+ super
146
+ end
147
+
148
+ def respond_to_missing?(method_name, _include_private = false)
149
+ @@defined_classes.each {|class_name| return true if class_name.new.respond_to?(method_name)}
150
+ super
151
+ end
152
+ end
153
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ferris_watir
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Automation Wizards
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-02-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: watir
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 6.0.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: watir_model
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 3.5.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.5.0
55
+ description: 'An un-opinionated testing framework built on top of WATIR which provides
56
+ massive power with minimal DSL. '
57
+ email:
58
+ - Justin.Commu@loblaw.ca
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - CHANGES.md
64
+ - README.md
65
+ - lib/ferris.rb
66
+ - lib/ferris/core.rb
67
+ homepage: https://loblawdigital.ca
68
+ licenses:
69
+ - MIT
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project:
87
+ rubygems_version: 2.6.7
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: Next level web testing framework
91
+ test_files: []