Commit fea77624 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Delegate methods to default CI entry if undefined

parent b0ae0d73
...@@ -14,6 +14,7 @@ module Gitlab ...@@ -14,6 +14,7 @@ module Gitlab
def initialize(config) def initialize(config)
@config = config @config = config
@nodes = {} @nodes = {}
@validator = self.class.validator.new(self) @validator = self.class.validator.new(self)
@validator.validate @validator.validate
end end
...@@ -71,6 +72,10 @@ module Gitlab ...@@ -71,6 +72,10 @@ module Gitlab
true true
end end
def attributes
{ key: @key, parent: @parent, description: @description }
end
def self.default def self.default
end end
......
...@@ -5,8 +5,9 @@ module Gitlab ...@@ -5,8 +5,9 @@ module Gitlab
## ##
# This class represents an undefined entry node. # This class represents an undefined entry node.
# #
# It takes original entry class as configuration and returns default # It takes original entry class as configuration and creates an object
# value of original entry as self value. # if original entry has a default value. If there is default value
# some methods are delegated to it.
# #
# #
class Undefined < Entry class Undefined < Entry
...@@ -16,13 +17,35 @@ module Gitlab ...@@ -16,13 +17,35 @@ module Gitlab
validates :config, type: Class validates :config, type: Class
end end
def initialize(node)
super
unless node.default.nil?
@default = fabricate_default(node)
end
end
def value def value
@config.default @default.value if @default
end
def valid?
@default ? @default.valid? : true
end
def errors
@default ? @default.errors : []
end end
def defined? def defined?
false false
end end
private
def fabricate_default(node)
Node::Factory.fabricate(node, node.default, attributes)
end
end end
end end
end end
......
...@@ -9,11 +9,13 @@ describe Gitlab::Ci::Config::Node::Factory do ...@@ -9,11 +9,13 @@ describe Gitlab::Ci::Config::Node::Factory do
it 'fabricates entry with attributes set' do it 'fabricates entry with attributes set' do
fabricated = described_class fabricated = described_class
.fabricate(entry_class, ['ls'], .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.key).to eq :test
expect(fabricated.value).to eq ['ls'] expect(fabricated.value).to eq ['ls']
expect(fabricated.attributes)
.to eq(parent: true, key: :test, description: nil)
end end
end end
......
...@@ -2,7 +2,10 @@ require 'spec_helper' ...@@ -2,7 +2,10 @@ require 'spec_helper'
describe Gitlab::Ci::Config::Node::Undefined do describe Gitlab::Ci::Config::Node::Undefined do
let(:undefined) { described_class.new(entry) } let(:undefined) { described_class.new(entry) }
let(:entry) { Class.new } let(:entry) { spy('Entry') }
context 'when entry does not have a default value' do
before { allow(entry).to receive(:default).and_return(nil) }
describe '#leaf?' do describe '#leaf?' do
it 'is leaf node' do it 'is leaf node' do
...@@ -23,15 +26,41 @@ describe Gitlab::Ci::Config::Node::Undefined do ...@@ -23,15 +26,41 @@ describe Gitlab::Ci::Config::Node::Undefined do
end end
describe '#value' do describe '#value' do
it 'returns nil' do
expect(undefined.value).to eq nil
end
end
end
context 'when entry has a default value' do
before do before do
allow(entry).to receive(:default).and_return('some value') allow(entry).to receive(:default).and_return('some value')
allow(entry).to receive(:value).and_return('some value')
end end
describe '#value' do
it 'returns default value for entry' do it 'returns default value for entry' do
expect(undefined.value).to eq 'some value' expect(undefined.value).to eq 'some value'
end end
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
describe '#undefined?' do describe '#undefined?' do
it 'is not a defined entry' do it 'is not a defined entry' do
expect(undefined.defined?).to be false expect(undefined.defined?).to be false
......
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