spec/unit/lib/utils/page_validator_spec.rb in howitzer-1.0.1 vs spec/unit/lib/utils/page_validator_spec.rb in howitzer-1.0.2

- old
+ new

@@ -1,65 +1,100 @@ require 'spec_helper' -require "#{lib_path}/howitzer/utils/page_validator" +require "howitzer/utils/page_validator" +require "howitzer/utils/locator_store" describe Howitzer::Utils::PageValidator do describe ".validations" do it { expect(subject.validations).to eql({}) } end end describe "PageValidator" do - let(:web_page) { Class.new { include Howitzer::Utils::PageValidator }.new } - describe "#check_correct_page_loaded" do - subject { web_page.check_correct_page_loaded } + let(:web_page_class) do + Class.new do + include LocatorStore + include Howitzer::Utils::PageValidator + def self.name + 'TestWebPageClass' + end + end + end + let(:web_page) { web_page_class.new } + describe "#check_validations_are_defined!" do + subject { web_page.check_validations_are_defined! } context "when no validation specified" do - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::NoValidationError, "No any page validation was found") } + it do + expect(log).to receive(:error).with(Howitzer::NoValidationError, "No any page validation was found for 'TestWebPageClass' page").once.and_call_original + expect { subject }.to raise_error(Howitzer::NoValidationError) + end end - context "when all validation are specified" do + context "when old validation style is using" do + before { web_page_class.const_set("URL_PATTERN",/Foo/) } + after { web_page_class.send :remove_const, "URL_PATTERN"} + it do + expect(web_page_class).to receive(:validates).with(:url, pattern: /Foo/).and_return{ Howitzer::Utils::PageValidator.validations['TestWebPageClass'] = {}} + expect{subject}.to_not raise_error + end + end + context "when title validation is specified" do before do web_page.class.validates :title, pattern: /Foo/ + end + it { expect{subject}.to_not raise_error } + end + context "when url validation is specified" do + before do web_page.class.validates :url, pattern: /Foo/ + end + it { expect{subject}.to_not raise_error } + end + context "when element_presence validation is specified" do + before do web_page.class.validates :element_presence, locator: :test_locator end - it do - expect(web_page).to receive(:wait_for_url).with(/Foo/).once - expect(web_page).to receive(:wait_for_title).with(/Foo/).once - expect(web_page).to receive(:find_element).with(:test_locator) - subject - end + it { expect{subject}.to_not raise_error } end end describe ".validates" do - subject { web_page.class.validates(name, options)} + before do + Howitzer::Utils::PageValidator.validations[web_page.class.name] = nil + end + subject { web_page.class.validates(name, options) } context "when name = :url" do context "as string" do let(:name) { "url" } context "when options is correct" do context "(as string)" do let(:options) { {"pattern" => /foo/} } it do expect(subject).to be_a(Proc) - expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to eql(subject) + expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc end end context "(as symbol)" do let(:options) { {pattern: /foo/} } it do expect(subject).to be_a(Proc) - expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to eql(subject) + expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc end end end context "when options is incorrect" do context "(missing pattern)" do let(:options) { {} } - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") } + it do + expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original + expect { subject }.to raise_error(Howitzer::WrongOptionError) + end end context "(string pattern)" do let(:options) { {pattern: "foo"} } - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") } + it do + expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original + expect { subject }.to raise_error(Howitzer::WrongOptionError) + end end context "(not hash)" do let(:options) { "foo" } it { expect{subject}.to raise_error(TypeError, "Expected options to be Hash, actual is 'String'") } end @@ -68,11 +103,11 @@ context "as symbol" do let(:name) { :url } let(:options) { {pattern: /foo/} } it do expect(subject).to be_a(Proc) - expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to eql(subject) + expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc end end end context "when name = :element_presence" do let(:name) { :element_presence } @@ -93,50 +128,139 @@ end end context "when options is incorrect" do context "(missing locator)" do let(:options) { {} } - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':locator' option as one of page locator names") } + it do + expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':locator' option as one of page locator names").once.and_call_original + expect { subject }.to raise_error(Howitzer::WrongOptionError) + end end context "(blank locator name)" do let(:options) { {locator: ""} } - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':locator' option as one of page locator names") } + it do + expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':locator' option as one of page locator names").once.and_call_original + expect { subject }.to raise_error(Howitzer::WrongOptionError) + end end end end context "when name = :title" do let(:name) { :title } context "when options is correct" do context "(as string)" do let(:options) { {"pattern" => /foo/} } it do expect(subject).to be_a(Proc) - expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to eql(subject) + expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to be_a Proc end end context "(as symbol)" do let(:options) { {pattern: /foo/} } it do expect(subject).to be_a(Proc) - expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to eql(subject) + expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to be_a Proc end end end context "when options is incorrect" do context "(missing pattern)" do let(:options) { {} } - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") } + it do + expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original + expect { subject }.to raise_error(Howitzer::WrongOptionError) + end end context "(string pattern)" do let(:options) { {pattern: "foo"} } - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::WrongOptionError, "Please specify ':pattern' option as Regexp object") } + it do + expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original + expect { subject }.to raise_error(Howitzer::WrongOptionError) + end end end end context "when other name" do let(:name) { :unknown } let(:options) { {} } - it { expect{subject}.to raise_error(Howitzer::Utils::PageValidator::UnknownValidationName, "unknown 'unknown' validation name") } + it do + expect(log).to receive(:error).with(Howitzer::UnknownValidationError, "unknown 'unknown' validation name").once.and_call_original + expect { subject }.to raise_error(Howitzer::UnknownValidationError) + end end + end + + describe ".pages" do + subject { Howitzer::Utils::PageValidator.pages } + it { expect(subject).to eq([]) } + it do + subject << Class + expect(subject).to eql([Class]) + end + end + + describe ".opened?" do + subject { web_page_class.opened? } + context "when no one validation is defined" do + it do + expect(log).to receive(:error).with(Howitzer::NoValidationError, "No any page validation was found for 'TestWebPageClass' page").once.and_call_original + expect { subject }.to raise_error(Howitzer::NoValidationError) + end + end + context "when all validations are defined" do + before do + web_page_class.class_eval do + add_locator :login, "#id" + validates :url, pattern: /foo/ + validates :title, pattern: /Foo page/ + validates :element_presence, locator: :login + end + end + context "when all matches" do + before do + allow(web_page_class).to receive(:url){ 'http://test.com/foo' } + allow(web_page_class).to receive(:title){ 'Foo page' } + allow(web_page_class).to receive(:first_element).with(:login){ true } + end + it { expect(subject).to be_true } + end + context "when first does not match" do + before do + expect(web_page_class).to receive(:url).once{ 'http://test.com/bar' } + expect(web_page_class).to receive(:title).never + expect(web_page_class).to receive(:first_element).never + end + it { expect(subject).to be_false } + end + end + end + + describe "#matched_pages" do + let!(:web_page1_class) do + Class.new do + include Howitzer::Utils::PageValidator + def self.name + 'TestWebPage1Class' + end + def self.opened? + true + end + end + end + + let!(:web_page2_class) do + Class.new do + include Howitzer::Utils::PageValidator + def self.name + 'TestWebPage2Class' + end + def self.opened? + false + end + end + end + subject {web_page2_class.matched_pages } + before { Howitzer::Utils::PageValidator.instance_variable_set(:@pages, [web_page1_class, web_page2_class]) } + it { expect(subject).to eq([web_page1_class]) } end end