Implement QA pages and views validator
This commit is contained in:
parent
4b945e2845
commit
d5a92c53dd
3 changed files with 135 additions and 0 deletions
1
qa/qa.rb
1
qa/qa.rb
|
@ -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
51
qa/qa/page/validator.rb
Normal 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
|
83
qa/spec/page/validator_spec.rb
Normal file
83
qa/spec/page/validator_spec.rb
Normal 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
|
Loading…
Reference in a new issue