Commit 9f2a4ed5 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Implement QA pages and views validator

parent 0c3caffa
......@@ -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'
......
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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment