howitzer 1.1.1 → 2.0.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 +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +32 -0
- data/.travis.yml +1 -4
- data/.yardopts +1 -2
- data/CHANGELOG.md +28 -1
- data/Gemfile +6 -0
- data/LICENSE +1 -1
- data/README.md +55 -85
- data/Rakefile +7 -7
- data/bin/howitzer +56 -31
- data/features/cli_new.feature +162 -79
- data/features/cli_update.feature +114 -21
- data/features/step_definitions/common_steps.rb +29 -9
- data/features/support/env.rb +1 -1
- data/features/support/transformers.rb +2 -2
- data/generators/base_generator.rb +121 -49
- data/generators/config/config_generator.rb +8 -5
- data/generators/config/templates/boot.rb +14 -0
- data/generators/config/templates/capybara.rb +156 -0
- data/generators/config/templates/custom.yml +2 -3
- data/generators/config/templates/default.yml +50 -82
- data/generators/cucumber/cucumber_generator.rb +9 -9
- data/generators/cucumber/templates/common_steps.rb +4 -4
- data/generators/cucumber/templates/cucumber.rake +63 -54
- data/generators/cucumber/templates/env.rb +24 -23
- data/generators/cucumber/templates/transformers.rb +23 -15
- data/generators/emails/emails_generator.rb +4 -2
- data/generators/emails/templates/example_email.rb +4 -4
- data/generators/prerequisites/prerequisites_generator.rb +24 -0
- data/generators/prerequisites/templates/base.rb +22 -0
- data/generators/prerequisites/templates/factory_girl.rb +30 -0
- data/generators/prerequisites/templates/user.rb +7 -0
- data/generators/prerequisites/templates/users.rb +12 -0
- data/generators/root/root_generator.rb +11 -7
- data/generators/root/templates/.rubocop.yml +32 -0
- data/generators/root/templates/Gemfile.erb +27 -0
- data/generators/root/templates/Rakefile +6 -8
- data/generators/rspec/rspec_generator.rb +7 -7
- data/generators/rspec/templates/example_spec.rb +1 -1
- data/generators/rspec/templates/rspec.rake +48 -29
- data/generators/rspec/templates/spec_helper.rb +33 -32
- data/generators/tasks/tasks_generator.rb +4 -2
- data/generators/tasks/templates/common.rake +1 -16
- data/generators/turnip/templates/.rspec +1 -0
- data/generators/turnip/templates/common_steps.rb +25 -0
- data/generators/turnip/templates/example.feature +8 -0
- data/generators/turnip/templates/spec_helper.rb +56 -0
- data/generators/turnip/templates/turnip.rake +61 -0
- data/generators/turnip/templates/turnip_helper.rb +6 -0
- data/generators/turnip/turnip_generator.rb +26 -0
- data/generators/web/templates/example_page.rb +15 -0
- data/generators/web/templates/menu_section.rb +13 -0
- data/generators/web/web_generator.rb +22 -0
- data/howitzer.gemspec +14 -21
- data/lib/howitzer.rb +47 -7
- data/lib/howitzer/cache.rb +70 -0
- data/lib/howitzer/capybara_helpers.rb +194 -0
- data/lib/howitzer/email.rb +96 -104
- data/lib/howitzer/exceptions.rb +10 -6
- data/lib/howitzer/log.rb +120 -0
- data/lib/howitzer/mail_adapters.rb +7 -0
- data/lib/howitzer/mail_adapters/abstract.rb +84 -0
- data/lib/howitzer/mail_adapters/mailgun.rb +115 -0
- data/lib/howitzer/mailgun_api.rb +9 -0
- data/lib/howitzer/mailgun_api/client.rb +79 -0
- data/lib/howitzer/mailgun_api/connector.rb +37 -0
- data/lib/howitzer/mailgun_api/response.rb +28 -0
- data/lib/howitzer/tasks/framework.rake +2 -2
- data/lib/howitzer/utils.rb +7 -1
- data/lib/howitzer/utils/string_extensions.rb +66 -0
- data/lib/howitzer/version.rb +2 -1
- data/lib/howitzer/web.rb +11 -0
- data/lib/howitzer/web/base_section.rb +27 -0
- data/lib/howitzer/web/blank_page.rb +12 -0
- data/lib/howitzer/web/capybara_methods_proxy.rb +29 -0
- data/lib/howitzer/web/element_dsl.rb +109 -0
- data/lib/howitzer/web/iframe_dsl.rb +93 -0
- data/lib/howitzer/web/page.rb +173 -0
- data/lib/howitzer/web/page_dsl.rb +64 -0
- data/lib/howitzer/web/page_validator.rb +118 -0
- data/lib/howitzer/web/section.rb +27 -0
- data/lib/howitzer/web/section_dsl.rb +154 -0
- data/spec/config/custom.yml +10 -1
- data/spec/spec_helper.rb +37 -19
- data/spec/support/generator_helper.rb +12 -11
- data/spec/support/logger_helper.rb +10 -9
- data/spec/support/mailgun_unit_client.rb +52 -44
- data/spec/support/shared_examples/capybara_context_holder.rb +33 -0
- data/spec/support/shared_examples/capybara_methods_proxy.rb +94 -0
- data/spec/support/shared_examples/dynamic_section_methods.rb +35 -0
- data/spec/support/shared_examples/element_dsl.rb +119 -0
- data/spec/unit/generators/base_generator_spec.rb +64 -33
- data/spec/unit/generators/config_generator_spec.rb +11 -7
- data/spec/unit/generators/cucumber_generator_spec.rb +26 -17
- data/spec/unit/generators/emails_generator_spec.rb +10 -6
- data/spec/unit/generators/prerequisites_generator_spec.rb +53 -0
- data/spec/unit/generators/root_generator_spec.rb +50 -13
- data/spec/unit/generators/rspec_generator_spec.rb +9 -9
- data/spec/unit/generators/tasks_generator_spec.rb +6 -6
- data/spec/unit/generators/turnip_generator_spec.rb +52 -0
- data/spec/unit/generators/web_generator_spec.rb +52 -0
- data/spec/unit/lib/cache_spec.rb +85 -0
- data/spec/unit/lib/capybara_helpers_spec.rb +696 -0
- data/spec/unit/lib/email_spec.rb +104 -91
- data/spec/unit/lib/howitzer.rb +31 -0
- data/spec/unit/lib/init_spec.rb +0 -1
- data/spec/unit/lib/log_spec.rb +122 -0
- data/spec/unit/lib/mail_adapters/abstract_spec.rb +62 -0
- data/spec/unit/lib/mail_adapters/mailgun_spec.rb +163 -0
- data/spec/unit/lib/mailgun_api/client_spec.rb +58 -0
- data/spec/unit/lib/mailgun_api/connector_spec.rb +54 -0
- data/spec/unit/lib/mailgun_api/response_spec.rb +28 -0
- data/spec/unit/lib/utils/string_extensions_spec.rb +77 -0
- data/spec/unit/lib/web/base_section_spec.rb +41 -0
- data/spec/unit/lib/web/element_dsl_spec.rb +17 -0
- data/spec/unit/lib/web/iframe_dsl_spec.rb +99 -0
- data/spec/unit/lib/web/page_dsl_spec.rb +52 -0
- data/spec/unit/lib/web/page_spec.rb +304 -0
- data/spec/unit/lib/web/page_validator_spec.rb +218 -0
- data/spec/unit/lib/web/section_dsl_spec.rb +165 -0
- data/spec/unit/lib/web/section_spec.rb +61 -0
- data/spec/unit/version_spec.rb +1 -1
- metadata +116 -203
- data/GETTING_STARTED.md +0 -774
- data/generators/cucumber/templates/cucumber.yml +0 -10
- data/generators/pages/pages_generator.rb +0 -21
- data/generators/pages/templates/example_menu.rb +0 -15
- data/generators/pages/templates/example_page.rb +0 -15
- data/generators/root/templates/Gemfile +0 -7
- data/generators/root/templates/boot.rb +0 -10
- data/lib/howitzer/blank_page.rb +0 -6
- data/lib/howitzer/capybara/dsl_ex.rb +0 -15
- data/lib/howitzer/capybara/settings.rb +0 -343
- data/lib/howitzer/helpers.rb +0 -230
- data/lib/howitzer/init.rb +0 -1
- data/lib/howitzer/mailgun/client.rb +0 -65
- data/lib/howitzer/mailgun/connector.rb +0 -34
- data/lib/howitzer/mailgun/response.rb +0 -28
- data/lib/howitzer/patches/rawler_patched.rb +0 -86
- data/lib/howitzer/settings.rb +0 -27
- data/lib/howitzer/utils/data_generator/data_storage.rb +0 -88
- data/lib/howitzer/utils/data_generator/gen.rb +0 -135
- data/lib/howitzer/utils/locator_store.rb +0 -217
- data/lib/howitzer/utils/log.rb +0 -139
- data/lib/howitzer/utils/page_validator.rb +0 -133
- data/lib/howitzer/vendor/firebug-1.12.1-fx.xpi +0 -0
- data/lib/howitzer/vendor/firepath-0.9.7-fx.xpi +0 -0
- data/lib/howitzer/web_page.rb +0 -253
- data/spec/active_resource.rb +0 -0
- data/spec/config/default.yml +0 -26
- data/spec/support/boot_helper.rb +0 -15
- data/spec/unit/generators/pages_generator_spec.rb +0 -33
- data/spec/unit/lib/capybara/dsl_ex_spec.rb +0 -60
- data/spec/unit/lib/capybara/settings_spec.rb +0 -441
- data/spec/unit/lib/helpers_spec.rb +0 -1129
- data/spec/unit/lib/mailgun/client_spec.rb +0 -36
- data/spec/unit/lib/mailgun/connector_spec.rb +0 -70
- data/spec/unit/lib/mailgun/response_spec.rb +0 -28
- data/spec/unit/lib/settings_spec.rb +0 -17
- data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +0 -80
- data/spec/unit/lib/utils/data_generator/gen_spec.rb +0 -90
- data/spec/unit/lib/utils/locator_store_spec.rb +0 -157
- data/spec/unit/lib/utils/log_spec.rb +0 -107
- data/spec/unit/lib/utils/page_validator_spec.rb +0 -265
- data/spec/unit/lib/web_page_spec.rb +0 -346
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
require_relative '../base_generator'
|
|
2
2
|
|
|
3
3
|
module Howitzer
|
|
4
|
+
# This class responsible for rake tasks generation
|
|
4
5
|
class TasksGenerator < BaseGenerator
|
|
5
6
|
def manifest
|
|
6
|
-
{ files: [
|
|
7
|
+
{ files: [source: 'common.rake', destination: 'tasks/common.rake'] }
|
|
7
8
|
end
|
|
8
9
|
|
|
9
10
|
protected
|
|
11
|
+
|
|
10
12
|
def banner
|
|
11
13
|
<<-EOF
|
|
12
14
|
* Base rake task generation ...
|
|
13
15
|
EOF
|
|
14
16
|
end
|
|
15
17
|
end
|
|
16
|
-
end
|
|
18
|
+
end
|
|
@@ -1,16 +1 @@
|
|
|
1
|
-
|
|
2
|
-
task :check_links do
|
|
3
|
-
require 'rawler'
|
|
4
|
-
require 'active_support'
|
|
5
|
-
require 'active_support/core_ext'
|
|
6
|
-
require 'howitzer/helpers'
|
|
7
|
-
|
|
8
|
-
log.settings_as_formatted_text
|
|
9
|
-
opts = {
|
|
10
|
-
wait: 0.1,
|
|
11
|
-
logfile: File.expand_path(settings.rawler_log, settings.log_dir)
|
|
12
|
-
}
|
|
13
|
-
opts[:username] = settings.app_base_auth_login unless settings.app_base_auth_login.blank?
|
|
14
|
-
opts[:password] = settings.app_base_auth_pass unless settings.app_base_auth_pass.blank?
|
|
15
|
-
Rawler::Base.new(app_base_url, $stdout, opts).validate
|
|
16
|
-
end
|
|
1
|
+
# Put here any common rake tasks
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
-r turnip/rspec
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Turnip
|
|
2
|
+
# In this module should be combined common turnip steps
|
|
3
|
+
module Steps
|
|
4
|
+
# PUT GLOBAL STEPS HERE
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# This module combines turnip steps for example.feature
|
|
9
|
+
module MonsterSteps
|
|
10
|
+
attr_accessor :monster
|
|
11
|
+
|
|
12
|
+
step 'there is a monster' do
|
|
13
|
+
self.monster = 1
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
step 'I attack it' do
|
|
17
|
+
self.monster -= 1
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
step 'it should die' do
|
|
21
|
+
expect(self.monster).to eq(0)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
RSpec.configure { |c| c.include MonsterSteps, monster_steps: true }
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'capybara-screenshot/rspec'
|
|
2
|
+
require_relative '../config/boot'
|
|
3
|
+
require_relative '../config/capybara'
|
|
4
|
+
|
|
5
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
|
6
|
+
|
|
7
|
+
RSpec.configure do |config|
|
|
8
|
+
Howitzer::Log.settings_as_formatted_text
|
|
9
|
+
|
|
10
|
+
Howitzer::Cache.store(:cloud, :start_time, Time.now.utc)
|
|
11
|
+
Howitzer::Cache.store(:cloud, :status, true)
|
|
12
|
+
|
|
13
|
+
config.include FactoryGirl::Syntax::Methods
|
|
14
|
+
|
|
15
|
+
config.disable_monkey_patching = true
|
|
16
|
+
config.color = true
|
|
17
|
+
|
|
18
|
+
config.before(:each) do
|
|
19
|
+
scenario_name =
|
|
20
|
+
if RSpec.current_example.description.blank?
|
|
21
|
+
RSpec.current_example.metadata[:full_description]
|
|
22
|
+
else
|
|
23
|
+
RSpec.current_example.description
|
|
24
|
+
end
|
|
25
|
+
Howitzer::Log.print_scenario_name(scenario_name)
|
|
26
|
+
@session_start = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
config.after(:each) do
|
|
30
|
+
Howitzer::Cache.clear_all_ns
|
|
31
|
+
if CapybaraHelpers.cloud_driver?
|
|
32
|
+
session_end = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
|
|
33
|
+
Howitzer::Log.info "CLOUD VIDEO #{@session_start} - #{session_end}" \
|
|
34
|
+
" URL: #{CapybaraHelpers.cloud_resource_path(:video)}"
|
|
35
|
+
elsif CapybaraHelpers.ie_browser?
|
|
36
|
+
Howitzer::Log.info 'IE reset session'
|
|
37
|
+
page.execute_script("void(document.execCommand('ClearAuthenticationCache', false));")
|
|
38
|
+
end
|
|
39
|
+
Capybara.reset_sessions!
|
|
40
|
+
Capybara.use_default_driver
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
config.after(:suite) do
|
|
44
|
+
if CapybaraHelpers.cloud_driver?
|
|
45
|
+
report_failures_count = config.reporter.failed_examples.count
|
|
46
|
+
Howitzer::Cache.store(:cloud, :status, report_failures_count.zero?)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
at_exit do
|
|
51
|
+
if CapybaraHelpers.cloud_driver?
|
|
52
|
+
Howitzer::Log.info "CLOUD SERVER LOG URL: #{CapybaraHelpers.cloud_resource_path(:server_log)}"
|
|
53
|
+
CapybaraHelpers.update_cloud_job_status(passed: Howitzer::Cache.extract(:cloud, :status))
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'rspec/core/rake_task'
|
|
2
|
+
|
|
3
|
+
opts = lambda do |task_name|
|
|
4
|
+
[
|
|
5
|
+
"--format html --out ./#{Howitzer.log_dir}/#{Howitzer.driver}_#{task_name}_#{Howitzer.html_log}",
|
|
6
|
+
'--format documentation',
|
|
7
|
+
'--color'
|
|
8
|
+
].join(' ').freeze
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
RSpec::Core::RakeTask.new(:rspec, 'Run all turnip scenarios') do |t|
|
|
12
|
+
Howitzer.current_rake_task = t.name
|
|
13
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
14
|
+
t.rspec_opts = opts.call(t.name)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
RSpec::Core::RakeTask.new(:features, 'Run all workable scenarios (without @wip and @bug tags)') do |t|
|
|
18
|
+
Howitzer.current_rake_task = t.name
|
|
19
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
20
|
+
t.rspec_opts = "#{opts.call(t.name)} --tag ~wip --tag ~bug"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
namespace :features do
|
|
24
|
+
RSpec::Core::RakeTask.new(:wip, 'Run scenarios in progress (with @wip tag)') do |t|
|
|
25
|
+
Howitzer.current_rake_task = t.name
|
|
26
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
27
|
+
t.rspec_opts = "#{opts.call(t.name)} --tag wip"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
RSpec::Core::RakeTask.new(:bug, 'Run scenarios with known bugs (with @bug tag)') do |t|
|
|
31
|
+
Howitzer.current_rake_task = t.name
|
|
32
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
33
|
+
t.rspec_opts = "#{opts.call(t.name)} --tag bug"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
RSpec::Core::RakeTask.new(:smoke, 'Run workable smoke scenarios (with @smoke tag)') do |t|
|
|
37
|
+
Howitzer.current_rake_task = t.name
|
|
38
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
39
|
+
t.rspec_opts = "#{opts.call(t.name)} --tag smoke --tag ~wip --tag ~bug"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
RSpec::Core::RakeTask.new(:bvt, 'Run workable build verification test scenarios') do |t|
|
|
43
|
+
Howitzer.current_rake_task = t.name
|
|
44
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
45
|
+
t.rspec_opts = "#{opts.call(t.name)} --tag ~wip --tag ~bug --tag ~p1 --tag ~p2 --tag ~smoke"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
RSpec::Core::RakeTask.new(:p1, 'Run workable scenarios with normal priority (with @p1 tag)') do |t|
|
|
49
|
+
Howitzer.current_rake_task = t.name
|
|
50
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
51
|
+
t.rspec_opts = "#{opts.call(t.name)} --tag p1 --tag ~wip --tag ~bug"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
RSpec::Core::RakeTask.new(:p2, 'Run workable scenarios with low priority (with @p2 tag)') do |t|
|
|
55
|
+
Howitzer.current_rake_task = t.name
|
|
56
|
+
t.pattern = './spec{,/*/**}/*.feature'
|
|
57
|
+
t.rspec_opts = "#{opts.call(t.name)} --tag p2 --tag ~wip --tag ~bug"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
task default: :features
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require_relative '../base_generator'
|
|
2
|
+
|
|
3
|
+
module Howitzer
|
|
4
|
+
# This class responsible for turnip based files generation
|
|
5
|
+
class TurnipGenerator < BaseGenerator
|
|
6
|
+
def manifest
|
|
7
|
+
{ files:
|
|
8
|
+
[
|
|
9
|
+
{ source: '.rspec', destination: '.rspec' },
|
|
10
|
+
{ source: 'spec_helper.rb', destination: 'spec/spec_helper.rb' },
|
|
11
|
+
{ source: 'turnip_helper.rb', destination: 'spec/turnip_helper.rb' },
|
|
12
|
+
{ source: 'example.feature', destination: 'spec/acceptance/example.feature' },
|
|
13
|
+
{ source: 'common_steps.rb', destination: 'spec/steps/common_steps.rb' },
|
|
14
|
+
{ source: 'turnip.rake', destination: 'tasks/turnip.rake' }
|
|
15
|
+
] }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
def banner
|
|
21
|
+
<<-EOS
|
|
22
|
+
* Turnip integration to the framework ...
|
|
23
|
+
EOS
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require_relative 'example_menu'
|
|
2
|
+
# This class is example of web page
|
|
3
|
+
class ExamplePage < Howitzer::Web::Page
|
|
4
|
+
path '/'
|
|
5
|
+
validate :url, %r{\A(?:.*?:\/\/)?[^\/]*\/?\z}
|
|
6
|
+
|
|
7
|
+
section :menu
|
|
8
|
+
|
|
9
|
+
element :search_input, :fillable_field, 'lst-ib'
|
|
10
|
+
element :search_btn, :button, 'btnK'
|
|
11
|
+
|
|
12
|
+
def fill_keyword(data)
|
|
13
|
+
search_input_element.set(data)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# This class is example of section
|
|
2
|
+
class MenuSection < Howitzer::Web::Section
|
|
3
|
+
me :id, 'metaMenu'
|
|
4
|
+
|
|
5
|
+
element :menu_button, '.menuButton'
|
|
6
|
+
element :account, :xpath, ".//*[@id='metaMenu']//a[contains(., 'Account')]"
|
|
7
|
+
element :log_out, :xpath, ".//*[@id='metaMenu']//a[contains(., 'Log Out')]"
|
|
8
|
+
|
|
9
|
+
def logout
|
|
10
|
+
Howitzer::Log.info 'Log out'
|
|
11
|
+
log_out_element.click
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require_relative '../base_generator'
|
|
2
|
+
|
|
3
|
+
module Howitzer
|
|
4
|
+
# This class responsible for page object pattern generation
|
|
5
|
+
class WebGenerator < BaseGenerator
|
|
6
|
+
def manifest
|
|
7
|
+
{ files:
|
|
8
|
+
[
|
|
9
|
+
{ source: 'example_page.rb', destination: 'web/pages/example_page.rb' },
|
|
10
|
+
{ source: 'menu_section.rb', destination: 'web/sections/menu_section.rb' }
|
|
11
|
+
] }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
protected
|
|
15
|
+
|
|
16
|
+
def banner
|
|
17
|
+
<<-EOS
|
|
18
|
+
* PageOriented pattern structure generation ...
|
|
19
|
+
EOS
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
data/howitzer.gemspec
CHANGED
|
@@ -1,45 +1,38 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
2
3
|
require File.expand_path('../lib/howitzer/version', __FILE__)
|
|
3
4
|
|
|
4
5
|
Gem::Specification.new do |gem|
|
|
5
6
|
gem.author = 'Roman Parashchenko'
|
|
6
7
|
gem.email = 'howitzer@strongqa.com'
|
|
7
|
-
gem.description =
|
|
8
|
-
|
|
8
|
+
gem.description = 'Howitzer uses the best practices and design patterns allowing to generate a test project in' \
|
|
9
|
+
' less than 5 minutes. It has out-of-the-box configurations for parallel cross-browser testing in the cloud.'
|
|
10
|
+
gem.summary = 'Ruby based framework for acceptance testing'
|
|
9
11
|
gem.homepage = 'http://strongqa.github.io/howitzer/'
|
|
10
12
|
gem.license = 'MIT'
|
|
11
13
|
|
|
12
14
|
gem.bindir = 'bin'
|
|
13
|
-
gem.files = `git ls-files`.split(
|
|
14
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
15
|
+
gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
|
15
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
16
18
|
gem.name = 'howitzer'
|
|
17
19
|
gem.require_paths = ['lib']
|
|
18
20
|
gem.version = Howitzer::VERSION
|
|
19
|
-
gem.required_ruby_version = '>=
|
|
21
|
+
gem.required_ruby_version = '>= 2.2.2'
|
|
20
22
|
|
|
21
|
-
gem.add_runtime_dependency '
|
|
22
|
-
gem.add_runtime_dependency '
|
|
23
|
-
gem.add_runtime_dependency 'tins', '1.6.0'
|
|
24
|
-
gem.add_runtime_dependency 'rake'
|
|
23
|
+
gem.add_runtime_dependency 'activesupport', '~>5.0'
|
|
24
|
+
gem.add_runtime_dependency 'capybara', ['>= 2.1', '< 3.0']
|
|
25
25
|
gem.add_runtime_dependency 'gli'
|
|
26
|
-
gem.add_runtime_dependency 'syntax'
|
|
27
|
-
gem.add_runtime_dependency 'cucumber', '~>2.0'
|
|
28
|
-
gem.add_runtime_dependency 'rspec', '~>3.2'
|
|
29
|
-
gem.add_runtime_dependency 'sexy_settings'
|
|
30
|
-
gem.add_runtime_dependency 'repeater'
|
|
31
26
|
gem.add_runtime_dependency 'launchy'
|
|
32
27
|
gem.add_runtime_dependency 'log4r', '~>1.1.10'
|
|
33
|
-
gem.add_runtime_dependency '
|
|
34
|
-
gem.add_runtime_dependency '
|
|
35
|
-
gem.add_runtime_dependency '
|
|
36
|
-
gem.add_runtime_dependency 'capybara'
|
|
28
|
+
gem.add_runtime_dependency 'nokogiri', '~> 1.6' if gem.platform.to_s =~ /mswin|mingw/
|
|
29
|
+
gem.add_runtime_dependency 'rake'
|
|
30
|
+
gem.add_runtime_dependency 'rspec', '~>3.2'
|
|
37
31
|
gem.add_runtime_dependency 'selenium-webdriver'
|
|
38
|
-
gem.add_runtime_dependency '
|
|
39
|
-
gem.add_runtime_dependency 'testingbot'
|
|
32
|
+
gem.add_runtime_dependency 'sexy_settings'
|
|
40
33
|
|
|
41
34
|
gem.add_development_dependency('aruba')
|
|
42
|
-
gem.add_development_dependency('fuubar')
|
|
43
35
|
gem.add_development_dependency('ffaker')
|
|
36
|
+
gem.add_development_dependency('fuubar')
|
|
44
37
|
gem.add_development_dependency('yard')
|
|
45
38
|
end
|
data/lib/howitzer.rb
CHANGED
|
@@ -1,9 +1,49 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
3
|
-
require '
|
|
1
|
+
require 'selenium-webdriver'
|
|
2
|
+
require 'capybara'
|
|
3
|
+
require 'sexy_settings'
|
|
4
|
+
|
|
5
|
+
SexySettings.configure do |config|
|
|
6
|
+
config.path_to_default_settings = File.expand_path('config/default.yml', Dir.pwd)
|
|
7
|
+
config.path_to_custom_settings = File.expand_path('config/custom.yml', Dir.pwd)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# This is main namespace for the library
|
|
11
|
+
module Howitzer
|
|
12
|
+
class << self
|
|
13
|
+
# Defines methods for all known settings
|
|
14
|
+
# @example
|
|
15
|
+
# Howtzer.app_host
|
|
16
|
+
# Howitzer.driver
|
|
17
|
+
|
|
18
|
+
::SexySettings::Base.instance.all.each do |key, value|
|
|
19
|
+
define_method(key) { value }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
attr_accessor :current_rake_task
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return an application uri
|
|
26
|
+
#
|
|
27
|
+
# @example returns url with auth
|
|
28
|
+
# app_uri.site
|
|
29
|
+
# @example returns url without auth
|
|
30
|
+
# app_uri.origin
|
|
31
|
+
|
|
32
|
+
def self.app_uri
|
|
33
|
+
::Addressable::URI.new(
|
|
34
|
+
user: Howitzer.app_base_auth_login,
|
|
35
|
+
password: Howitzer.app_base_auth_pass,
|
|
36
|
+
host: Howitzer.app_host,
|
|
37
|
+
scheme: Howitzer.app_protocol || 'http'
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
require 'howitzer/version'
|
|
43
|
+
require 'howitzer/exceptions'
|
|
44
|
+
require 'howitzer/log'
|
|
4
45
|
require 'howitzer/utils'
|
|
5
|
-
require 'howitzer/
|
|
6
|
-
require 'howitzer/helpers'
|
|
46
|
+
require 'howitzer/cache'
|
|
7
47
|
require 'howitzer/email'
|
|
8
|
-
require 'howitzer/
|
|
9
|
-
require 'howitzer/
|
|
48
|
+
require 'howitzer/web'
|
|
49
|
+
require 'howitzer/capybara_helpers'
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module Howitzer
|
|
2
|
+
##
|
|
3
|
+
#
|
|
4
|
+
# Data can be stored in memory using this class
|
|
5
|
+
#
|
|
6
|
+
module Cache
|
|
7
|
+
SPECIAL_NS_LIST = [:cloud].freeze
|
|
8
|
+
@data ||= {}
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
attr_reader :data
|
|
12
|
+
|
|
13
|
+
# Saves data into memory. Marking by a namespace and a key
|
|
14
|
+
#
|
|
15
|
+
# @param ns [String] a namespace
|
|
16
|
+
# @param key [String] a key that should be uniq within the namespace
|
|
17
|
+
# @param value [Object] everything you want to store in Memory
|
|
18
|
+
# @raise [NoDataError] if the namespace missing
|
|
19
|
+
|
|
20
|
+
def store(ns, key, value)
|
|
21
|
+
check_ns(ns)
|
|
22
|
+
@data[ns][key] = value
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Gets data from memory. Can get all namespace or single data value in namespace using key
|
|
26
|
+
#
|
|
27
|
+
# @param ns [String] a namespace
|
|
28
|
+
# @param key [String] key that isn't necessary required
|
|
29
|
+
# @return [Object, Hash] all data from the namespace if the key is ommited, otherwise returs
|
|
30
|
+
# all data for the namespace
|
|
31
|
+
# @raise [NoDataError] if the namespace missing
|
|
32
|
+
|
|
33
|
+
def extract(ns, key = nil)
|
|
34
|
+
check_ns(ns)
|
|
35
|
+
key ? @data[ns][key] : @data[ns]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Deletes all data from a namespace
|
|
39
|
+
#
|
|
40
|
+
# @param ns [String] a namespace
|
|
41
|
+
|
|
42
|
+
def clear_ns(ns)
|
|
43
|
+
init_ns(ns)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Deletes all namespaces with data
|
|
47
|
+
#
|
|
48
|
+
# @param exception_list [Array] a namespace list for excluding
|
|
49
|
+
|
|
50
|
+
def clear_all_ns(exception_list = SPECIAL_NS_LIST)
|
|
51
|
+
(@data.keys - exception_list).each { |ns| clear_ns(ns) }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def check_ns(ns)
|
|
57
|
+
raise Howitzer::NoDataError, 'Data storage namespace can not be empty' unless ns
|
|
58
|
+
init_ns(ns) if ns_absent?(ns)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def ns_absent?(ns)
|
|
62
|
+
!@data.key?(ns)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def init_ns(ns)
|
|
66
|
+
@data[ns] = {}
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|