diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-01-11 12:00:22 +0100 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-01-11 12:00:22 +0100 |
commit | a3ab8aa3bbcf83c80e8f6195994bd531507e7348 (patch) | |
tree | a23923382eaf67e8c7a8cfb3803a94a83dd280ba /qa | |
parent | d32a151714c01bc09484d423dd2136a89760b5ef (diff) | |
download | gitlab-ce-a3ab8aa3bbcf83c80e8f6195994bd531507e7348.tar.gz |
Populate QA factory product with data from a page
Diffstat (limited to 'qa')
-rw-r--r-- | qa/qa/factory/base.rb | 4 | ||||
-rw-r--r-- | qa/qa/factory/product.rb | 15 | ||||
-rw-r--r-- | qa/spec/factory/base_spec.rb | 28 | ||||
-rw-r--r-- | qa/spec/factory/product_spec.rb | 21 |
4 files changed, 37 insertions, 31 deletions
diff --git a/qa/qa/factory/base.rb b/qa/qa/factory/base.rb index c7202d4ae65..bd66b74a164 100644 --- a/qa/qa/factory/base.rb +++ b/qa/qa/factory/base.rb @@ -13,7 +13,7 @@ module QA end def self.fabricate!(*args) - Factory::Product.populate!(new) do |factory| + new.tap do |factory| yield factory if block_given? dependencies.each do |name, signature| @@ -21,6 +21,8 @@ module QA end factory.fabricate!(*args) + + return Factory::Product.populate!(self) end end diff --git a/qa/qa/factory/product.rb b/qa/qa/factory/product.rb index 2558350f8a3..d004e642f9b 100644 --- a/qa/qa/factory/product.rb +++ b/qa/qa/factory/product.rb @@ -7,8 +7,7 @@ module QA Attribute = Struct.new(:name, :block) - def initialize(factory) - @factory = factory + def initialize @location = current_url end @@ -17,11 +16,13 @@ module QA end def self.populate!(factory) - raise ArgumentError unless block_given? - - yield factory - - new(factory) + new.tap do |product| + factory.attributes.each_value do |attribute| + product.instance_exec(&attribute.block).tap do |value| + product.define_singleton_method(attribute.name) { value } + end + end + end end end end diff --git a/qa/spec/factory/base_spec.rb b/qa/spec/factory/base_spec.rb index d7cb9a770b5..90dd58e20fd 100644 --- a/qa/spec/factory/base_spec.rb +++ b/qa/spec/factory/base_spec.rb @@ -1,8 +1,9 @@ describe QA::Factory::Base do + let(:factory) { spy('factory') } + let(:product) { spy('product') } + describe '.fabricate!' do subject { Class.new(described_class) } - let(:factory) { spy('factory') } - let(:product) { spy('product') } before do allow(QA::Factory::Product).to receive(:new).and_return(product) @@ -89,14 +90,33 @@ describe QA::Factory::Base do describe '.product' do subject do Class.new(described_class) do - product :token do |factory, page| - page.do_something! + product :token do + page.do_something_on_page! + 'resulting value' end end end it 'appends new product attribute' do expect(subject.attributes).to be_one + expect(subject.attributes).to have_key(:token) + end + + describe 'populating fabrication product with data' do + let(:page) { spy('page') } + + before do + allow(subject).to receive(:new).and_return(factory) + allow(QA::Factory::Product).to receive(:new).and_return(product) + allow(product).to receive(:page).and_return(page) + end + + it 'populates product after fabrication' do + subject.fabricate! + + expect(page).to have_received(:do_something_on_page!) + expect(product.token).to eq 'resulting value' + end end end end diff --git a/qa/spec/factory/product_spec.rb b/qa/spec/factory/product_spec.rb index 3d9e86a641b..fdfb1ec90cc 100644 --- a/qa/spec/factory/product_spec.rb +++ b/qa/spec/factory/product_spec.rb @@ -3,19 +3,8 @@ describe QA::Factory::Product do let(:product) { spy('product') } describe '.populate!' do - it 'instantiates and yields factory' do - expect(described_class).to receive(:new).with(factory) - - described_class.populate!(factory) do |instance| - instance.something = 'string' - end - - expect(factory).to have_received(:something=).with('string') - end - it 'returns a fabrication product' do - expect(described_class).to receive(:new) - .with(factory).and_return(product) + expect(described_class).to receive(:new).and_return(product) result = described_class.populate!(factory) do |instance| instance.something = 'string' @@ -23,11 +12,6 @@ describe QA::Factory::Product do expect(result).to be product end - - it 'raises unless block given' do - expect { described_class.populate!(factory) } - .to raise_error ArgumentError - end end describe '.visit!' do @@ -37,8 +21,7 @@ describe QA::Factory::Product do allow_any_instance_of(described_class) .to receive(:visit).and_return('visited some url') - expect(described_class.new(factory).visit!) - .to eq 'visited some url' + expect(subject.visit!).to eq 'visited some url' end end end |