Commit d32a1517 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Make it possible to define QA factory product attributes

parent 1011ca49
......@@ -6,6 +6,7 @@ module QA
extend SingleForwardable
def_delegators :evaluator, :dependency, :dependencies
def_delegators :evaluator, :product, :attributes
def fabricate!(*_args)
raise NotImplementedError
......@@ -28,11 +29,12 @@ module QA
end
class DSL
attr_reader :dependencies
attr_reader :dependencies, :attributes
def initialize(base)
@base = base
@dependencies = {}
@attributes = {}
end
def dependency(factory, as:, &block)
......@@ -40,10 +42,16 @@ module QA
@base.class_eval { attr_accessor name }
Dependency::Signature.new(factory, block).tap do |signature|
dependencies.store(name, signature)
@dependencies.store(name, signature)
end
end
end
def product(attribute, &block)
Product::Attribute.new(attribute, block).tap do |signature|
@attributes.store(attribute, signature)
end
end
end
end
end
......
......@@ -5,6 +5,8 @@ module QA
class Product
include Capybara::DSL
Attribute = Struct.new(:name, :block)
def initialize(factory)
@factory = factory
@location = current_url
......
......@@ -59,30 +59,44 @@ describe QA::Factory::Base do
it 'defines dependency accessors' do
expect(subject.new).to respond_to :mydep, :mydep=
end
end
describe 'building dependencies' do
let(:dependency) { double('dependency') }
let(:instance) { spy('instance') }
describe 'dependencies fabrication' do
let(:dependency) { double('dependency') }
let(:instance) { spy('instance') }
subject do
Class.new(described_class) do
dependency Some::MyDependency, as: :mydep
subject do
Class.new(described_class) do
dependency Some::MyDependency, as: :mydep
end
end
end
before do
stub_const('Some::MyDependency', dependency)
before do
stub_const('Some::MyDependency', dependency)
allow(subject).to receive(:new).and_return(instance)
allow(instance).to receive(:mydep).and_return(nil)
allow(QA::Factory::Product).to receive(:new)
end
allow(subject).to receive(:new).and_return(instance)
allow(instance).to receive(:mydep).and_return(nil)
allow(QA::Factory::Product).to receive(:new)
it 'builds all dependencies first' do
expect(dependency).to receive(:fabricate!).once
subject.fabricate!
end
end
end
it 'builds all dependencies first' do
expect(dependency).to receive(:fabricate!).once
describe '.product' do
subject do
Class.new(described_class) do
product :token do |factory, page|
page.do_something!
end
end
end
subject.fabricate!
it 'appends new product attribute' do
expect(subject.attributes).to be_one
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