Implement QA pages and views validator

This commit is contained in:
Grzegorz Bizon 2018-01-09 11:28:14 +01:00
parent 4b945e2845
commit d5a92c53dd
3 changed files with 135 additions and 0 deletions

View file

@ -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'

51
qa/qa/page/validator.rb Normal file
View file

@ -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

View file

@ -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