diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-01-09 13:28:14 +0300 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-01-09 13:28:14 +0300 |
commit | d5a92c53dd79ff661ca7f8e4b0deefec5e19704d (patch) | |
tree | 90c7ac18cd1dfb59853cc712a53ee1765ca38c6a /qa | |
parent | 4b945e2845cf40456ef71faafbce181f0e60dba7 (diff) |
Implement QA pages and views validator
Diffstat (limited to 'qa')
-rw-r--r-- | qa/qa.rb | 1 | ||||
-rw-r--r-- | qa/qa/page/validator.rb | 51 | ||||
-rw-r--r-- | qa/spec/page/validator_spec.rb | 83 |
3 files changed, 135 insertions, 0 deletions
@@ -74,6 +74,7 @@ module QA autoload :Base, 'qa/page/base' autoload :View, 'qa/page/view' autoload :Element, 'qa/page/element' + autoload :Validator, 'qa/page/validator' module Main autoload :Login, 'qa/page/main/login' diff --git a/qa/qa/page/validator.rb b/qa/qa/page/validator.rb new file mode 100644 index 00000000000..cf4e57db0f0 --- /dev/null +++ b/qa/qa/page/validator.rb @@ -0,0 +1,51 @@ +module QA + module Page + class Validator + ValidationError = Class.new(StandardError) + Error = Struct.new(:page, :view, :message) + + def initialize(constant) + @module = constant + end + + def constants + @consts ||= @module.constants.map do |const| + @module.const_get(const) + end + end + + def descendants + @descendants ||= constants.map do |const| + case const + when Class + const if const < Page::Base + when Module + Page::Validator.new(const).descendants + end + end + + @descendants.flatten.compact + end + + def errors + @errors ||= Array.new.tap do |errors| + descendants.each do |page| + page.views.each do |view| + view.errors.each do |error| + errors.push(Error.new(page, view, error)) + end + end + end + end + end + + def validate! + message = <<~EOS + We found validation errors! + EOS + + raise ValidationError, message if errors.any? + end + end + end +end diff --git a/qa/spec/page/validator_spec.rb b/qa/spec/page/validator_spec.rb new file mode 100644 index 00000000000..abee137f4a1 --- /dev/null +++ b/qa/spec/page/validator_spec.rb @@ -0,0 +1,83 @@ +describe QA::Page::Validator do + describe '#constants' do + subject do + described_class.new(QA::Page::Project) + end + + it 'returns all costants that are module children' do + expect(subject.constants) + .to include QA::Page::Project::New, QA::Page::Project::Settings + end + end + + describe '#descendants' do + subject do + described_class.new(QA::Page::Project) + end + + it 'recursively returns all descendants that are page objects' do + expect(subject.descendants) + .to include QA::Page::Project::New, QA::Page::Project::Settings::Repository + end + + it 'does not return modules that aggregate page objects' do + expect(subject.descendants) + .not_to include QA::Page::Project::Settings + end + end + + context 'when checking validation errors' do + let(:view) { spy('view') } + + before do + allow(QA::Page::Admin::Settings) + .to receive(:views).and_return([view]) + end + + subject do + described_class.new(QA::Page::Admin) + end + + context 'when there are no validation errors' do + before do + allow(view).to receive(:errors).and_return([]) + end + + describe '#errors' do + it 'does not return errors' do + expect(subject.errors).to be_empty + end + end + + describe '#validate!' do + it 'does not raise error' do + expect { subject.validate! }.not_to raise_error + end + end + end + + context 'when there are validation errors' do + before do + allow(view).to receive(:errors) + .and_return(['some error', 'another error']) + end + + describe '#errors' do + it 'returns errors' do + expect(subject.errors.count).to eq 2 + end + end + + describe '#validate!' do + it 'does raises an error with descriptive message' do + message = <<~EOS + We found validation errors! + EOS + + expect { subject.validate! } + .to raise_error described_class::ValidationError, message + end + end + end + end +end |