howitzer 0.0.3 → 1.0.1

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.
Files changed (81) hide show
  1. data/.gitignore +8 -0
  2. data/.rspec +3 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.md +32 -0
  5. data/GETTING_STARTED.md +529 -0
  6. data/Gemfile +4 -2
  7. data/LICENSE +2 -2
  8. data/README.md +57 -13
  9. data/Rakefile +9 -2
  10. data/bin/howitzer +79 -31
  11. data/generators/base_generator.rb +87 -0
  12. data/generators/config/config_generator.rb +16 -20
  13. data/generators/config/templates/default.yml +26 -7
  14. data/generators/cucumber/cucumber_generator.rb +20 -26
  15. data/generators/{tasks → cucumber}/templates/cucumber.rake +0 -0
  16. data/generators/{config → cucumber}/templates/cucumber.yml +0 -0
  17. data/generators/emails/emails_generator.rb +11 -18
  18. data/generators/emails/templates/example_email.rb +1 -0
  19. data/generators/pages/pages_generator.rb +16 -18
  20. data/generators/pages/templates/example_menu.rb +1 -0
  21. data/generators/pages/templates/example_page.rb +1 -1
  22. data/generators/root/root_generator.rb +18 -20
  23. data/generators/root/templates/.gitignore +2 -1
  24. data/generators/root/templates/Gemfile +3 -2
  25. data/generators/root/templates/Rakefile +10 -0
  26. data/generators/root/templates/boot.rb +3 -9
  27. data/generators/rspec/rspec_generator.rb +23 -0
  28. data/generators/rspec/templates/example_spec.rb +7 -0
  29. data/generators/rspec/templates/rspec.rake +34 -0
  30. data/generators/rspec/templates/spec_helper.rb +56 -0
  31. data/generators/tasks/tasks_generator.rb +11 -17
  32. data/generators/tasks/templates/common.rake +15 -0
  33. data/howitzer.gemspec +13 -2
  34. data/lib/howitzer.rb +1 -0
  35. data/lib/howitzer/helpers.rb +87 -2
  36. data/lib/howitzer/init.rb +0 -1
  37. data/lib/howitzer/patches/rawler_patched.rb +86 -0
  38. data/lib/howitzer/settings.rb +27 -0
  39. data/lib/howitzer/utils.rb +3 -12
  40. data/lib/howitzer/utils/capybara_patched.rb +3 -2
  41. data/lib/howitzer/utils/capybara_settings.rb +158 -24
  42. data/lib/howitzer/utils/data_generator/data_storage.rb +35 -1
  43. data/lib/howitzer/utils/data_generator/gen.rb +45 -3
  44. data/lib/howitzer/utils/email/email.rb +44 -5
  45. data/lib/howitzer/utils/email/mail_client.rb +28 -22
  46. data/lib/howitzer/utils/email/mailgun_helper.rb +30 -4
  47. data/lib/howitzer/utils/locator_store.rb +111 -19
  48. data/lib/howitzer/utils/log.rb +137 -0
  49. data/lib/howitzer/utils/page_validator.rb +86 -0
  50. data/lib/howitzer/vendor/firebug-1.12.1-fx.xpi +0 -0
  51. data/lib/howitzer/vendor/firepath-0.9.7-fx.xpi +0 -0
  52. data/lib/howitzer/version.rb +2 -2
  53. data/lib/howitzer/web_page.rb +159 -19
  54. data/spec/active_resource.rb +0 -0
  55. data/spec/config/custom.yml +1 -0
  56. data/spec/config/default.yml +28 -0
  57. data/spec/spec_helper.rb +46 -1
  58. data/spec/support/boot_helper.rb +15 -0
  59. data/spec/support/generator_helper.rb +13 -0
  60. data/spec/support/logger_helper.rb +12 -0
  61. data/spec/unit/bin/howitzer_spec.rb +175 -0
  62. data/spec/unit/generators/generators_spec.rb +175 -0
  63. data/spec/unit/lib/capybara_settings_spec.rb +170 -0
  64. data/spec/unit/lib/helpers_spec.rb +619 -0
  65. data/spec/unit/lib/init_spec.rb +14 -0
  66. data/spec/unit/lib/settings_spec.rb +17 -0
  67. data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +62 -0
  68. data/spec/unit/lib/utils/data_generator/gen_spec.rb +151 -0
  69. data/spec/unit/lib/utils/email/email_spec.rb +75 -0
  70. data/spec/unit/lib/utils/email/mail_client_spec.rb +115 -0
  71. data/spec/unit/lib/utils/email/mailgun_helper_spec.rb +95 -0
  72. data/spec/unit/lib/utils/locator_store_spec.rb +122 -0
  73. data/spec/unit/lib/utils/log_spec.rb +107 -0
  74. data/spec/unit/lib/utils/page_validator_spec.rb +142 -0
  75. data/spec/unit/lib/web_page_spec.rb +250 -0
  76. data/spec/unit/version_spec.rb +8 -0
  77. metadata +215 -15
  78. data/Gemfile.lock +0 -103
  79. data/History.md +0 -20
  80. data/lib/howitzer/utils/logger.rb +0 -108
  81. data/spec/howitzer/version_spec.rb +0 -8
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+ require "#{lib_path}/howitzer/utils/locator_store"
3
+
4
+ describe "Locator store" do
5
+ let(:bad_name) { 'name' }
6
+ let(:error) { LocatorStore::LocatorNotDefinedError }
7
+
8
+ shared_examples "locator methods" do |prefix, web_page|
9
+ describe "#{prefix}locator" do
10
+ context "when bad locator given" do
11
+ subject { web_page.locator(bad_name) }
12
+ it { expect {subject}.to raise_error(error) }
13
+ end
14
+ context "when CSS locator given" do
15
+ before { web_page.add_locator :base_locator, 'base_locator' }
16
+ subject { web_page.locator(:base_locator) }
17
+ it { expect(subject).to eq('base_locator') }
18
+ end
19
+ context "when XPATH locator given" do
20
+ before { web_page.add_locator :test_xpath, xpath: "//select[@id='modelOptions']/option[@value='m6']" }
21
+ subject { web_page.locator(:test_xpath) }
22
+ it { expect(subject).to eq([:xpath, "//select[@id='modelOptions']/option[@value='m6']"]) }
23
+ end
24
+ end
25
+
26
+ describe "#{prefix}link_locator" do
27
+ context "when bad locator given" do
28
+ subject { web_page.link_locator(bad_name) }
29
+ it { expect {subject}. to raise_error(error) }
30
+ end
31
+ context "when correct locator given" do
32
+ before { web_page.add_link_locator :link_locator, 'link_locator' }
33
+ subject { web_page.link_locator(:link_locator) }
34
+ it { expect(subject).to eq('link_locator') }
35
+ end
36
+ end
37
+
38
+ describe "#{prefix}field_locator" do
39
+ context "when bad locator given" do
40
+ subject { web_page.field_locator(bad_name) }
41
+ it { expect {subject}. to raise_error(error) }
42
+ end
43
+ context "when correct locator given" do
44
+ before { web_page.add_field_locator :field_locator, 'field_locator' }
45
+ subject { web_page.field_locator(:field_locator) }
46
+ it { expect(subject).to eq('field_locator') }
47
+ end
48
+ end
49
+
50
+ describe "#{prefix}button_locator" do
51
+ context "when bad locator given" do
52
+ subject { web_page.button_locator(bad_name) }
53
+ it { expect {subject}. to raise_error(error) }
54
+ end
55
+ context "when correct locator given" do
56
+ before { web_page.add_button_locator :button_locator, 'button_locator' }
57
+ subject { web_page.button_locator(:button_locator) }
58
+ it { expect(subject).to eq('button_locator') }
59
+ end
60
+ end
61
+
62
+ describe "#{prefix}find_element" do
63
+ context "when existing locator name given" do
64
+ context "of base type" do
65
+ before { web_page.add_locator :test_locator, '.foo' }
66
+ subject { web_page.find_element(name) }
67
+ context "as string" do
68
+ let(:name) { "test_locator" }
69
+ it do
70
+ expect(web_page.is_a?(Class) ? web_page : web_page.class).to receive(:find).with('.foo')
71
+ subject
72
+ end
73
+ end
74
+ context "as symbol" do
75
+ let(:name) { :test_locator }
76
+ it do
77
+ expect(web_page.is_a?(Class) ? web_page : web_page.class).to receive(:find).with('.foo')
78
+ subject
79
+ end
80
+ end
81
+ end
82
+ context "when link locator or other" do
83
+ before { web_page.add_link_locator :test_link_locator, 'foo' }
84
+ subject { web_page.find_element(:test_link_locator) }
85
+ it do
86
+ expect(web_page.is_a?(Class) ? web_page : web_page.class).to receive(:find_link).with('foo')
87
+ subject
88
+ end
89
+ end
90
+ end
91
+ context "when not existing locator name" do
92
+ subject { web_page.find_element(:unknown_locator) }
93
+ it { expect{ subject }.to raise_error(LocatorStore::LocatorNotDefinedError, "unknown_locator") }
94
+ end
95
+ end
96
+
97
+ describe "#{prefix}apply" do
98
+ context "when bad locator given" do
99
+ before { web_page.add_locator :test_locator, lambda{|test| test} }
100
+ let(:locator) { lambda{|test| test} }
101
+ subject { web_page.apply(locator, 'test') }
102
+ it { expect {subject}.to raise_error(NoMethodError) }
103
+
104
+ end
105
+ context "when correct locator given" do
106
+ before { web_page.add_locator :test_locator, lambda{|location_name| {xpath: ".//a[contains(.,'#{location_name}')]"}} }
107
+ let(:locator) { lambda{|location_name| {xpath: ".//a[contains(.,'#{location_name}')]"}} }
108
+ subject { web_page.apply(locator, 'Kiev') }
109
+ it { expect(subject).to eq([:xpath, ".//a[contains(.,'Kiev')]"]) }
110
+ end
111
+ end
112
+ end
113
+
114
+ context "Class methods" do
115
+ it_behaves_like "locator methods", '.', Class.new{ include LocatorStore }
116
+ end
117
+
118
+ context "Instance methods" do
119
+ it_behaves_like "locator methods", '#', Class.new{ include LocatorStore }.new
120
+ end
121
+
122
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+ require "#{lib_path}/howitzer/utils/log"
3
+ include LoggerHelper
4
+
5
+ describe "Logger" do
6
+ let(:path) { File.join(log_path,'log.txt') }
7
+ context "#log" do
8
+ subject { log }
9
+ let(:other_log) { Howitzer::Log.instance }
10
+ it { expect(subject).to be_a_kind_of(Howitzer::Log) }
11
+ it { expect(subject).to equal(other_log) }
12
+ end
13
+
14
+ context ".print_feature_name" do
15
+ let(:feature) { 'Some feature' }
16
+ let(:expected_result) { "*** Feature: SOME FEATURE ***\n"}
17
+ subject { read_file(path) }
18
+ before { log.print_feature_name(feature) }
19
+ after { clear_file(path) }
20
+ it { expect(subject).to include(expected_result) }
21
+ end
22
+
23
+ context ".settings_as_formatted_text" do
24
+ let(:formatted_text) { Faker::Lorem.sentence }
25
+ let(:as_formatted_text) { double() }
26
+ let(:expected_result) { formatted_text }
27
+ subject { read_file(path) }
28
+ before do
29
+ expect(settings).to receive(:as_formatted_text).and_return(formatted_text)
30
+ log.settings_as_formatted_text
31
+ end
32
+ after { clear_file(path) }
33
+ it { expect(subject).to include(expected_result) }
34
+ end
35
+
36
+ context ".print_scenario_name" do
37
+ let(:expected_result) { " => Scenario: Some scenario\n" }
38
+ let(:scenario) { 'Some scenario' }
39
+ subject { read_file(path) }
40
+ before { log.print_scenario_name(scenario) }
41
+ after { clear_file(path) }
42
+ it { expect(subject).to include(expected_result) }
43
+ end
44
+
45
+ context ".error" do
46
+ context "when one argument given" do
47
+ subject { log.error(*args) }
48
+ context "when exception given as argument" do
49
+ let(:args) { [StandardError.new("Exception_error_message")] }
50
+ it { expect {subject}.to raise_error(StandardError, "Exception_error_message") }
51
+ end
52
+ context "when message given as argument" do
53
+ let(:args) { ["Runtime_error_message"] }
54
+ it { expect {subject}.to raise_error(RuntimeError, "Runtime_error_message") }
55
+ end
56
+ context "when error object given as arg " do
57
+ let(:error_object) { ErrorObject = StandardError.new }
58
+ let(:args) { error_object }
59
+ it { expect {subject}.to raise_error(StandardError) }
60
+ it { expect(read_file(path)).to include("[ERROR] [StandardError] StandardError") }
61
+ end
62
+ context "when number given as arg" do
63
+ let(:args) { 123 }
64
+ it { expect {subject}.to raise_error(RuntimeError) }
65
+ end
66
+ end
67
+ context "when two arguments given" do
68
+ subject { log.error(*args) }
69
+ context "when given text as first arg and caller as second" do
70
+ let(:args) { ["Some_text","two_args_caller"] }
71
+ it { expect {subject}.to raise_error(RuntimeError) }
72
+ it { expect(read_file(path)).to include("[ERROR] [RuntimeError] Some_text") }
73
+ it { expect(read_file(path)).to include("two_args_caller") }
74
+ end
75
+ context "when given class inherited from Exception as first arg and message as second" do
76
+ let(:error_class) {SomeError = Class.new(Exception) }
77
+ let(:args) { [error_class,"some text"] }
78
+ it { expect { subject }.to raise_error(error_class,"some text") }
79
+ it { expect(read_file(path)).to include("[ERROR] [SomeError] some text") }
80
+ end
81
+ context "when given some class as first arg and (message) as second" do
82
+ let(:some_class) { SomeClass = Class.new() }
83
+ let(:args) { [some_class, "some text" ] }
84
+ it { expect{subject}.to raise_error(RuntimeError) }
85
+ it { expect(read_file(path)).to include("[ERROR] [RuntimeError] SomeClass\n\tsome text") }
86
+ end
87
+ context "when number given as first arg and message as second" do
88
+ let(:args) { [123, 'some text' ] }
89
+ it { expect{subject}.to raise_error(RuntimeError) }
90
+ it { expect(read_file(path)).to include("[ERROR] [RuntimeError] 123\n\tsome text") }
91
+ end
92
+ context "when nubmers given as args" do
93
+ let(:args) { [123,123] }
94
+ it { expect{subject}.to raise_error(TypeError) }
95
+ end
96
+ end
97
+ context "when three arguments given" do
98
+ subject { log.error(*args) }
99
+ context "when NameError given as first arg, message as second and caller as third" do
100
+ let(:args) { [NameError, "Name_error_text","three_args_caller"] }
101
+ it { expect {subject}.to raise_error(NameError) }
102
+ it { expect(read_file(path)).to include("[ERROR] [NameError] Name_error_text") }
103
+ it { expect(read_file(path)).to include("three_args_caller") }
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,142 @@
1
+ require 'spec_helper'
2
+ require "#{lib_path}/howitzer/utils/page_validator"
3
+
4
+ describe Howitzer::Utils::PageValidator do
5
+ describe ".validations" do
6
+ it { expect(subject.validations).to eql({}) }
7
+ end
8
+ end
9
+
10
+ describe "PageValidator" do
11
+ let(:web_page) { Class.new { include Howitzer::Utils::PageValidator }.new }
12
+ describe "#check_correct_page_loaded" do
13
+ subject { web_page.check_correct_page_loaded }
14
+ context "when no validation specified" do
15
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::NoValidationError, "No any page validation was found") }
16
+ end
17
+ context "when all validation are specified" do
18
+ before do
19
+ web_page.class.validates :title, pattern: /Foo/
20
+ web_page.class.validates :url, pattern: /Foo/
21
+ web_page.class.validates :element_presence, locator: :test_locator
22
+ end
23
+ it do
24
+ expect(web_page).to receive(:wait_for_url).with(/Foo/).once
25
+ expect(web_page).to receive(:wait_for_title).with(/Foo/).once
26
+ expect(web_page).to receive(:find_element).with(:test_locator)
27
+ subject
28
+ end
29
+ end
30
+ end
31
+
32
+ describe ".validates" do
33
+ subject { web_page.class.validates(name, options)}
34
+ context "when name = :url" do
35
+ context "as string" do
36
+ let(:name) { "url" }
37
+ context "when options is correct" do
38
+ context "(as string)" do
39
+ let(:options) { {"pattern" => /foo/} }
40
+ it do
41
+ expect(subject).to be_a(Proc)
42
+ expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to eql(subject)
43
+ end
44
+ end
45
+ context "(as symbol)" do
46
+ let(:options) { {pattern: /foo/} }
47
+ it do
48
+ expect(subject).to be_a(Proc)
49
+ expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to eql(subject)
50
+ end
51
+ end
52
+ end
53
+ context "when options is incorrect" do
54
+ context "(missing pattern)" do
55
+ let(:options) { {} }
56
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") }
57
+ end
58
+ context "(string pattern)" do
59
+ let(:options) { {pattern: "foo"} }
60
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") }
61
+ end
62
+ context "(not hash)" do
63
+ let(:options) { "foo" }
64
+ it { expect{subject}.to raise_error(TypeError, "Expected options to be Hash, actual is 'String'") }
65
+ end
66
+ end
67
+ end
68
+ context "as symbol" do
69
+ let(:name) { :url }
70
+ let(:options) { {pattern: /foo/} }
71
+ it do
72
+ expect(subject).to be_a(Proc)
73
+ expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to eql(subject)
74
+ end
75
+ end
76
+ end
77
+ context "when name = :element_presence" do
78
+ let(:name) { :element_presence }
79
+ context "when options is correct" do
80
+ context "(as string)" do
81
+ let(:options) { {"locator" => 'test_locator'} }
82
+ it do
83
+ expect(subject).to be_a(Proc)
84
+ expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:element_presence]).to eql(subject)
85
+ end
86
+ end
87
+ context "(as symbol)" do
88
+ let(:options) { {locator: :test_locator} }
89
+ it do
90
+ expect(subject).to be_a(Proc)
91
+ expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:element_presence]).to eql(subject)
92
+ end
93
+ end
94
+ end
95
+ context "when options is incorrect" do
96
+ context "(missing locator)" do
97
+ let(:options) { {} }
98
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':locator' option as one of page locator names") }
99
+ end
100
+ context "(blank locator name)" do
101
+ let(:options) { {locator: ""} }
102
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':locator' option as one of page locator names") }
103
+ end
104
+ end
105
+ end
106
+ context "when name = :title" do
107
+ let(:name) { :title }
108
+ context "when options is correct" do
109
+ context "(as string)" do
110
+ let(:options) { {"pattern" => /foo/} }
111
+ it do
112
+ expect(subject).to be_a(Proc)
113
+ expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to eql(subject)
114
+ end
115
+ end
116
+ context "(as symbol)" do
117
+ let(:options) { {pattern: /foo/} }
118
+ it do
119
+ expect(subject).to be_a(Proc)
120
+ expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to eql(subject)
121
+ end
122
+ end
123
+ end
124
+ context "when options is incorrect" do
125
+ context "(missing pattern)" do
126
+ let(:options) { {} }
127
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") }
128
+ end
129
+ context "(string pattern)" do
130
+ let(:options) { {pattern: "foo"} }
131
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") }
132
+ end
133
+ end
134
+ end
135
+ context "when other name" do
136
+ let(:name) { :unknown }
137
+ let(:options) { {} }
138
+ it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::UnknownValidationName, "unknown 'unknown' validation name") }
139
+ end
140
+ end
141
+
142
+ end
@@ -0,0 +1,250 @@
1
+ require 'spec_helper'
2
+ require "#{lib_path}/howitzer/web_page"
3
+ require "#{lib_path}/howitzer/utils/capybara_settings"
4
+
5
+
6
+ describe "WebPage" do
7
+ describe ".open" do
8
+ let(:url_value) { "google.com" }
9
+ let(:retryable) { double }
10
+ let(:check_correct_page_loaded) { double }
11
+ let(:other_instance) { WebPage.instance }
12
+ subject { WebPage.open(url_value) }
13
+ before do
14
+ stub_const("WebPage::URL_PATTERN", 'pattern')
15
+ allow(WebPage.instance).to receive(:check_correct_page_loaded) { true }
16
+ end
17
+ it do
18
+ expect(log).to receive(:info).with("Open WebPage page by 'google.com' url")
19
+ expect(WebPage).to receive(:retryable) { retryable }
20
+ expect(subject).to eq(other_instance)
21
+ subject
22
+ end
23
+ end
24
+
25
+ describe ".given" do
26
+ let(:wait_for_url) { double }
27
+ before do
28
+ stub_const("WebPage::URL_PATTERN",'pattern')
29
+ allow(WebPage.instance).to receive(:check_correct_page_loaded) { true }
30
+ end
31
+ it do
32
+ expect(WebPage.given).to be_a_kind_of(WebPage)
33
+ end
34
+ end
35
+
36
+ describe "#tinymce_fill_in" do
37
+ subject { WebPage.instance.tinymce_fill_in(name,options) }
38
+ let(:name) { 'name' }
39
+ let(:options) { {with: "some content"} }
40
+ before do
41
+ allow(WebPage.instance).to receive(:current_url) { "google.com" }
42
+ allow(settings).to receive(:driver) { driver_name }
43
+ end
44
+ context "when correct driver specified" do
45
+ let(:driver_name) { 'selenium' }
46
+ let(:page) { double }
47
+ let(:driver) { double }
48
+ let(:browser) { double }
49
+ let(:switch_to) { double }
50
+ let(:find) { double }
51
+ let(:native) { double }
52
+ it do
53
+ expect(WebPage.instance).to receive(:page).exactly(3).times { page }
54
+ expect(page).to receive(:driver).ordered { driver }
55
+ expect(driver).to receive(:browser).ordered { browser }
56
+ expect(browser).to receive(:switch_to).ordered { switch_to }
57
+ expect(switch_to).to receive(:frame).with("name_ifr").once
58
+
59
+ expect(page).to receive(:find).with(:css, '#tinymce').ordered { find }
60
+ expect(find).to receive(:native).ordered { native }
61
+ expect(native).to receive(:send_keys).with("some content").once
62
+
63
+ expect(page).to receive(:driver) { driver }
64
+ expect(driver).to receive(:browser) { browser }
65
+ expect(browser).to receive(:switch_to) { switch_to }
66
+ expect(switch_to).to receive(:default_content)
67
+
68
+ subject
69
+ end
70
+ end
71
+ context "when incorrect driver specified" do
72
+ let(:driver_name) { 'ff' }
73
+ let(:page) { double }
74
+ it do
75
+ expect(WebPage.instance).to receive(:page) { page }
76
+ expect(page).to receive(:execute_script).with("tinyMCE.get('name').setContent('some content')")
77
+ subject
78
+ end
79
+ end
80
+ end
81
+ describe "#click_alert_box" do
82
+ subject { WebPage.instance.click_alert_box(flag_value) }
83
+ before do
84
+ allow(settings).to receive(:driver) { driver_name }
85
+ allow(settings).to receive(:timeout_tiny) { 0 }
86
+ allow(WebPage.instance).to receive(:current_url) { "google.com" }
87
+ end
88
+ context "when flag true and correct driver specified" do
89
+ let(:flag_value) { true }
90
+ let(:page) { double }
91
+ let(:alert) { double }
92
+ let(:driver) { double }
93
+ let(:browser) { double }
94
+ let(:switch_to) { double }
95
+ let(:driver_name) { 'selenium' }
96
+ it do
97
+ expect(WebPage.instance).to receive(:page) { page }
98
+ expect(page).to receive(:driver).ordered { driver }
99
+ expect(driver).to receive(:browser).ordered { browser }
100
+ expect(browser).to receive(:switch_to).ordered { switch_to }
101
+ expect(switch_to).to receive(:alert).ordered { alert }
102
+ expect(alert).to receive(:accept).once
103
+ subject
104
+ end
105
+ end
106
+ context "when flag false and correct driver specified" do
107
+ let(:flag_value) { false }
108
+ let(:page) { double }
109
+ let(:alert) { double }
110
+ let(:driver) { double }
111
+ let(:browser) { double }
112
+ let(:switch_to) { double }
113
+ let(:driver_name) { 'selenium' }
114
+ it do
115
+ expect(WebPage.instance).to receive(:page) { page }
116
+ expect(page).to receive(:driver).ordered { driver }
117
+ expect(driver).to receive(:browser).ordered { browser }
118
+ expect(browser).to receive(:switch_to).ordered { switch_to }
119
+ expect(switch_to).to receive(:alert).ordered { alert }
120
+ expect(alert).to receive(:dismiss).once
121
+ subject
122
+ end
123
+ end
124
+ context "when flag true and wrong driver specified" do
125
+ let(:flag_value) { true }
126
+ let(:page) { double }
127
+ let(:driver_name) { 'ff' }
128
+ it do
129
+ expect(WebPage.instance).to receive(:page) { page }
130
+ expect(page).to receive(:evaluate_script).with('window.confirm = function() { return true; }')
131
+ subject
132
+ end
133
+ end
134
+ context "when flag false and wrong driver specified" do
135
+ let(:driver_name) { 'ff' }
136
+ let(:flag_value) { false }
137
+ let(:page) { double }
138
+ it do
139
+ expect(WebPage.instance).to receive(:page) { page }
140
+ expect(page).to receive(:evaluate_script).with('window.confirm = function() { return false; }')
141
+ subject
142
+ end
143
+ end
144
+ end
145
+
146
+ describe "#js_click" do
147
+ subject { WebPage.instance.js_click(".some_class") }
148
+ before do
149
+ allow(settings).to receive(:timeout_tiny) { 0.1 }
150
+ allow(WebPage.instance).to receive(:current_url) { "google.com" }
151
+ end
152
+ let(:page) { double }
153
+ it do
154
+ expect(WebPage.instance).to receive(:page) { page }
155
+ expect(page).to receive(:execute_script).with("$('.some_class').trigger('click')")
156
+ subject
157
+ end
158
+
159
+ end
160
+
161
+ describe "#wait_for_title" do
162
+ subject { WebPage.instance.wait_for_title(expected_title) }
163
+ before do
164
+ allow(settings).to receive(:timeout_small) { 0.1 }
165
+ allow(WebPage.instance).to receive(:title) { "title" }
166
+ end
167
+ context "when title equals expected title" do
168
+ let(:expected_title) { "title" }
169
+ it do
170
+ expect(subject).to be_true
171
+ end
172
+ end
173
+ context "when title not equals expected title" do
174
+ let(:expected_title) { "bad title" }
175
+ let(:error) { WebPage::IncorrectPageError }
176
+ let(:error_message) { "Current title: title, expected: bad title" }
177
+ it { expect{subject}.to raise_error(error,error_message) }
178
+ end
179
+ end
180
+
181
+ describe "#wait_for_url" do
182
+ subject { WebPage.instance.wait_for_url(expected_url) }
183
+ before do
184
+ allow(settings).to receive(:timeout_small) { 0.1 }
185
+ allow(WebPage.instance).to receive(:current_url) { "google.com" }
186
+ end
187
+ context "when current_url equals expected_url" do
188
+ let(:expected_url) { "google.com" }
189
+ it { expect(subject).to be_true }
190
+ end
191
+ context "when current_url not equals expected_url" do
192
+ let(:expected_url) { "bad_url" }
193
+ let(:error) { WebPage::IncorrectPageError }
194
+ let(:error_message) { "Current url: google.com, expected: #{expected_url}" }
195
+ it { expect{subject}.to raise_error(error, error_message) }
196
+ end
197
+ end
198
+
199
+ describe "#reload" do
200
+ let(:wait_for_url) { double }
201
+ subject { WebPage.instance.reload }
202
+ let(:visit) { double }
203
+ let(:webpage) { double }
204
+ before do
205
+ allow(WebPage.instance).to receive(:current_url) { "google.com" }
206
+ stub_const("WebPage::URL_PATTERN",'pattern')
207
+ allow(wait_for_url).to receive('pattern').and_return { true }
208
+ end
209
+ it do
210
+ expect(log).to receive(:info) { "Reload 'google.com' " }
211
+ expect(WebPage.instance).to receive(:visit).with("google.com")
212
+ subject
213
+ end
214
+ end
215
+
216
+ describe ".title" do
217
+ let(:page) { double }
218
+ subject { WebPage.instance.title }
219
+ before do
220
+ allow(WebPage.instance).to receive(:current_url) { "google.com" }
221
+ end
222
+ it do
223
+ expect(WebPage.instance).to receive(:page) { page }
224
+ expect(page).to receive(:title)
225
+ subject
226
+ end
227
+ end
228
+
229
+ describe ".current_url" do
230
+ let(:page) { double }
231
+ subject { WebPage.current_url }
232
+ it do
233
+ expect(WebPage).to receive(:page) { page }
234
+ expect(page).to receive(:current_url) { "google.com" }
235
+ expect(subject).to eq("google.com")
236
+ end
237
+ end
238
+
239
+ describe ".text" do
240
+ let(:page) { double }
241
+ let(:find) { double }
242
+ subject { WebPage.text }
243
+ it do
244
+ expect(WebPage).to receive(:page) { page }
245
+ expect(page).to receive(:find).with('body') { find }
246
+ expect(find).to receive(:text) { "some body text" }
247
+ expect(subject).to eq("some body text")
248
+ end
249
+ end
250
+ end