From fea7762485c75003381891bc892bc6049f8a2105 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon <grzesiek.bizon@gmail.com> Date: Thu, 7 Jul 2016 12:41:31 +0200 Subject: [PATCH] Delegate methods to default CI entry if undefined --- lib/gitlab/ci/config/node/entry.rb | 5 ++ lib/gitlab/ci/config/node/undefined.rb | 29 ++++++++- .../lib/gitlab/ci/config/node/factory_spec.rb | 6 +- .../gitlab/ci/config/node/undefined_spec.rb | 59 ++++++++++++++----- 4 files changed, 79 insertions(+), 20 deletions(-) diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb index 033f9f0e3d1..8fda37a8922 100644 --- a/lib/gitlab/ci/config/node/entry.rb +++ b/lib/gitlab/ci/config/node/entry.rb @@ -14,6 +14,7 @@ module Gitlab def initialize(config) @config = config @nodes = {} + @validator = self.class.validator.new(self) @validator.validate end @@ -71,6 +72,10 @@ module Gitlab true end + def attributes + { key: @key, parent: @parent, description: @description } + end + def self.default end diff --git a/lib/gitlab/ci/config/node/undefined.rb b/lib/gitlab/ci/config/node/undefined.rb index 699605e1e3a..f152c433c42 100644 --- a/lib/gitlab/ci/config/node/undefined.rb +++ b/lib/gitlab/ci/config/node/undefined.rb @@ -5,8 +5,9 @@ module Gitlab ## # This class represents an undefined entry node. # - # It takes original entry class as configuration and returns default - # value of original entry as self value. + # It takes original entry class as configuration and creates an object + # if original entry has a default value. If there is default value + # some methods are delegated to it. # # class Undefined < Entry @@ -16,13 +17,35 @@ module Gitlab validates :config, type: Class end + def initialize(node) + super + + unless node.default.nil? + @default = fabricate_default(node) + end + end + def value - @config.default + @default.value if @default + end + + def valid? + @default ? @default.valid? : true + end + + def errors + @default ? @default.errors : [] end def defined? false end + + private + + def fabricate_default(node) + Node::Factory.fabricate(node, node.default, attributes) + end end end end diff --git a/spec/lib/gitlab/ci/config/node/factory_spec.rb b/spec/lib/gitlab/ci/config/node/factory_spec.rb index 5a26bb6df02..5b856d44989 100644 --- a/spec/lib/gitlab/ci/config/node/factory_spec.rb +++ b/spec/lib/gitlab/ci/config/node/factory_spec.rb @@ -9,11 +9,13 @@ describe Gitlab::Ci::Config::Node::Factory do it 'fabricates entry with attributes set' do fabricated = described_class .fabricate(entry_class, ['ls'], - parent: factory, key: :test) + parent: true, key: :test) - expect(fabricated.parent).to be factory + expect(fabricated.parent).to be true expect(fabricated.key).to eq :test expect(fabricated.value).to eq ['ls'] + expect(fabricated.attributes) + .to eq(parent: true, key: :test, description: nil) end end diff --git a/spec/lib/gitlab/ci/config/node/undefined_spec.rb b/spec/lib/gitlab/ci/config/node/undefined_spec.rb index 0c6608d906d..417b4a0ad6f 100644 --- a/spec/lib/gitlab/ci/config/node/undefined_spec.rb +++ b/spec/lib/gitlab/ci/config/node/undefined_spec.rb @@ -2,33 +2,62 @@ require 'spec_helper' describe Gitlab::Ci::Config::Node::Undefined do let(:undefined) { described_class.new(entry) } - let(:entry) { Class.new } + let(:entry) { spy('Entry') } - describe '#leaf?' do - it 'is leaf node' do - expect(undefined).to be_leaf + context 'when entry does not have a default value' do + before { allow(entry).to receive(:default).and_return(nil) } + + describe '#leaf?' do + it 'is leaf node' do + expect(undefined).to be_leaf + end end - end - describe '#valid?' do - it 'is always valid' do - expect(undefined).to be_valid + describe '#valid?' do + it 'is always valid' do + expect(undefined).to be_valid + end end - end - describe '#errors' do - it 'is does not contain errors' do - expect(undefined.errors).to be_empty + describe '#errors' do + it 'is does not contain errors' do + expect(undefined.errors).to be_empty + end + end + + describe '#value' do + it 'returns nil' do + expect(undefined.value).to eq nil + end end end - describe '#value' do + context 'when entry has a default value' do before do allow(entry).to receive(:default).and_return('some value') + allow(entry).to receive(:value).and_return('some value') end - it 'returns default value for entry' do - expect(undefined.value).to eq 'some value' + describe '#value' do + it 'returns default value for entry' do + expect(undefined.value).to eq 'some value' + end + end + + describe '#errors' do + it 'delegates errors to default entry' do + expect(entry).to receive(:errors) + + undefined.errors + end + end + + describe '#valid?' do + it 'delegates valid? to default entry' do + expect(entry).to receive(:valid?) + + undefined.valid? + end end end -- GitLab