Skip to content
Snippets Groups Projects
Commit d5a92c53 authored by Grzegorz Bizon's avatar Grzegorz Bizon
Browse files

Implement QA pages and views validator

parent 4b945e28
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -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'
Loading
Loading
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
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment