howitzer 1.0.1 → 1.0.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/.gitignore +4 -1
- data/.travis.yml +3 -2
- data/CHANGELOG.md +25 -5
- data/GETTING_STARTED.md +158 -13
- data/README.md +49 -32
- data/Rakefile +10 -1
- data/bin/howitzer +49 -78
- data/features/cli_help.feature +30 -0
- data/features/cli_new.feature +263 -0
- data/features/cli_unknown.feature +17 -0
- data/features/cli_version.feature +14 -0
- data/features/step_definitions/common_steps.rb +1 -0
- data/features/support/env.rb +1 -0
- data/features/support/transformers.rb +3 -0
- data/generators/base_generator.rb +2 -0
- data/generators/config/config_generator.rb +1 -1
- data/generators/config/templates/default.yml +4 -14
- data/generators/cucumber/cucumber_generator.rb +1 -1
- data/generators/cucumber/templates/cucumber.yml +1 -2
- data/generators/cucumber/templates/env.rb +8 -7
- data/generators/emails/emails_generator.rb +1 -1
- data/generators/pages/pages_generator.rb +1 -1
- data/generators/pages/templates/example_page.rb +2 -2
- data/generators/root/root_generator.rb +1 -1
- data/generators/root/templates/Gemfile +1 -1
- data/generators/rspec/rspec_generator.rb +1 -1
- data/generators/rspec/templates/example_spec.rb +2 -2
- data/generators/rspec/templates/rspec.rake +1 -1
- data/generators/rspec/templates/spec_helper.rb +6 -5
- data/generators/tasks/tasks_generator.rb +1 -1
- data/generators/tasks/templates/common.rake +1 -0
- data/howitzer.gemspec +8 -8
- data/lib/howitzer.rb +4 -1
- data/lib/howitzer/blank_page.rb +6 -0
- data/lib/howitzer/capybara/dsl_ex.rb +15 -0
- data/lib/howitzer/capybara/settings.rb +267 -0
- data/lib/howitzer/email.rb +134 -0
- data/lib/howitzer/exceptions.rb +18 -0
- data/lib/howitzer/helpers.rb +34 -23
- data/lib/howitzer/init.rb +1 -4
- data/lib/howitzer/mailgun/client.rb +48 -0
- data/lib/howitzer/mailgun/connector.rb +34 -0
- data/lib/howitzer/mailgun/response.rb +28 -0
- data/lib/howitzer/utils.rb +2 -2
- data/lib/howitzer/utils/data_generator/data_storage.rb +15 -2
- data/lib/howitzer/utils/data_generator/gen.rb +14 -10
- data/lib/howitzer/utils/locator_store.rb +14 -7
- data/lib/howitzer/utils/log.rb +2 -0
- data/lib/howitzer/utils/page_validator.rb +74 -27
- data/lib/howitzer/version.rb +1 -1
- data/lib/howitzer/web_page.rb +83 -32
- data/spec/config/default.yml +10 -12
- data/spec/spec_helper.rb +12 -0
- data/spec/support/mailgun_unit_client.rb +60 -0
- data/spec/unit/generators/generators_spec.rb +7 -7
- data/spec/unit/lib/capybara/dsl_ex_spec.rb +60 -0
- data/spec/unit/lib/{capybara_settings_spec.rb → capybara/settings_spec.rb} +16 -10
- data/spec/unit/lib/email_spec.rb +129 -0
- data/spec/unit/lib/helpers_spec.rb +160 -34
- data/spec/unit/lib/init_spec.rb +1 -12
- data/spec/unit/lib/mailgun/client_spec.rb +36 -0
- data/spec/unit/lib/mailgun/connector_spec.rb +70 -0
- data/spec/unit/lib/mailgun/response_spec.rb +29 -0
- data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +23 -5
- data/spec/unit/lib/utils/data_generator/gen_spec.rb +2 -63
- data/spec/unit/lib/utils/locator_store_spec.rb +41 -6
- data/spec/unit/lib/utils/log_spec.rb +1 -1
- data/spec/unit/lib/utils/page_validator_spec.rb +149 -25
- data/spec/unit/lib/web_page_spec.rb +127 -53
- metadata +102 -142
- data/lib/howitzer/utils/capybara_patched.rb +0 -23
- data/lib/howitzer/utils/capybara_settings.rb +0 -247
- data/lib/howitzer/utils/email/email.rb +0 -85
- data/lib/howitzer/utils/email/mail_client.rb +0 -132
- data/lib/howitzer/utils/email/mailgun.rb +0 -175
- data/lib/howitzer/utils/email/mailgun_helper.rb +0 -61
- data/spec/unit/bin/howitzer_spec.rb +0 -175
- data/spec/unit/lib/utils/email/email_spec.rb +0 -75
- data/spec/unit/lib/utils/email/mail_client_spec.rb +0 -115
- data/spec/unit/lib/utils/email/mailgun_helper_spec.rb +0 -95
data/spec/unit/lib/init_spec.rb
CHANGED
@@ -1,14 +1,3 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require
|
2
|
+
require 'howitzer/utils/data_generator/gen.rb'
|
3
3
|
require 'capybara/dsl'
|
4
|
-
|
5
|
-
describe "Helpers" do
|
6
|
-
before do
|
7
|
-
stub_const("Mailgun", double)
|
8
|
-
expect(settings).to receive(:mailgun_api_key){ 'some_api' }
|
9
|
-
end
|
10
|
-
it "should init Mailgun and include modules" do
|
11
|
-
expect(Mailgun).to receive(:init).with('some_api').once
|
12
|
-
require "#{lib_path}/howitzer/init.rb"
|
13
|
-
end
|
14
|
-
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'howitzer/mailgun/client'
|
3
|
+
|
4
|
+
describe Mailgun::Client do
|
5
|
+
let(:mg_obj) { Mailgun::Client.new("Fake-API-Key") }
|
6
|
+
describe ".new" do
|
7
|
+
subject { mg_obj }
|
8
|
+
it { expect { subject }.not_to raise_error }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#get" do
|
12
|
+
let(:query_string){ {'skip' => '10', 'limit' => '5'} }
|
13
|
+
subject { mg_obj.get("test.com/bounces", query_string) }
|
14
|
+
context "when simulation of client" do
|
15
|
+
before do
|
16
|
+
expect(RestClient::Resource).to receive(:new).once { Mailgun::UnitClient::new('Fake-API-Key', 'api.mailgun.net', 'v2') }
|
17
|
+
end
|
18
|
+
it do
|
19
|
+
expect(subject.body).to include("total_count")
|
20
|
+
expect(subject.body).to include("items")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
context "when real client" do
|
24
|
+
let(:resource) { double }
|
25
|
+
before do
|
26
|
+
allow(resource).to receive('[]'){ resource }
|
27
|
+
allow(resource).to receive(:get).and_raise(StandardError, '401 Unauthorized: Forbidden')
|
28
|
+
allow(RestClient::Resource).to receive(:new) { resource }
|
29
|
+
end
|
30
|
+
it do
|
31
|
+
expect(log).to receive(:error).with(Howitzer::CommunicationError, '401 Unauthorized: Forbidden').once.and_call_original
|
32
|
+
expect { subject }.to raise_error(Howitzer::CommunicationError)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'howitzer/mailgun/connector'
|
3
|
+
|
4
|
+
describe Mailgun::Connector do
|
5
|
+
let(:connector) { Mailgun::Connector.instance }
|
6
|
+
let(:domain_name) { 'test@domain.com' }
|
7
|
+
describe "#client" do
|
8
|
+
subject { connector.client }
|
9
|
+
context "when api_key is default" do
|
10
|
+
context "when client is not initialized" do
|
11
|
+
it { expect(subject).to be_an_instance_of Mailgun::Client }
|
12
|
+
end
|
13
|
+
context "when client is already initialized" do
|
14
|
+
it do
|
15
|
+
object_id = connector.client.object_id
|
16
|
+
expect(subject.object_id).to eq(object_id)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
context "when api_key is custom" do
|
21
|
+
let(:key) { "some api key" }
|
22
|
+
subject { connector.client(key) }
|
23
|
+
it { expect(subject).to be_an_instance_of Mailgun::Client }
|
24
|
+
end
|
25
|
+
context "when api_key is nil" do
|
26
|
+
let(:key) { nil }
|
27
|
+
subject { connector.client(key) }
|
28
|
+
it do
|
29
|
+
expect(log).to receive(:error).with(Howitzer::InvalidApiKeyError, "Api key can not be blank").once.and_call_original
|
30
|
+
expect { subject }.to raise_error(Howitzer::InvalidApiKeyError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
context "when api_key is blank string" do
|
34
|
+
let(:key) { "" }
|
35
|
+
subject { connector.client(key) }
|
36
|
+
it do
|
37
|
+
expect(log).to receive(:error).with(Howitzer::InvalidApiKeyError, "Api key can not be blank").once.and_call_original
|
38
|
+
expect { subject }.to raise_error(Howitzer::InvalidApiKeyError)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
describe '#domain' do
|
43
|
+
subject { connector.domain }
|
44
|
+
context "when domain is not set" do
|
45
|
+
before { connector.instance_variable_set(:@domain, nil)}
|
46
|
+
it do
|
47
|
+
expect(connector).to receive(:change_domain).once{ domain_name }
|
48
|
+
expect(subject).to eq(domain_name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
context "when domain is already set" do
|
52
|
+
before do
|
53
|
+
expect(connector).to receive(:change_domain).never
|
54
|
+
connector.instance_variable_set(:@domain, domain_name)
|
55
|
+
end
|
56
|
+
it { expect(subject).to eql(domain_name) }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#change_domain' do
|
61
|
+
context "when default" do
|
62
|
+
before { connector.change_domain }
|
63
|
+
it { expect(connector.instance_variable_get(:@domain)).to eq(settings.mailgun_domain)}
|
64
|
+
end
|
65
|
+
context "when custom" do
|
66
|
+
before { connector.change_domain(domain_name) }
|
67
|
+
it { expect(connector.instance_variable_get(:@domain)).to eq(domain_name) }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'howitzer/mailgun/client'
|
3
|
+
require 'howitzer/exceptions'
|
4
|
+
|
5
|
+
describe Mailgun::Response do
|
6
|
+
let(:body) { {foo: 'bar'}.to_json }
|
7
|
+
let(:response) { double(:response, body: body, code: 201)}
|
8
|
+
describe "#body" do
|
9
|
+
subject { Mailgun::Response.new(response).body }
|
10
|
+
it { expect(subject).to eq("{\"foo\":\"bar\"}")}
|
11
|
+
end
|
12
|
+
describe "#code" do
|
13
|
+
subject { Mailgun::Response.new(response).code }
|
14
|
+
it { expect(subject).to eq(201)}
|
15
|
+
end
|
16
|
+
describe "#to_h" do
|
17
|
+
subject { Mailgun::Response.new(response).to_h }
|
18
|
+
context "when possible parse body" do
|
19
|
+
it { expect(subject).to eq({"foo"=>"bar"})}
|
20
|
+
end
|
21
|
+
context "when impossible parse body" do
|
22
|
+
let(:body) { '123' }
|
23
|
+
it do
|
24
|
+
expect(log).to receive(:error).with(Howitzer::ParseError, "757: unexpected token at '123'").once.and_call_original
|
25
|
+
expect { subject }.to raise_error(Howitzer::ParseError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require
|
2
|
+
require 'howitzer/utils/data_generator/data_storage'
|
3
3
|
|
4
4
|
describe "DataGenerator" do
|
5
5
|
describe "DataStorage" do
|
6
|
+
before { DataGenerator::DataStorage.data.clear }
|
6
7
|
describe ".store" do
|
7
8
|
subject { DataGenerator::DataStorage.store(ns, 7, :halt) }
|
8
9
|
context "when namespace specified" do
|
@@ -11,8 +12,8 @@ describe "DataGenerator" do
|
|
11
12
|
expect(subject).to eql(:halt)
|
12
13
|
end
|
13
14
|
it "should store namespace value" do
|
14
|
-
|
15
|
-
expect(
|
15
|
+
subject
|
16
|
+
expect(DataGenerator::DataStorage.data[:user]).to eql({7 => :halt})
|
16
17
|
end
|
17
18
|
end
|
18
19
|
context "when namespace empty" do
|
@@ -22,7 +23,7 @@ describe "DataGenerator" do
|
|
22
23
|
end
|
23
24
|
describe ".extract" do
|
24
25
|
subject { DataGenerator::DataStorage.extract(ns, key) }
|
25
|
-
before { DataGenerator::DataStorage.
|
26
|
+
before { DataGenerator::DataStorage.data[:user] = {7 => :exit} }
|
26
27
|
describe "when namespace specified" do
|
27
28
|
let(:ns) { :user }
|
28
29
|
context "and namespace key found" do
|
@@ -51,12 +52,29 @@ describe "DataGenerator" do
|
|
51
52
|
end
|
52
53
|
describe ".clear_ns" do
|
53
54
|
subject { DataGenerator::DataStorage.clear_ns(:user) }
|
54
|
-
before { DataGenerator::DataStorage.
|
55
|
+
before { DataGenerator::DataStorage.data[:user]= {7 => :exit}}
|
55
56
|
it "should return empty hash" do
|
56
57
|
subject
|
57
58
|
adata = DataGenerator::DataStorage.instance_variable_get(:@data)
|
58
59
|
expect(adata[:user]).to eql({})
|
59
60
|
end
|
60
61
|
end
|
62
|
+
describe ".clear_all_ns" do
|
63
|
+
before do
|
64
|
+
DataGenerator::DataStorage.store('sauce', :status, false)
|
65
|
+
DataGenerator::DataStorage.store(:foo, "foo", "some value1")
|
66
|
+
DataGenerator::DataStorage.store(:bar, "bar", "some value2")
|
67
|
+
DataGenerator::DataStorage.store(:baz, "baz", "some value3")
|
68
|
+
end
|
69
|
+
context "when default argument" do
|
70
|
+
before { DataGenerator::DataStorage.clear_all_ns }
|
71
|
+
it { expect(DataGenerator::DataStorage.data).to eq({"sauce"=>{:status=>false}, :foo=>{}, :bar=>{}, :baz=>{}}) }
|
72
|
+
end
|
73
|
+
context "when custom argument" do
|
74
|
+
let(:exception_list) { [:foo, :bar] }
|
75
|
+
before { DataGenerator::DataStorage.clear_all_ns(exception_list) }
|
76
|
+
it { expect(DataGenerator::DataStorage.data).to eq({"sauce"=>{}, :foo=>{"foo"=>"some value1"}, :bar=>{"bar"=>"some value2"}, :baz=>{}}) }
|
77
|
+
end
|
78
|
+
end
|
61
79
|
end
|
62
80
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require
|
2
|
+
require 'howitzer/utils/data_generator/gen'
|
3
3
|
|
4
4
|
describe "DataGenerator" do
|
5
5
|
describe "Gen" do
|
@@ -7,7 +7,7 @@ describe "DataGenerator" do
|
|
7
7
|
subject { DataGenerator::Gen.user(params) }
|
8
8
|
before do
|
9
9
|
allow(settings).to receive(:def_test_pass) { 'test_pass' }
|
10
|
-
allow(settings).to receive(:
|
10
|
+
allow(settings).to receive(:mailgun_domain) { 'mail.com' }
|
11
11
|
allow(DataGenerator::Gen).to receive(:serial) { '012345678abcde' }
|
12
12
|
end
|
13
13
|
context "when params specified" do
|
@@ -23,7 +23,6 @@ describe "DataGenerator" do
|
|
23
23
|
it { expect(subject.password).to eql 'pa$$w0rd' }
|
24
24
|
it { expect(subject.first_name).to eql 'FirstName012345678abcde' }
|
25
25
|
it { expect(subject.last_name).to eql 'LastName012345678abcde' }
|
26
|
-
it { expect(subject.mailbox).to eql 'member@test.com' }
|
27
26
|
end
|
28
27
|
context "with empty params" do
|
29
28
|
let(:params) { {} }
|
@@ -38,7 +37,6 @@ describe "DataGenerator" do
|
|
38
37
|
it { expect(subject.password).to eql 'test_pass' }
|
39
38
|
it { expect(subject.first_name).to eql 'FirstName012345678abcde' }
|
40
39
|
it { expect(subject.last_name).to eql 'LastName012345678abcde' }
|
41
|
-
it { expect(subject.mailbox).to be_nil }
|
42
40
|
end
|
43
41
|
end
|
44
42
|
describe ".given_user_by_number" do
|
@@ -69,20 +67,6 @@ describe "DataGenerator" do
|
|
69
67
|
it { expect(subject).to_not eql ser }
|
70
68
|
end
|
71
69
|
end
|
72
|
-
describe ".delete_all_mailboxes" do
|
73
|
-
subject { DataGenerator::Gen.delete_all_mailboxes }
|
74
|
-
let(:mbox1) { double }
|
75
|
-
let(:mbox2) { double }
|
76
|
-
before do
|
77
|
-
stub_const("DataGenerator::DataStorage", double)
|
78
|
-
expect(DataGenerator::DataStorage).to receive(:extract).with('user') { { 1 => mbox1, 2 => mbox2 } }
|
79
|
-
end
|
80
|
-
it do
|
81
|
-
expect(mbox1).to receive(:delete_mailbox).once
|
82
|
-
expect(mbox2).to receive(:delete_mailbox).once
|
83
|
-
subject
|
84
|
-
end
|
85
|
-
end
|
86
70
|
describe "User" do
|
87
71
|
describe "#initialize" do
|
88
72
|
subject { DataGenerator::Gen::User.new(params) }
|
@@ -100,51 +84,6 @@ describe "DataGenerator" do
|
|
100
84
|
it { expect(subject.first_name).to eql 'Alexey' }
|
101
85
|
it { expect(subject.last_name).to eql 'Petrenko' }
|
102
86
|
it { expect(subject.full_name).to eql 'Alexey Petrenko' }
|
103
|
-
it { expect(subject.mailbox).to eql 'member@test.com' }
|
104
|
-
end
|
105
|
-
describe "#create_mailbox" do
|
106
|
-
subject { nu_user.create_mailbox }
|
107
|
-
let(:nu_user) { DataGenerator::Gen::User.new({ email: 'alex.petrenko@mail.com', mailbox: 'member@test.com' }) }
|
108
|
-
before { stub_const('MailClient', double) }
|
109
|
-
context "should return User object" do
|
110
|
-
before do
|
111
|
-
allow(settings).to receive(:mail_pop3_domain) { 'mail.com' }
|
112
|
-
expect(MailClient).to receive(:create_mailbox).with('alex.petrenko').once { 'petrenko@test.com' }
|
113
|
-
end
|
114
|
-
it { expect(subject).to be_an_instance_of DataGenerator::Gen::User }
|
115
|
-
end
|
116
|
-
context "when mail_pop3_domain settings are equal to @domain" do
|
117
|
-
before do
|
118
|
-
allow(settings).to receive(:mail_pop3_domain) { 'mail.com' }
|
119
|
-
expect(MailClient).to receive(:create_mailbox).with('alex.petrenko').once { 'petrenko@test.com' }
|
120
|
-
end
|
121
|
-
it do
|
122
|
-
subject
|
123
|
-
expect(nu_user.mailbox).to eql 'petrenko@test.com'
|
124
|
-
end
|
125
|
-
end
|
126
|
-
context "when mail_pop3_domain settings are not equal to @domain" do
|
127
|
-
before { allow(settings).to receive(:mail_pop3_domain) { 'post.com' } }
|
128
|
-
it do
|
129
|
-
subject
|
130
|
-
expect(nu_user.mailbox).to eql 'member@test.com'
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
describe "#delete_mailbox" do
|
135
|
-
subject { nu_user.delete_mailbox }
|
136
|
-
let(:nu_user) { DataGenerator::Gen::User.new({ mailbox: mbox }) }
|
137
|
-
before { stub_const('MailClient', double) }
|
138
|
-
context "when mailbox spcified" do
|
139
|
-
before { expect(MailClient).to receive(:delete_mailbox).with(mbox).once { 'mailbox deleted' } }
|
140
|
-
let(:mbox) { 'member@test.com' }
|
141
|
-
it { expect(subject).to eql 'mailbox deleted' }
|
142
|
-
end
|
143
|
-
context "when mailbox not spcified" do
|
144
|
-
before { expect(MailClient).to_not receive(:delete_mailbox).with(mbox) }
|
145
|
-
let(:mbox) { nil }
|
146
|
-
it { expect(subject).to be_nil }
|
147
|
-
end
|
148
87
|
end
|
149
88
|
end
|
150
89
|
end
|
@@ -1,15 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require
|
2
|
+
require 'howitzer/utils/locator_store'
|
3
3
|
|
4
4
|
describe "Locator store" do
|
5
5
|
let(:bad_name) { 'name' }
|
6
|
-
let(:error) {
|
6
|
+
let(:error) { Howitzer::LocatorNotDefinedError }
|
7
7
|
|
8
8
|
shared_examples "locator methods" do |prefix, web_page|
|
9
9
|
describe "#{prefix}locator" do
|
10
10
|
context "when bad locator given" do
|
11
11
|
subject { web_page.locator(bad_name) }
|
12
|
-
it
|
12
|
+
it do
|
13
|
+
expect(log).to receive(:error).with(error, bad_name).once.and_call_original
|
14
|
+
expect { subject }.to raise_error(error)
|
15
|
+
end
|
13
16
|
end
|
14
17
|
context "when CSS locator given" do
|
15
18
|
before { web_page.add_locator :base_locator, 'base_locator' }
|
@@ -90,17 +93,49 @@ describe "Locator store" do
|
|
90
93
|
end
|
91
94
|
context "when not existing locator name" do
|
92
95
|
subject { web_page.find_element(:unknown_locator) }
|
93
|
-
it { expect{ subject }.to raise_error(
|
96
|
+
it { expect{ subject }.to raise_error(Howitzer::LocatorNotDefinedError, "unknown_locator") }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
describe "#{prefix}first_element" do
|
100
|
+
context "when existing locator name given" do
|
101
|
+
context "of base type" do
|
102
|
+
before { web_page.add_locator :test_locator, '.foo' }
|
103
|
+
subject { web_page.first_element(name) }
|
104
|
+
context "as string" do
|
105
|
+
let(:name) { "test_locator" }
|
106
|
+
it do
|
107
|
+
expect(web_page.is_a?(Class) ? web_page : web_page.class).to receive(:first).with('.foo')
|
108
|
+
subject
|
109
|
+
end
|
110
|
+
end
|
111
|
+
context "as symbol" do
|
112
|
+
let(:name) { :test_locator }
|
113
|
+
it do
|
114
|
+
expect(web_page.is_a?(Class) ? web_page : web_page.class).to receive(:first).with('.foo')
|
115
|
+
subject
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
context "when link locator or other" do
|
120
|
+
before { web_page.add_link_locator :test_link_locator, 'foo' }
|
121
|
+
subject { web_page.first_element(:test_link_locator) }
|
122
|
+
it do
|
123
|
+
expect(web_page.is_a?(Class) ? web_page : web_page.class).to receive(:first).with(:link, 'foo')
|
124
|
+
subject
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
context "when not existing locator name" do
|
129
|
+
subject { web_page.first_element(:unknown_locator) }
|
130
|
+
it { expect{ subject }.to raise_error(Howitzer::LocatorNotDefinedError, "unknown_locator") }
|
94
131
|
end
|
95
132
|
end
|
96
|
-
|
97
133
|
describe "#{prefix}apply" do
|
98
134
|
context "when bad locator given" do
|
99
135
|
before { web_page.add_locator :test_locator, lambda{|test| test} }
|
100
136
|
let(:locator) { lambda{|test| test} }
|
101
137
|
subject { web_page.apply(locator, 'test') }
|
102
138
|
it { expect {subject}.to raise_error(NoMethodError) }
|
103
|
-
|
104
139
|
end
|
105
140
|
context "when correct locator given" do
|
106
141
|
before { web_page.add_locator :test_locator, lambda{|location_name| {xpath: ".//a[contains(.,'#{location_name}')]"}} }
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require "
|
2
|
+
require "howitzer/utils/page_validator"
|
3
|
+
require "howitzer/utils/locator_store"
|
3
4
|
|
4
5
|
describe Howitzer::Utils::PageValidator do
|
5
6
|
describe ".validations" do
|
@@ -8,29 +9,57 @@ describe Howitzer::Utils::PageValidator do
|
|
8
9
|
end
|
9
10
|
|
10
11
|
describe "PageValidator" do
|
11
|
-
let(:
|
12
|
-
|
13
|
-
|
12
|
+
let(:web_page_class) do
|
13
|
+
Class.new do
|
14
|
+
include LocatorStore
|
15
|
+
include Howitzer::Utils::PageValidator
|
16
|
+
def self.name
|
17
|
+
'TestWebPageClass'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
let(:web_page) { web_page_class.new }
|
22
|
+
describe "#check_validations_are_defined!" do
|
23
|
+
subject { web_page.check_validations_are_defined! }
|
14
24
|
context "when no validation specified" do
|
15
|
-
it
|
25
|
+
it do
|
26
|
+
expect(log).to receive(:error).with(Howitzer::NoValidationError, "No any page validation was found for 'TestWebPageClass' page").once.and_call_original
|
27
|
+
expect { subject }.to raise_error(Howitzer::NoValidationError)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
context "when old validation style is using" do
|
31
|
+
before { web_page_class.const_set("URL_PATTERN",/Foo/) }
|
32
|
+
after { web_page_class.send :remove_const, "URL_PATTERN"}
|
33
|
+
it do
|
34
|
+
expect(web_page_class).to receive(:validates).with(:url, pattern: /Foo/).and_return{ Howitzer::Utils::PageValidator.validations['TestWebPageClass'] = {}}
|
35
|
+
expect{subject}.to_not raise_error
|
36
|
+
end
|
16
37
|
end
|
17
|
-
context "when
|
38
|
+
context "when title validation is specified" do
|
18
39
|
before do
|
19
40
|
web_page.class.validates :title, pattern: /Foo/
|
41
|
+
end
|
42
|
+
it { expect{subject}.to_not raise_error }
|
43
|
+
end
|
44
|
+
context "when url validation is specified" do
|
45
|
+
before do
|
20
46
|
web_page.class.validates :url, pattern: /Foo/
|
21
|
-
web_page.class.validates :element_presence, locator: :test_locator
|
22
47
|
end
|
23
|
-
it
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
48
|
+
it { expect{subject}.to_not raise_error }
|
49
|
+
end
|
50
|
+
context "when element_presence validation is specified" do
|
51
|
+
before do
|
52
|
+
web_page.class.validates :element_presence, locator: :test_locator
|
28
53
|
end
|
54
|
+
it { expect{subject}.to_not raise_error }
|
29
55
|
end
|
30
56
|
end
|
31
57
|
|
32
58
|
describe ".validates" do
|
33
|
-
|
59
|
+
before do
|
60
|
+
Howitzer::Utils::PageValidator.validations[web_page.class.name] = nil
|
61
|
+
end
|
62
|
+
subject { web_page.class.validates(name, options) }
|
34
63
|
context "when name = :url" do
|
35
64
|
context "as string" do
|
36
65
|
let(:name) { "url" }
|
@@ -39,25 +68,31 @@ describe "PageValidator" do
|
|
39
68
|
let(:options) { {"pattern" => /foo/} }
|
40
69
|
it do
|
41
70
|
expect(subject).to be_a(Proc)
|
42
|
-
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to
|
71
|
+
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc
|
43
72
|
end
|
44
73
|
end
|
45
74
|
context "(as symbol)" do
|
46
75
|
let(:options) { {pattern: /foo/} }
|
47
76
|
it do
|
48
77
|
expect(subject).to be_a(Proc)
|
49
|
-
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to
|
78
|
+
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc
|
50
79
|
end
|
51
80
|
end
|
52
81
|
end
|
53
82
|
context "when options is incorrect" do
|
54
83
|
context "(missing pattern)" do
|
55
84
|
let(:options) { {} }
|
56
|
-
it
|
85
|
+
it do
|
86
|
+
expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
|
87
|
+
expect { subject }.to raise_error(Howitzer::WrongOptionError)
|
88
|
+
end
|
57
89
|
end
|
58
90
|
context "(string pattern)" do
|
59
91
|
let(:options) { {pattern: "foo"} }
|
60
|
-
it
|
92
|
+
it do
|
93
|
+
expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
|
94
|
+
expect { subject }.to raise_error(Howitzer::WrongOptionError)
|
95
|
+
end
|
61
96
|
end
|
62
97
|
context "(not hash)" do
|
63
98
|
let(:options) { "foo" }
|
@@ -70,7 +105,7 @@ describe "PageValidator" do
|
|
70
105
|
let(:options) { {pattern: /foo/} }
|
71
106
|
it do
|
72
107
|
expect(subject).to be_a(Proc)
|
73
|
-
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to
|
108
|
+
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc
|
74
109
|
end
|
75
110
|
end
|
76
111
|
end
|
@@ -95,11 +130,17 @@ describe "PageValidator" do
|
|
95
130
|
context "when options is incorrect" do
|
96
131
|
context "(missing locator)" do
|
97
132
|
let(:options) { {} }
|
98
|
-
it
|
133
|
+
it do
|
134
|
+
expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':locator' option as one of page locator names").once.and_call_original
|
135
|
+
expect { subject }.to raise_error(Howitzer::WrongOptionError)
|
136
|
+
end
|
99
137
|
end
|
100
138
|
context "(blank locator name)" do
|
101
139
|
let(:options) { {locator: ""} }
|
102
|
-
it
|
140
|
+
it do
|
141
|
+
expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':locator' option as one of page locator names").once.and_call_original
|
142
|
+
expect { subject }.to raise_error(Howitzer::WrongOptionError)
|
143
|
+
end
|
103
144
|
end
|
104
145
|
end
|
105
146
|
end
|
@@ -110,33 +151,116 @@ describe "PageValidator" do
|
|
110
151
|
let(:options) { {"pattern" => /foo/} }
|
111
152
|
it do
|
112
153
|
expect(subject).to be_a(Proc)
|
113
|
-
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to
|
154
|
+
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to be_a Proc
|
114
155
|
end
|
115
156
|
end
|
116
157
|
context "(as symbol)" do
|
117
158
|
let(:options) { {pattern: /foo/} }
|
118
159
|
it do
|
119
160
|
expect(subject).to be_a(Proc)
|
120
|
-
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to
|
161
|
+
expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to be_a Proc
|
121
162
|
end
|
122
163
|
end
|
123
164
|
end
|
124
165
|
context "when options is incorrect" do
|
125
166
|
context "(missing pattern)" do
|
126
167
|
let(:options) { {} }
|
127
|
-
it
|
168
|
+
it do
|
169
|
+
expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
|
170
|
+
expect { subject }.to raise_error(Howitzer::WrongOptionError)
|
171
|
+
end
|
128
172
|
end
|
129
173
|
context "(string pattern)" do
|
130
174
|
let(:options) { {pattern: "foo"} }
|
131
|
-
it
|
175
|
+
it do
|
176
|
+
expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
|
177
|
+
expect { subject }.to raise_error(Howitzer::WrongOptionError)
|
178
|
+
end
|
132
179
|
end
|
133
180
|
end
|
134
181
|
end
|
135
182
|
context "when other name" do
|
136
183
|
let(:name) { :unknown }
|
137
184
|
let(:options) { {} }
|
138
|
-
it
|
185
|
+
it do
|
186
|
+
expect(log).to receive(:error).with(Howitzer::UnknownValidationError, "unknown 'unknown' validation name").once.and_call_original
|
187
|
+
expect { subject }.to raise_error(Howitzer::UnknownValidationError)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe ".pages" do
|
193
|
+
subject { Howitzer::Utils::PageValidator.pages }
|
194
|
+
it { expect(subject).to eq([]) }
|
195
|
+
it do
|
196
|
+
subject << Class
|
197
|
+
expect(subject).to eql([Class])
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe ".opened?" do
|
202
|
+
subject { web_page_class.opened? }
|
203
|
+
context "when no one validation is defined" do
|
204
|
+
it do
|
205
|
+
expect(log).to receive(:error).with(Howitzer::NoValidationError, "No any page validation was found for 'TestWebPageClass' page").once.and_call_original
|
206
|
+
expect { subject }.to raise_error(Howitzer::NoValidationError)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
context "when all validations are defined" do
|
210
|
+
before do
|
211
|
+
web_page_class.class_eval do
|
212
|
+
add_locator :login, "#id"
|
213
|
+
validates :url, pattern: /foo/
|
214
|
+
validates :title, pattern: /Foo page/
|
215
|
+
validates :element_presence, locator: :login
|
216
|
+
end
|
217
|
+
end
|
218
|
+
context "when all matches" do
|
219
|
+
before do
|
220
|
+
allow(web_page_class).to receive(:url){ 'http://test.com/foo' }
|
221
|
+
allow(web_page_class).to receive(:title){ 'Foo page' }
|
222
|
+
allow(web_page_class).to receive(:first_element).with(:login){ true }
|
223
|
+
end
|
224
|
+
it { expect(subject).to be_true }
|
225
|
+
end
|
226
|
+
context "when first does not match" do
|
227
|
+
before do
|
228
|
+
expect(web_page_class).to receive(:url).once{ 'http://test.com/bar' }
|
229
|
+
expect(web_page_class).to receive(:title).never
|
230
|
+
expect(web_page_class).to receive(:first_element).never
|
231
|
+
end
|
232
|
+
it { expect(subject).to be_false }
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "#matched_pages" do
|
238
|
+
let!(:web_page1_class) do
|
239
|
+
Class.new do
|
240
|
+
include Howitzer::Utils::PageValidator
|
241
|
+
def self.name
|
242
|
+
'TestWebPage1Class'
|
243
|
+
end
|
244
|
+
def self.opened?
|
245
|
+
true
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
let!(:web_page2_class) do
|
251
|
+
Class.new do
|
252
|
+
include Howitzer::Utils::PageValidator
|
253
|
+
def self.name
|
254
|
+
'TestWebPage2Class'
|
255
|
+
end
|
256
|
+
def self.opened?
|
257
|
+
false
|
258
|
+
end
|
259
|
+
end
|
139
260
|
end
|
261
|
+
subject {web_page2_class.matched_pages }
|
262
|
+
before { Howitzer::Utils::PageValidator.instance_variable_set(:@pages, [web_page1_class, web_page2_class]) }
|
263
|
+
it { expect(subject).to eq([web_page1_class]) }
|
140
264
|
end
|
141
265
|
|
142
266
|
end
|