summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-01-11 10:58:56 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-01-11 10:58:56 +0100
commitd32a151714c01bc09484d423dd2136a89760b5ef (patch)
tree2f532870a05b1d9b77bc10183ff353605ba31682
parent1011ca49495eb1f48d43694bfbb2a96951fd45ba (diff)
downloadgitlab-ce-d32a151714c01bc09484d423dd2136a89760b5ef.tar.gz
Make it possible to define QA factory product attributes
-rw-r--r--qa/qa/factory/base.rb12
-rw-r--r--qa/qa/factory/product.rb2
-rw-r--r--qa/spec/factory/base_spec.rb46
3 files changed, 42 insertions, 18 deletions
diff --git a/qa/qa/factory/base.rb b/qa/qa/factory/base.rb
index 3e5227ea426..c7202d4ae65 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 df35bbbb443..2558350f8a3 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 a3ba0176819..d7cb9a770b5 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