watirmark 5.14.16 → 5.27.2
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 +7 -0
- data/bin/watirmark +2 -8
- data/generators/new_project/generator.rb +58 -0
- data/{app_generators/create_project/templates/project → generators/new_project/templates}/config.yml.erb +0 -0
- data/{app_generators/create_project → generators/new_project}/templates/features/env.rb.erb +0 -0
- data/{app_generators/create_project → generators/new_project}/templates/features/model_steps.rb.erb +0 -0
- data/{app_generators/create_project → generators/new_project}/templates/features/post_error_steps.rb.erb +0 -0
- data/{app_generators/create_project → generators/new_project}/templates/features/sample.feature.erb +0 -0
- data/{app_generators/create_project → generators/new_project}/templates/features/site_steps.rb.erb +0 -0
- data/generators/new_project/templates/gemfile.rb.erb +10 -0
- data/generators/new_project/templates/generators/mvc/generator.rb.erb +61 -0
- data/generators/new_project/templates/generators/mvc/templates/controller.rb.erb +9 -0
- data/generators/new_project/templates/generators/mvc/templates/model.rb.erb +7 -0
- data/generators/new_project/templates/generators/mvc/templates/view.rb.erb +16 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib}/configuration.rb.erb +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib}/core_libraries.rb.erb +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib}/loader.rb.erb +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib/name/checkers}/page_load_checker.rb.erb +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib/name/checkers}/post_errors_checker.rb.erb +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib/name/site}/base_controller.rb.erb +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib/name/site}/base_view.rb.erb +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib/name/site}/search_controller.rb.erb +0 -0
- data/{app_generators/create_project/templates/library/project_require_file.rb.erb → generators/new_project/templates/lib/name.rb.erb} +0 -0
- data/{app_generators/create_project/templates/library → generators/new_project/templates/lib}/workflows.rb.erb +0 -0
- data/{app_generators/create_project/templates/project → generators/new_project/templates}/rakefile.rb.erb +1 -1
- data/generators/new_project/templates/script/generate.rb.erb +4 -0
- data/lib/watirmark/at_exit.rb +5 -9
- data/lib/watirmark/configuration.rb +7 -2
- data/lib/watirmark/controller/actions.rb +35 -12
- data/lib/watirmark/controller/controller.rb +8 -4
- data/lib/watirmark/controller/dialogs.rb +3 -3
- data/lib/watirmark/cucumber/email_helper.rb +19 -0
- data/lib/watirmark/cucumber/env.rb +6 -5
- data/lib/watirmark/cucumber/hook_helper.rb +38 -0
- data/lib/watirmark/cucumber/hooks.rb +13 -8
- data/lib/watirmark/cucumber/load_cached_models.rb +9 -0
- data/lib/watirmark/cucumber/model_helper.rb +4 -4
- data/lib/watirmark/cucumber/transforms.rb +3 -1
- data/lib/watirmark/extensions/ruby_extensions.rb +8 -0
- data/lib/watirmark/extensions/webdriver_extensions.rb +38 -3
- data/lib/watirmark/formatters/snapshot_formatter.rb +3 -0
- data/lib/watirmark/models/cucumber_helper.rb +12 -5
- data/lib/watirmark/models/factory.rb +35 -2
- data/lib/watirmark/page/page.rb +1 -0
- data/lib/watirmark/page/page_definition.rb +7 -5
- data/lib/watirmark/profile.rb +2 -2
- data/lib/watirmark/rake/smoketest.rb +6 -4
- data/lib/watirmark/screenshot.rb +3 -8
- data/lib/watirmark/session.rb +105 -9
- data/lib/watirmark/version.rb +1 -1
- data/lib/watirmark.rb +1 -8
- data/spec/config_spec.rb +45 -37
- data/spec/controller_actions_spec.rb +70 -7
- data/spec/controller_spec.rb +103 -83
- data/spec/model_factory_spec.rb +191 -8
- data/spec/model_traits_spec.rb +5 -0
- data/spec/page_spec.rb +10 -2
- data/spec/process_page_spec.rb +3 -3
- data/spec/session_spec.rb +56 -0
- data/spec/spec_helper.rb +1 -1
- metadata +146 -142
- data/app_generators/create_project/create_project_generator.rb +0 -115
- data/app_generators/create_project/templates/generators/controller.rb.erb +0 -9
- data/app_generators/create_project/templates/generators/generate.rb.erb +0 -9
- data/app_generators/create_project/templates/generators/model.rb.erb +0 -7
- data/app_generators/create_project/templates/generators/mvc_generator.rb.erb +0 -100
- data/app_generators/create_project/templates/generators/rbeautify.rb.erb +0 -212
- data/app_generators/create_project/templates/generators/view.rb.erb +0 -16
- data/app_generators/create_project/templates/generators/workflow_loader.rb.erb +0 -1
- data/app_generators/create_project/templates/project/gemfile.rb.erb +0 -11
- data/bin/etapestry/Gemfile +0 -11
- data/bin/etapestry/config.yml +0 -3
- data/bin/etapestry/features/etapestry_home.feature +0 -5
- data/bin/etapestry/features/step_definitions/model_steps.rb +0 -9
- data/bin/etapestry/features/step_definitions/post_error_steps.rb +0 -15
- data/bin/etapestry/features/step_definitions/site_steps.rb +0 -7
- data/bin/etapestry/features/support/env.rb +0 -8
- data/bin/etapestry/generators/mvc/mvc_generator.rb +0 -100
- data/bin/etapestry/generators/mvc/rbeautify.rb +0 -212
- data/bin/etapestry/generators/mvc/templates/controller.rb.erb +0 -9
- data/bin/etapestry/generators/mvc/templates/model.rb.erb +0 -7
- data/bin/etapestry/generators/mvc/templates/view.rb.erb +0 -16
- data/bin/etapestry/generators/mvc/templates/workflow_loader.rb.erb +0 -1
- data/bin/etapestry/lib/etapestry/checkers/page_load_checker.rb +0 -11
- data/bin/etapestry/lib/etapestry/checkers/post_errors_checker.rb +0 -23
- data/bin/etapestry/lib/etapestry/configuration.rb +0 -6
- data/bin/etapestry/lib/etapestry/core_libraries.rb +0 -9
- data/bin/etapestry/lib/etapestry/loader.rb +0 -23
- data/bin/etapestry/lib/etapestry/site/base_controller.rb +0 -9
- data/bin/etapestry/lib/etapestry/site/base_view.rb +0 -6
- data/bin/etapestry/lib/etapestry/site/search_controller.rb +0 -12
- data/bin/etapestry/lib/etapestry/workflows.rb +0 -0
- data/bin/etapestry/lib/etapestry.rb +0 -8
- data/bin/etapestry/rakefile.rb +0 -21
- data/bin/etapestry/script/generate.rb +0 -9
- data/bin/twitter/features/hashtag_search.feature +0 -93
- data/bin/twitter/features/step_definitions/hashtag_steps.rb +0 -9
- data/bin/twitter/lib/twitter/workflows/search/result_controller.rb +0 -13
- data/bin/twitter/lib/twitter/workflows/search/result_model.rb +0 -5
- data/bin/twitter/lib/twitter/workflows/search/result_view.rb +0 -19
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 2cd92d1a9b252f89b9bd5d392fd880321ea5eee0
|
|
4
|
+
data.tar.gz: 87d2a5c9088b3c8eaa7fe58fdc51618de4b56c19
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: ffd2177cd8b04c599fb803f4ab52e611b85da37a3ac8c72547549d693475084b342c43c769eee7a3c3a449e9196bedea140d43765462400826333770c9d3ec2d
|
|
7
|
+
data.tar.gz: 9b45889cebcc93fb2c6f5124e9d191f152c6443e2e94ec32cd9b6b23c04aea862c9b3df5113aebff0296be548301d9ac1ce47c660657f62dab7a7068e036051e
|
data/bin/watirmark
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
-
$:<< File.dirname(__FILE__)
|
|
3
2
|
|
|
4
|
-
require '
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
source = RubiGen::PathSource.new(:application, File.join(File.dirname(__FILE__), "../app_generators"))
|
|
8
|
-
RubiGen::Base.reset_sources
|
|
9
|
-
RubiGen::Base.append_sources source
|
|
10
|
-
RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'create_project')
|
|
3
|
+
require File.expand_path('../../generators/new_project/generator', __FILE__)
|
|
4
|
+
NewProject.start
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'thor/group'
|
|
2
|
+
require 'active_support/inflector'
|
|
3
|
+
|
|
4
|
+
class NewProject < Thor::Group
|
|
5
|
+
include Thor::Actions
|
|
6
|
+
|
|
7
|
+
argument :name, banner: 'creates new test project'
|
|
8
|
+
|
|
9
|
+
def self.source_root
|
|
10
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def root_files
|
|
14
|
+
template "gemfile.rb.erb", "#{name}/Gemfile"
|
|
15
|
+
template "config.yml.erb", "#{name}/config.yml"
|
|
16
|
+
template "rakefile.rb.erb", "#{name}/rakefile.rb"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def lib_files
|
|
20
|
+
template "lib/configuration.rb.erb", File.join(name, "lib", name, "configuration.rb")
|
|
21
|
+
template "lib/workflows.rb.erb", File.join(name, "lib", name, "workflows.rb")
|
|
22
|
+
template "lib/core_libraries.rb.erb", File.join(name, "lib", name, "core_libraries.rb")
|
|
23
|
+
template "lib/loader.rb.erb", File.join(name, "lib", name, "loader.rb")
|
|
24
|
+
template "lib/name.rb.erb", File.join(name, "lib", "#{name}.rb")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def lib_checkers_files
|
|
28
|
+
template "lib/name/checkers/page_load_checker.rb.erb", File.join(name, "lib", name, "checkers", "page_load_checker.rb")
|
|
29
|
+
template "lib/name/checkers/post_errors_checker.rb.erb", File.join(name, "lib", name, "checkers", "post_errors_checker.rb")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def lib_site_files
|
|
33
|
+
template "lib/name/site/base_controller.rb.erb", File.join(name, "lib", name, "site", "base_controller.rb")
|
|
34
|
+
template "lib/name/site/search_controller.rb.erb", File.join(name, "lib", name, "site", "search_controller.rb")
|
|
35
|
+
template "lib/name/site/base_view.rb.erb", File.join(name, "lib", name, "site", "base_view.rb")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def features_files
|
|
39
|
+
template "features/model_steps.rb.erb", File.join(name, "features", "step_definitions", "model_steps.rb")
|
|
40
|
+
template "features/post_error_steps.rb.erb", File.join(name, "features", "step_definitions", "post_error_steps.rb")
|
|
41
|
+
template "features/site_steps.rb.erb", File.join(name, "features", "step_definitions", "site_steps.rb")
|
|
42
|
+
template "features/env.rb.erb", File.join(name, "features", "support", "env.rb")
|
|
43
|
+
template "features/sample.feature.erb", File.join(name, "features", "#{name}_home.feature")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def script_files
|
|
47
|
+
template "script/generate.rb.erb", File.join(name, "script", "generate.rb")
|
|
48
|
+
chmod File.join(name, "script", "generate.rb"), 0755
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def generators_mvc_files
|
|
52
|
+
template "generators/mvc/generator.rb.erb", File.join(name, "generators", "mvc", "generator.rb")
|
|
53
|
+
|
|
54
|
+
template "generators/mvc/templates/controller.rb.erb", File.join(name, "generators", "mvc", "templates", "controller.rb.erb")
|
|
55
|
+
template "generators/mvc/templates/model.rb.erb", File.join(name, "generators", "mvc", "templates", "model.rb.erb")
|
|
56
|
+
template "generators/mvc/templates/view.rb.erb", File.join(name, "generators", "mvc", "templates", "view.rb.erb")
|
|
57
|
+
end
|
|
58
|
+
end
|
|
File without changes
|
|
File without changes
|
data/{app_generators/create_project → generators/new_project}/templates/features/model_steps.rb.erb
RENAMED
|
File without changes
|
|
File without changes
|
data/{app_generators/create_project → generators/new_project}/templates/features/sample.feature.erb
RENAMED
|
File without changes
|
data/{app_generators/create_project → generators/new_project}/templates/features/site_steps.rb.erb
RENAMED
|
File without changes
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
require 'active_support/inflector'
|
|
3
|
+
|
|
4
|
+
class MvcGenerator < Thor
|
|
5
|
+
|
|
6
|
+
attr_accessor :product, :name
|
|
7
|
+
|
|
8
|
+
def self.source_root
|
|
9
|
+
File.join(File.dirname(__FILE__), 'templates')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
include Thor::Actions
|
|
13
|
+
|
|
14
|
+
desc "mvc WORKFLOW BASENAME", "creates model view controller in your project workflow directory"
|
|
15
|
+
|
|
16
|
+
def mvc(product, name)
|
|
17
|
+
|
|
18
|
+
self.product = product
|
|
19
|
+
self.name = name
|
|
20
|
+
|
|
21
|
+
template "model.rb.erb", File.join(workflows_path, product, "#{name}_model.rb")
|
|
22
|
+
template "view.rb.erb", File.join(workflows_path, product, "#{name}_view.rb")
|
|
23
|
+
template "controller.rb.erb", File.join(workflows_path, product, "#{name}_controller.rb")
|
|
24
|
+
|
|
25
|
+
append_to_file "#{workflows_path}/../workflows.rb" do
|
|
26
|
+
"#{workflow_loader} '#{product.downcase}/#{name.downcase}'\n"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
no_commands do
|
|
32
|
+
|
|
33
|
+
def workflows_path
|
|
34
|
+
"lib/<%= name.downcase %>/workflows"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def workflow_loader
|
|
38
|
+
"<%= name.camelize %>::Loader.load_workflow"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def create_modules
|
|
42
|
+
product.split('/').zip(indents).map { |e| "#{e[1]}module #{e[0].camelize}" }.join("\n").rstrip
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# for workflow a/b/c returns ["", " ", " "] spaces for formatting output plus initial indentation
|
|
46
|
+
def indents
|
|
47
|
+
@indents ||= indents_calc_and_format
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def indents_calc_and_format
|
|
51
|
+
i = []
|
|
52
|
+
product.split('/').each_index { |e| i << e * 2 }
|
|
53
|
+
i.map { |e| "\s" * e }.map { |e| "\s\s#{e}" }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def create_module_end
|
|
57
|
+
indents.reverse.map { |e| "#{e}end" }.join("\n")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module <%= @name.camelize %>
|
|
2
|
+
<%%= create_modules %>
|
|
3
|
+
<%%= indents.last %>class <%%= name.camelize %> < BaseController
|
|
4
|
+
<%%= indents.last %> @model = <%%= name.camelize %>Model
|
|
5
|
+
<%%= indents.last %> @view = <%%= name.camelize %>View
|
|
6
|
+
<%%= indents.last %>end
|
|
7
|
+
<%%= create_module_end %>
|
|
8
|
+
end
|
|
9
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module <%= name.camelize %>
|
|
2
|
+
<%%= create_modules %>
|
|
3
|
+
<%%= indents.last %>class <%%= name.camelize %>View < BaseView
|
|
4
|
+
<%%= indents.last %> keyword(:keyword_name) { browser.text_field(:id, 'element_id') }
|
|
5
|
+
|
|
6
|
+
<%%= indents.last %> def home(model)
|
|
7
|
+
<%%= indents.last %> end
|
|
8
|
+
|
|
9
|
+
<%%= indents.last %> def create(model)
|
|
10
|
+
<%%= indents.last %> end
|
|
11
|
+
|
|
12
|
+
<%%= indents.last %> def edit(model)
|
|
13
|
+
<%%= indents.last %> end
|
|
14
|
+
<%%= indents.last %>end
|
|
15
|
+
<%%= create_module_end %>
|
|
16
|
+
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -14,7 +14,7 @@ require 'cucumber/rake/task'
|
|
|
14
14
|
module RakeHelper
|
|
15
15
|
def self.cucumber_task(task_name, files=nil)
|
|
16
16
|
Cucumber::Rake::Task.new(task_name) do |t|
|
|
17
|
-
t.cucumber_opts = "-r features #{FileList[files]} -b --format html -o
|
|
17
|
+
t.cucumber_opts = "-r features #{FileList[files]} -b --format html -o cucumber_#{task_name}.html --format pretty"
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
end
|
data/lib/watirmark/at_exit.rb
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
module Watirmark
|
|
2
|
-
def self.add_exit_task
|
|
2
|
+
def self.add_exit_task
|
|
3
3
|
at_exit {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
code = $!.is_a?(SystemExit) ? $!.status : 1
|
|
8
|
-
end
|
|
9
|
-
block.call
|
|
10
|
-
exit code
|
|
4
|
+
code = $watirmark_exit
|
|
5
|
+
yield if block_given?
|
|
6
|
+
exit code if code
|
|
11
7
|
}
|
|
12
8
|
end
|
|
13
|
-
end
|
|
9
|
+
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'singleton'
|
|
2
2
|
require 'logger'
|
|
3
|
+
require 'yaml'
|
|
3
4
|
|
|
4
5
|
module Watirmark
|
|
5
6
|
|
|
@@ -21,6 +22,7 @@ module Watirmark
|
|
|
21
22
|
:loglevel => Logger::INFO,
|
|
22
23
|
:uuid => nil,
|
|
23
24
|
:webdriver => :firefox,
|
|
25
|
+
:headless => false,
|
|
24
26
|
# database
|
|
25
27
|
:dbhostname => nil,
|
|
26
28
|
:dbusername => nil,
|
|
@@ -30,8 +32,10 @@ module Watirmark
|
|
|
30
32
|
# snapshots
|
|
31
33
|
:snapshotwidth => 1000,
|
|
32
34
|
:snapshotheight => 1000,
|
|
33
|
-
:sandbox => false,
|
|
34
35
|
:projectpath => nil,
|
|
36
|
+
:sauce_username => nil,
|
|
37
|
+
:sauce_access_key => nil,
|
|
38
|
+
:dbi_url => nil,
|
|
35
39
|
|
|
36
40
|
#to deprecate
|
|
37
41
|
:profile => Hash.new { |h, k| h[k] = Hash.new },
|
|
@@ -109,12 +113,13 @@ module Watirmark
|
|
|
109
113
|
def read_from_environment
|
|
110
114
|
@settings.each_key do |var|
|
|
111
115
|
next if var.to_s.upcase == "USERNAME"
|
|
116
|
+
next if var.to_s.upcase == "HOSTNAME" && self.hostname
|
|
112
117
|
env = ENV[var.to_s.upcase]
|
|
113
118
|
if var == :webdriver
|
|
114
119
|
ENV['JOB_NAME']=~ /WEBDRIVER=(\w+)/
|
|
115
120
|
env ||= $1
|
|
116
121
|
end
|
|
117
|
-
|
|
122
|
+
update_key var, env if env
|
|
118
123
|
end
|
|
119
124
|
end
|
|
120
125
|
|
|
@@ -3,12 +3,12 @@ module Watirmark
|
|
|
3
3
|
|
|
4
4
|
attr_accessor :records
|
|
5
5
|
|
|
6
|
-
def run(*actions)
|
|
6
|
+
def run(*actions, &block)
|
|
7
7
|
begin
|
|
8
8
|
run_callback_method :before_all
|
|
9
9
|
record_list.each do |record|
|
|
10
|
-
|
|
11
|
-
execute_actions(actions)
|
|
10
|
+
create_model(record)
|
|
11
|
+
execute_actions(actions, block)
|
|
12
12
|
end
|
|
13
13
|
run_callback_method :after_all
|
|
14
14
|
ensure
|
|
@@ -26,6 +26,14 @@ module Watirmark
|
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
+
def populate_data_overridden?
|
|
30
|
+
self.class.instance_method(:populate_data).owner == self.class
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def check_for_noop_populate
|
|
34
|
+
warn "Warning: Expected to populate values but none were provided" unless @seen_value || populate_data_overridden?
|
|
35
|
+
end
|
|
36
|
+
|
|
29
37
|
# Navigate to the View's edit page and for every value in
|
|
30
38
|
# the models hash, verify that the html element has
|
|
31
39
|
# the proper value for each keyword
|
|
@@ -41,6 +49,7 @@ module Watirmark
|
|
|
41
49
|
search_for_record
|
|
42
50
|
@view.edit @model
|
|
43
51
|
populate_data
|
|
52
|
+
check_for_noop_populate
|
|
44
53
|
end
|
|
45
54
|
|
|
46
55
|
# Navigate to the View's create page and
|
|
@@ -48,8 +57,10 @@ module Watirmark
|
|
|
48
57
|
def create
|
|
49
58
|
@view.create @model
|
|
50
59
|
populate_data
|
|
60
|
+
check_for_noop_populate
|
|
51
61
|
end
|
|
52
62
|
|
|
63
|
+
|
|
53
64
|
def verify_until(&block)
|
|
54
65
|
run_with_stop_condition(:verify, block)
|
|
55
66
|
end
|
|
@@ -115,6 +126,7 @@ module Watirmark
|
|
|
115
126
|
@view.create @model
|
|
116
127
|
verify_data
|
|
117
128
|
end
|
|
129
|
+
|
|
118
130
|
alias :check_create_defaults :check_defaults
|
|
119
131
|
|
|
120
132
|
|
|
@@ -125,10 +137,17 @@ module Watirmark
|
|
|
125
137
|
end
|
|
126
138
|
|
|
127
139
|
# Stubs so converted XLS->RSPEC files don't fail
|
|
128
|
-
def before_all;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def
|
|
140
|
+
def before_all;
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def before_each;
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def after_all;
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def after_each;
|
|
150
|
+
end
|
|
132
151
|
|
|
133
152
|
private
|
|
134
153
|
|
|
@@ -138,7 +157,7 @@ module Watirmark
|
|
|
138
157
|
Watirmark::Session.instance.stop_condition_block = block
|
|
139
158
|
send(method)
|
|
140
159
|
ensure
|
|
141
|
-
Watirmark::Session.instance.stop_condition_block = Proc.new{}
|
|
160
|
+
Watirmark::Session.instance.stop_condition_block = Proc.new {}
|
|
142
161
|
end
|
|
143
162
|
raise Watirmark::TestError, "Expected a stop condition but no stop conditon met!"
|
|
144
163
|
end
|
|
@@ -157,16 +176,20 @@ module Watirmark
|
|
|
157
176
|
send name if respond_to?(name)
|
|
158
177
|
end
|
|
159
178
|
|
|
160
|
-
def execute_actions(actions)
|
|
179
|
+
def execute_actions(actions, block)
|
|
161
180
|
actions.each do |action|
|
|
162
181
|
run_callback_method :before_each
|
|
163
|
-
send(action)
|
|
182
|
+
send(action, &block)
|
|
164
183
|
run_callback_method :after_each
|
|
165
184
|
end
|
|
166
185
|
end
|
|
167
186
|
|
|
168
|
-
def
|
|
169
|
-
|
|
187
|
+
def create_model(record)
|
|
188
|
+
if record.kind_of?(Hash)
|
|
189
|
+
@model = hash_to_model(record)
|
|
190
|
+
else
|
|
191
|
+
@model = record
|
|
192
|
+
end
|
|
170
193
|
end
|
|
171
194
|
end
|
|
172
195
|
end
|
|
@@ -69,10 +69,10 @@ module Watirmark
|
|
|
69
69
|
|
|
70
70
|
def populate_keyword(keyed_element)
|
|
71
71
|
begin
|
|
72
|
-
@seen_value = true
|
|
73
72
|
before_keyword(keyed_element)
|
|
74
73
|
populate_keyword_value(keyed_element)
|
|
75
74
|
after_keyword(keyed_element)
|
|
75
|
+
@seen_value = true
|
|
76
76
|
rescue => e
|
|
77
77
|
Watirmark.logger.warn "Unable to populate '#{keyed_element.keyword}'"
|
|
78
78
|
raise e
|
|
@@ -97,11 +97,11 @@ module Watirmark
|
|
|
97
97
|
@seen_value = false
|
|
98
98
|
end
|
|
99
99
|
|
|
100
|
-
def call_method_if_exists(override
|
|
100
|
+
def call_method_if_exists(override)
|
|
101
101
|
if respond_to?(override)
|
|
102
102
|
send(override)
|
|
103
103
|
else
|
|
104
|
-
|
|
104
|
+
yield if block_given?
|
|
105
105
|
end
|
|
106
106
|
end
|
|
107
107
|
|
|
@@ -122,7 +122,11 @@ module Watirmark
|
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
def populate_keyword_value(keyed_element)
|
|
125
|
-
call_method_if_exists("populate_#{keyed_element.keyword}")
|
|
125
|
+
call_method_if_exists("populate_#{keyed_element.keyword}") do
|
|
126
|
+
# for the first element on a page we populate, wait for it to appear
|
|
127
|
+
@view.send(keyed_element.keyword).send(:wait_until_present) unless @seen_value
|
|
128
|
+
@view.send("#{keyed_element.keyword}=", value(keyed_element))
|
|
129
|
+
end
|
|
126
130
|
end
|
|
127
131
|
|
|
128
132
|
def verify_keyword_value(keyed_element)
|
|
@@ -4,13 +4,13 @@ module Watirmark
|
|
|
4
4
|
!!(Page.browser.windows.size > 1)
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
def with_modal_dialog
|
|
7
|
+
def with_modal_dialog
|
|
8
8
|
wait_for_modal_dialog
|
|
9
9
|
parent_window = (Page.browser.windows.size) - 2
|
|
10
10
|
begin
|
|
11
11
|
Page.browser.windows.last.use
|
|
12
12
|
Page.browser.wait
|
|
13
|
-
|
|
13
|
+
yield
|
|
14
14
|
ensure
|
|
15
15
|
Page.browser.windows[parent_window].use
|
|
16
16
|
end
|
|
@@ -30,4 +30,4 @@ module Watirmark
|
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
|
-
end
|
|
33
|
+
end
|
|
@@ -32,6 +32,15 @@ module EmailHelper
|
|
|
32
32
|
email[model.model_name] = EmailBody.new(email_content)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
def read_email_from(model, from, timeout=30)
|
|
36
|
+
email_content = qa_inbox(model).get_email_text(["FROM", from, "TO", model.email], timeout)
|
|
37
|
+
email[model.model_name] = EmailBody.new(email_content)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def read_email_replyto(model, from, timeout=30)
|
|
41
|
+
qa_inbox(model).get_email_replyto(["FROM", from, "TO", model.email], timeout)
|
|
42
|
+
end
|
|
43
|
+
|
|
35
44
|
def log_email(model)
|
|
36
45
|
Watirmark.logger.info "Email Received"
|
|
37
46
|
Watirmark.logger.info email[model.model_name].body.inspect
|
|
@@ -63,6 +72,16 @@ module EmailHelper
|
|
|
63
72
|
end
|
|
64
73
|
end
|
|
65
74
|
|
|
75
|
+
class EmailEnvelope
|
|
76
|
+
attr_accessor :envelope
|
|
77
|
+
|
|
78
|
+
def initialize(envelope)
|
|
79
|
+
@envelope = envelope
|
|
80
|
+
@from = envelope.from
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
66
85
|
class EmailBody
|
|
67
86
|
attr_accessor :doc, :body
|
|
68
87
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
require_relative 'cuke_helper'
|
|
2
|
+
require_relative 'email_helper'
|
|
3
|
+
require_relative 'model_helper'
|
|
4
|
+
require_relative 'transforms'
|
|
5
|
+
require_relative 'hooks'
|
|
6
|
+
require_relative 'load_cached_models' if Watirmark::Configuration.instance.use_cached_models
|
|
6
7
|
|
|
7
8
|
World CukeHelper
|
|
8
9
|
World EmailHelper
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module HookHelper
|
|
2
|
+
class << self
|
|
3
|
+
|
|
4
|
+
def clear_post_errors
|
|
5
|
+
Watirmark::Session.instance.post_failure = nil
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def trap_post_errors(&block)
|
|
9
|
+
Watirmark::Session.instance.catch_post_failures(&block)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def take_screenshot
|
|
14
|
+
image = "#{Time.now.to_i}-#{UUID.new.generate(:compact)}.png"
|
|
15
|
+
path = "reports/screenshots"
|
|
16
|
+
file = "#{path}/#{image}"
|
|
17
|
+
FileUtils.mkdir_p path unless File.directory? path
|
|
18
|
+
begin
|
|
19
|
+
Page.browser.screenshot.save file
|
|
20
|
+
data = File.open(file, 'rb') { |f| f.read }
|
|
21
|
+
data = Base64.encode64(data)
|
|
22
|
+
rescue Exception => e
|
|
23
|
+
Watirmark.logger.warn("Screenshot was not taken due to an exception")
|
|
24
|
+
Watirmark.logger.warn(e.to_s)
|
|
25
|
+
Watirmark.logger.warn(e.backtrace)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
[data, 'image/png']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def serialize_models
|
|
32
|
+
return unless Watirmark::Configuration.instance.use_cached_models
|
|
33
|
+
Dir.mkdir("cache") unless Dir.exists? "cache"
|
|
34
|
+
File.unlink "cache/DataModels" if File.exists? "cache/DataModels"
|
|
35
|
+
File.open("cache/DataModels", "wb") { |f| f.print Marshal::dump(DataModels) }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
require_relative "hook_helper"
|
|
2
|
+
|
|
1
3
|
Around('@catch-post-failure') do |scenario, block|
|
|
2
|
-
|
|
4
|
+
HookHelper.trap_post_errors(&block)
|
|
3
5
|
end
|
|
4
6
|
|
|
5
|
-
# Initialize post failures so we don't get leakage between scenarios
|
|
6
7
|
Before('~@catch-post-failure') do
|
|
7
|
-
|
|
8
|
+
HookHelper.clear_post_errors
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
Before do |scenario|
|
|
12
|
+
HookHelper.serialize_models
|
|
8
13
|
end
|
|
9
14
|
|
|
10
15
|
After do |scenario|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Page.browser.screenshot.save "#{path}/#{image}"
|
|
15
|
-
embed "screenshots/#{image}", 'image/png'
|
|
16
|
+
(file, file_type) = HookHelper.take_screenshot
|
|
17
|
+
embed file, file_type
|
|
18
|
+
HookHelper.serialize_models
|
|
16
19
|
end
|
|
20
|
+
|
|
21
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
if File.exists?("cache/DataModels")
|
|
2
|
+
file = File.open("cache/DataModels", "rb")
|
|
3
|
+
DataModels = Marshal::load(file.read)
|
|
4
|
+
#DataModels.each_key { |k| DataModels.delete(k) unless DataModels[k].cache? == true }
|
|
5
|
+
warn "=========="
|
|
6
|
+
warn "USING CACHED MODELS:"
|
|
7
|
+
DataModels.each_pair { |k, v| warn " #{k}: #{v.to_h}" }
|
|
8
|
+
warn "=========="
|
|
9
|
+
end
|
|
@@ -9,20 +9,20 @@ module ModelHelper
|
|
|
9
9
|
model.update(hash_record(table))
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def with_updated_model(model, table
|
|
12
|
+
def with_updated_model(model, table)
|
|
13
13
|
unless model.includes?(hash_record(table))
|
|
14
14
|
update_model(model, table)
|
|
15
|
-
|
|
15
|
+
yield
|
|
16
16
|
Watirmark.logger.info "Updated models '#{model.model_name}':\n#{hash_record(table).inspect}"
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# Perform an action using a models and update
|
|
21
21
|
# the models if that action is successful
|
|
22
|
-
def with_model(model, table
|
|
22
|
+
def with_model(model, table)
|
|
23
23
|
orig_model = model.clone
|
|
24
24
|
update_model(model, table)
|
|
25
|
-
|
|
25
|
+
yield
|
|
26
26
|
if Watirmark::Session.instance.post_failure
|
|
27
27
|
Watirmark.logger.info "Reverting Model #{Watirmark::Session.instance.post_failure}"
|
|
28
28
|
model.update(orig_model.to_h) # revert models on failure
|
|
@@ -26,7 +26,9 @@ module Watirmark
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def model_class_name(name)
|
|
29
|
-
|
|
29
|
+
class_name = name.split.map(&:camelize).join
|
|
30
|
+
class_name = "#{class_name}Model" unless class_name =~ /.+Model$/
|
|
31
|
+
class_name
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
def temporary_model?(user_defined_name)
|