testable 0.3.0 → 0.8.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.
- checksums.yaml +5 -5
- data/.gitignore +37 -25
- data/.hound.yml +31 -12
- data/.rubocop.yml +4 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/Gemfile +3 -1
- data/{LICENSE.txt → LICENSE.md} +2 -2
- data/README.md +36 -17
- data/Rakefile +52 -11
- data/bin/console +2 -2
- data/bin/setup +0 -0
- data/examples/testable-capybara-context.rb +64 -0
- data/examples/testable-capybara-rspec.rb +70 -0
- data/examples/testable-capybara.rb +46 -0
- data/examples/testable-info.rb +65 -0
- data/examples/testable-watir-context.rb +67 -0
- data/examples/testable-watir-datasetter.rb +52 -0
- data/examples/testable-watir-events.rb +44 -0
- data/examples/testable-watir-ready.rb +34 -0
- data/examples/testable-watir-test.rb +80 -0
- data/examples/testable-watir.rb +118 -0
- data/lib/testable.rb +142 -10
- data/lib/testable/attribute.rb +38 -0
- data/lib/testable/capybara/dsl.rb +82 -0
- data/lib/testable/capybara/node.rb +30 -0
- data/lib/testable/capybara/page.rb +29 -0
- data/lib/testable/context.rb +73 -0
- data/lib/testable/deprecator.rb +40 -0
- data/lib/testable/element.rb +162 -31
- data/lib/testable/errors.rb +6 -2
- data/lib/testable/extensions/core_ruby.rb +13 -0
- data/lib/testable/extensions/data_setter.rb +144 -0
- data/lib/testable/extensions/dom_observer.js +58 -4
- data/lib/testable/extensions/dom_observer.rb +73 -0
- data/lib/testable/locator.rb +63 -0
- data/lib/testable/logger.rb +16 -0
- data/lib/testable/page.rb +216 -0
- data/lib/testable/ready.rb +49 -7
- data/lib/testable/situation.rb +9 -28
- data/lib/testable/version.rb +7 -6
- data/testable.gemspec +19 -9
- metadata +90 -23
- data/circle.yml +0 -3
- data/lib/testable/data_setter.rb +0 -51
- data/lib/testable/dom_update.rb +0 -19
- data/lib/testable/factory.rb +0 -27
- data/lib/testable/interface.rb +0 -114
data/lib/testable/situation.rb
CHANGED
@@ -20,13 +20,6 @@ module Testable
|
|
20
20
|
raise Testable::Errors::NoUrlForDefinition
|
21
21
|
end
|
22
22
|
|
23
|
-
def url_match_is_empty
|
24
|
-
puts "PROBLEM: url_matches attribute empty.\n" \
|
25
|
-
"The url_matches attribute is empty on the definition " \
|
26
|
-
"'#{retrieve_class(caller)}'.\n\n"
|
27
|
-
raise Testable::Errors::NoUrlMatchForDefinition
|
28
|
-
end
|
29
|
-
|
30
23
|
def no_url_match_is_possible
|
31
24
|
puts "PROBLEM: No url_is or url_matches attribute.\n" \
|
32
25
|
"You called a '#{retrieve_method(caller)}' action but the " \
|
@@ -35,6 +28,13 @@ module Testable
|
|
35
28
|
raise Testable::Errors::NoUrlMatchPossible
|
36
29
|
end
|
37
30
|
|
31
|
+
def url_match_is_empty
|
32
|
+
puts "PROBLEM: url_matches attribute empty.\n" \
|
33
|
+
"The url_matches attribute is empty on the definition " \
|
34
|
+
"'#{retrieve_class(caller)}'.\n\n"
|
35
|
+
raise Testable::Errors::NoUrlMatchForDefinition
|
36
|
+
end
|
37
|
+
|
38
38
|
def title_is_empty
|
39
39
|
puts "PROBLEM: title_is attribute empty.\n" \
|
40
40
|
"The title_is attribute is empty on the definition " \
|
@@ -49,13 +49,6 @@ module Testable
|
|
49
49
|
raise Testable::Errors::NoTitleForDefinition
|
50
50
|
end
|
51
51
|
|
52
|
-
def no_locator(definition, identifier)
|
53
|
-
puts "PROBLEM: No locator provided.\n" \
|
54
|
-
"You are using '#{identifier}' on '#{definition}'. " \
|
55
|
-
"But there is no locator provided with it.\n\n"
|
56
|
-
raise Testable::Errors::NoLocatorForDefinition
|
57
|
-
end
|
58
|
-
|
59
52
|
def not_ready_validation(message)
|
60
53
|
puts "PROBLEM: A ready validation error was encountered.\n" \
|
61
54
|
"A ready validation failed to validate. The ready check was " \
|
@@ -65,24 +58,12 @@ module Testable
|
|
65
58
|
raise Testable::Errors::PageNotValidatedError, message
|
66
59
|
end
|
67
60
|
|
68
|
-
def no_ready_check_possible
|
69
|
-
puts "PROBLEM: A when ready call has no action.\n" \
|
70
|
-
"You called a when_ready on a definition but did not provide " \
|
71
|
-
"any action for it. Add a block with logic that should be " \
|
72
|
-
"executed if the ready check passes.\n\n"
|
73
|
-
raise Testable::Errors::NoBlockForWhenReady
|
74
|
-
end
|
75
|
-
|
76
|
-
def retrieve_class(caller)
|
77
|
-
caller[1][/`.*'/][8..-3]
|
78
|
-
end
|
79
|
-
|
80
61
|
def retrieve_method(caller)
|
81
62
|
caller[0][/`.*'/][1..-2]
|
82
63
|
end
|
83
64
|
|
84
|
-
def
|
85
|
-
|
65
|
+
def retrieve_class(caller)
|
66
|
+
caller[1][/`.*'/][8..-3]
|
86
67
|
end
|
87
68
|
end
|
88
69
|
end
|
data/lib/testable/version.rb
CHANGED
@@ -1,24 +1,25 @@
|
|
1
1
|
module Testable
|
2
2
|
module_function
|
3
3
|
|
4
|
-
VERSION = "0.
|
4
|
+
VERSION = "0.8.0".freeze
|
5
5
|
|
6
6
|
def version
|
7
7
|
"""
|
8
8
|
Testable v#{Testable::VERSION}
|
9
9
|
watir: #{gem_version('watir')}
|
10
10
|
selenium-webdriver: #{gem_version('selenium-webdriver')}
|
11
|
+
capybara: #{gem_version('capybara')}
|
11
12
|
"""
|
12
13
|
end
|
13
14
|
|
14
|
-
def dependencies
|
15
|
-
Gem.loaded_specs.values.map { |spec| "#{spec.name} #{spec.version}\n" }
|
16
|
-
.uniq.sort.join(",").split(",")
|
17
|
-
end
|
18
|
-
|
19
15
|
def gem_version(name)
|
20
16
|
Gem.loaded_specs[name].version
|
21
17
|
rescue NoMethodError
|
22
18
|
puts "No gem loaded for #{name}."
|
23
19
|
end
|
20
|
+
|
21
|
+
def dependencies
|
22
|
+
Gem.loaded_specs.values.map { |spec| "#{spec.name} #{spec.version}\n" }
|
23
|
+
.uniq.sort.join(",").split(",")
|
24
|
+
end
|
24
25
|
end
|
data/testable.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require "testable/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "testable"
|
@@ -9,25 +8,36 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ["Jeff Nyman"]
|
10
9
|
spec.email = ["jeffnyman@gmail.com"]
|
11
10
|
|
12
|
-
spec.summary = %q{
|
11
|
+
spec.summary = %q{Web and API Automation, using Capybara and Watir}
|
13
12
|
spec.description = %q{Provides a semantic DSL to construct fluent interfaces for test execution logic.}
|
14
13
|
spec.homepage = "https://github.com/jeffnyman/testable"
|
15
14
|
spec.license = "MIT"
|
16
15
|
|
17
|
-
spec.
|
18
|
-
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = "https://github.com/jeffnyman/testable"
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/jeffnyman/testable/blob/master/CHANGELOG.md"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
23
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
24
|
end
|
20
25
|
spec.bindir = "exe"
|
21
26
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
27
|
spec.require_paths = ["lib"]
|
23
28
|
|
24
|
-
spec.
|
25
|
-
|
29
|
+
spec.required_ruby_version = ">= 2.3"
|
30
|
+
|
31
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
32
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
26
33
|
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
+
spec.add_development_dependency "simplecov"
|
27
35
|
spec.add_development_dependency "rubocop"
|
28
36
|
spec.add_development_dependency "pry"
|
29
37
|
|
30
|
-
spec.add_runtime_dependency "watir", "~> 6.
|
38
|
+
spec.add_runtime_dependency "watir", ["~> 6.16"]
|
39
|
+
spec.add_runtime_dependency "capybara", [">= 2", "< 4"]
|
40
|
+
spec.add_runtime_dependency "webdrivers", ["~> 4.0"]
|
31
41
|
|
32
42
|
spec.post_install_message = %{
|
33
43
|
(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: testable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Nyman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 12.3.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 12.3.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rubocop
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +100,48 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '6.
|
103
|
+
version: '6.16'
|
90
104
|
type: :runtime
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '6.
|
110
|
+
version: '6.16'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: capybara
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2'
|
118
|
+
- - "<"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '4'
|
121
|
+
type: :runtime
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '2'
|
128
|
+
- - "<"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '4'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: webdrivers
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - "~>"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '4.0'
|
138
|
+
type: :runtime
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - "~>"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '4.0'
|
97
145
|
description: Provides a semantic DSL to construct fluent interfaces for test execution
|
98
146
|
logic.
|
99
147
|
email:
|
@@ -106,22 +154,40 @@ files:
|
|
106
154
|
- ".hound.yml"
|
107
155
|
- ".rspec"
|
108
156
|
- ".rubocop.yml"
|
157
|
+
- ".travis.yml"
|
109
158
|
- CODE_OF_CONDUCT.md
|
110
159
|
- Gemfile
|
111
|
-
- LICENSE.
|
160
|
+
- LICENSE.md
|
112
161
|
- README.md
|
113
162
|
- Rakefile
|
114
163
|
- bin/console
|
115
164
|
- bin/setup
|
116
|
-
-
|
165
|
+
- examples/testable-capybara-context.rb
|
166
|
+
- examples/testable-capybara-rspec.rb
|
167
|
+
- examples/testable-capybara.rb
|
168
|
+
- examples/testable-info.rb
|
169
|
+
- examples/testable-watir-context.rb
|
170
|
+
- examples/testable-watir-datasetter.rb
|
171
|
+
- examples/testable-watir-events.rb
|
172
|
+
- examples/testable-watir-ready.rb
|
173
|
+
- examples/testable-watir-test.rb
|
174
|
+
- examples/testable-watir.rb
|
117
175
|
- lib/testable.rb
|
118
|
-
- lib/testable/
|
119
|
-
- lib/testable/
|
176
|
+
- lib/testable/attribute.rb
|
177
|
+
- lib/testable/capybara/dsl.rb
|
178
|
+
- lib/testable/capybara/node.rb
|
179
|
+
- lib/testable/capybara/page.rb
|
180
|
+
- lib/testable/context.rb
|
181
|
+
- lib/testable/deprecator.rb
|
120
182
|
- lib/testable/element.rb
|
121
183
|
- lib/testable/errors.rb
|
184
|
+
- lib/testable/extensions/core_ruby.rb
|
185
|
+
- lib/testable/extensions/data_setter.rb
|
122
186
|
- lib/testable/extensions/dom_observer.js
|
123
|
-
- lib/testable/
|
124
|
-
- lib/testable/
|
187
|
+
- lib/testable/extensions/dom_observer.rb
|
188
|
+
- lib/testable/locator.rb
|
189
|
+
- lib/testable/logger.rb
|
190
|
+
- lib/testable/page.rb
|
125
191
|
- lib/testable/ready.rb
|
126
192
|
- lib/testable/situation.rb
|
127
193
|
- lib/testable/version.rb
|
@@ -129,9 +195,12 @@ files:
|
|
129
195
|
homepage: https://github.com/jeffnyman/testable
|
130
196
|
licenses:
|
131
197
|
- MIT
|
132
|
-
metadata:
|
198
|
+
metadata:
|
199
|
+
homepage_uri: https://github.com/jeffnyman/testable
|
200
|
+
source_code_uri: https://github.com/jeffnyman/testable
|
201
|
+
changelog_uri: https://github.com/jeffnyman/testable/blob/master/CHANGELOG.md
|
133
202
|
post_install_message: "\n(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)\n
|
134
|
-
\ Testable 0.
|
203
|
+
\ Testable 0.8.0 has been installed.\n(::) (::) (::) (::) (::) (::) (::) (::) (::)
|
135
204
|
(::) (::) (::)\n "
|
136
205
|
rdoc_options: []
|
137
206
|
require_paths:
|
@@ -140,17 +209,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
140
209
|
requirements:
|
141
210
|
- - ">="
|
142
211
|
- !ruby/object:Gem::Version
|
143
|
-
version: '
|
212
|
+
version: '2.3'
|
144
213
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
214
|
requirements:
|
146
215
|
- - ">="
|
147
216
|
- !ruby/object:Gem::Version
|
148
217
|
version: '0'
|
149
218
|
requirements: []
|
150
|
-
|
151
|
-
rubygems_version: 2.5.1
|
219
|
+
rubygems_version: 3.1.2
|
152
220
|
signing_key:
|
153
221
|
specification_version: 4
|
154
|
-
summary:
|
155
|
-
logic.
|
222
|
+
summary: Web and API Automation, using Capybara and Watir
|
156
223
|
test_files: []
|
data/circle.yml
DELETED
data/lib/testable/data_setter.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
class Object
|
2
|
-
def chain(method_chain, arg = nil)
|
3
|
-
return self if method_chain.empty?
|
4
|
-
method_chain.split('.').inject(self) do |o, m|
|
5
|
-
if arg.nil?
|
6
|
-
o.send(m.intern)
|
7
|
-
else
|
8
|
-
o.send(m.intern, arg)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module Testable
|
15
|
-
module DataSetter
|
16
|
-
def using(data)
|
17
|
-
data.each do |key, value|
|
18
|
-
use_data_with(key, value) if object_enabled_for(key)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
alias using_data using
|
23
|
-
alias use_data using
|
24
|
-
alias using_values using
|
25
|
-
alias use_values using
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def use_data_with(key, value)
|
30
|
-
element = send(key.to_s)
|
31
|
-
set_and_select(key, element, value)
|
32
|
-
check_and_uncheck(key, element, value)
|
33
|
-
end
|
34
|
-
|
35
|
-
def set_and_select(key, element, value)
|
36
|
-
chain("#{key}.set", value) if element.class == Watir::TextField
|
37
|
-
chain("#{key}.set") if element.class == Watir::Radio
|
38
|
-
chain("#{key}.select", value) if element.class == Watir::Select
|
39
|
-
end
|
40
|
-
|
41
|
-
def check_and_uncheck(key, element, value)
|
42
|
-
return chain("#{key}.check") if element.class == Watir::CheckBox && value
|
43
|
-
chain("#{key}.uncheck") if element.class == Watir::CheckBox
|
44
|
-
end
|
45
|
-
|
46
|
-
def object_enabled_for(key)
|
47
|
-
web_element = send(key.to_s)
|
48
|
-
web_element.enabled? && web_element.visible?
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
data/lib/testable/dom_update.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Watir
|
2
|
-
class Element
|
3
|
-
OBSERVER_FILE = "/extensions/dom_observer.js".freeze
|
4
|
-
DOM_OBSERVER = File.read("#{File.dirname(__FILE__)}#{OBSERVER_FILE}").freeze
|
5
|
-
|
6
|
-
def dom_updated?(delay: 1.1)
|
7
|
-
driver.manage.timeouts.script_timeout = delay + 1
|
8
|
-
driver.execute_async_script(DOM_OBSERVER, wd, delay)
|
9
|
-
ensure
|
10
|
-
driver.manage.timeouts.script_timeout = 1
|
11
|
-
end
|
12
|
-
|
13
|
-
alias dom_updated dom_updated?
|
14
|
-
alias dom_is_updated dom_updated?
|
15
|
-
alias dom_is_changed dom_updated?
|
16
|
-
alias when_dom_updated dom_updated?
|
17
|
-
alias when_dom_changed dom_updated?
|
18
|
-
end
|
19
|
-
end
|
data/lib/testable/factory.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Testable
|
2
|
-
module Factory
|
3
|
-
# Creates a definition context for actions. If an existing context
|
4
|
-
# exists, that context will be re-used.
|
5
|
-
def on(definition, visit = false, &block)
|
6
|
-
unless @context.is_a?(definition)
|
7
|
-
@context = definition.new(@browser) if @browser
|
8
|
-
@context = definition.new unless @browser
|
9
|
-
@context.visit if visit
|
10
|
-
end
|
11
|
-
|
12
|
-
yield @context if block
|
13
|
-
@context
|
14
|
-
end
|
15
|
-
|
16
|
-
alias on_page on
|
17
|
-
alias while_on on
|
18
|
-
|
19
|
-
# Creates a definition context for actions and establishes the
|
20
|
-
# context for execution.
|
21
|
-
def on_view(definition, &block)
|
22
|
-
on(definition, true, &block)
|
23
|
-
end
|
24
|
-
|
25
|
-
alias on_visit on_view
|
26
|
-
end
|
27
|
-
end
|