diff --git a/qa/qa/factory/base.rb b/qa/qa/factory/base.rb index 3e5227ea426417354303365402c7b2e4bc1bd471..c7202d4ae656b354fbce98ba87b2b3d06db695c1 100644 --- a/qa/qa/factory/base.rb +++ b/qa/qa/factory/base.rb @@ -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 diff --git a/qa/qa/factory/product.rb b/qa/qa/factory/product.rb index df35bbbb443648d9d1044c7a37bbd310f21c9ecd..2558350f8a3ddcc70386f8606e6cb0d71555cf9d 100644 --- a/qa/qa/factory/product.rb +++ b/qa/qa/factory/product.rb @@ -5,6 +5,8 @@ module QA class Product include Capybara::DSL + Attribute = Struct.new(:name, :block) + def initialize(factory) @factory = factory @location = current_url diff --git a/qa/spec/factory/base_spec.rb b/qa/spec/factory/base_spec.rb index a3ba01768192e36cd78f71e9d34a148565d3573b..d7cb9a770b5e60a2abc178aadf52ba3277db305e 100644 --- a/qa/spec/factory/base_spec.rb +++ b/qa/spec/factory/base_spec.rb @@ -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