From 5b7f211cbba06f7c43b55b4a38704073564a099f Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Tue, 5 Jul 2016 13:35:50 +0200
Subject: [PATCH] Add new CI config entry that holds jobs definition

---
 lib/gitlab/ci/config/node/global.rb           | 14 +++-----
 lib/gitlab/ci/config/node/jobs.rb             | 18 ++++++++++
 spec/lib/gitlab/ci/config/node/global_spec.rb |  4 +--
 spec/lib/gitlab/ci/config/node/jobs_spec.rb   | 36 +++++++++++++++++++
 4 files changed, 61 insertions(+), 11 deletions(-)
 create mode 100644 lib/gitlab/ci/config/node/jobs.rb
 create mode 100644 spec/lib/gitlab/ci/config/node/jobs_spec.rb

diff --git a/lib/gitlab/ci/config/node/global.rb b/lib/gitlab/ci/config/node/global.rb
index 0a4315db047..cb2db4e9757 100644
--- a/lib/gitlab/ci/config/node/global.rb
+++ b/lib/gitlab/ci/config/node/global.rb
@@ -33,11 +33,14 @@ module Gitlab
           node :cache, Node::Cache,
             description: 'Configure caching between build jobs.'
 
+          node :jobs, Node::Jobs,
+            description: 'Definition of jobs for this pipeline.'
+
           helpers :before_script, :image, :services, :after_script,
-                  :variables, :stages, :types, :cache
+                  :variables, :stages, :types, :cache, :jobs
 
           def initialize(config)
-            return super(config) unless config.is_a?(Hash)
+            return super unless config.is_a?(Hash)
 
             jobs = config.except(*self.class.nodes.keys)
             global = config.slice(*self.class.nodes.keys)
@@ -45,13 +48,6 @@ module Gitlab
             super(global.merge(jobs: jobs))
           end
 
-          ##
-          # Temporary refactoring stub
-          #
-          def jobs
-            @config[:jobs]
-          end
-
           def stages
             stages_defined? ? stages_value : types_value
           end
diff --git a/lib/gitlab/ci/config/node/jobs.rb b/lib/gitlab/ci/config/node/jobs.rb
new file mode 100644
index 00000000000..2df2d55aca2
--- /dev/null
+++ b/lib/gitlab/ci/config/node/jobs.rb
@@ -0,0 +1,18 @@
+module Gitlab
+  module Ci
+    class Config
+      module Node
+        ##
+        # Entry that represents a set of jobs.
+        #
+        class Jobs < Entry
+          include Validatable
+
+          validations do
+            validates :config, type: Hash
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/spec/lib/gitlab/ci/config/node/global_spec.rb b/spec/lib/gitlab/ci/config/node/global_spec.rb
index 88194bf9453..8f2f9e171d1 100644
--- a/spec/lib/gitlab/ci/config/node/global_spec.rb
+++ b/spec/lib/gitlab/ci/config/node/global_spec.rb
@@ -35,7 +35,7 @@ describe Gitlab::Ci::Config::Node::Global do
         end
 
         it 'creates node object for each entry' do
-          expect(global.nodes.count).to eq 8
+          expect(global.nodes.count).to eq 9
         end
 
         it 'creates node object using valid class' do
@@ -139,7 +139,7 @@ describe Gitlab::Ci::Config::Node::Global do
 
       describe '#nodes' do
         it 'instantizes all nodes' do
-          expect(global.nodes.count).to eq 8
+          expect(global.nodes.count).to eq 9
         end
 
         it 'contains undefined nodes' do
diff --git a/spec/lib/gitlab/ci/config/node/jobs_spec.rb b/spec/lib/gitlab/ci/config/node/jobs_spec.rb
new file mode 100644
index 00000000000..3afa3de06c6
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/node/jobs_spec.rb
@@ -0,0 +1,36 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Config::Node::Jobs do
+  let(:entry) { described_class.new(config) }
+
+  describe 'validations' do
+    context 'when entry config value is correct' do
+      let(:config) { { rspec: { script: 'rspec' } } }
+
+      describe '#value' do
+        it 'returns key value' do
+          expect(entry.value).to eq(rspec: { script: 'rspec' })
+        end
+      end
+
+      describe '#valid?' do
+        it 'is valid' do
+          expect(entry).to be_valid
+        end
+      end
+    end
+
+    context 'when entry value is not correct' do
+      context 'incorrect config value type' do
+        let(:config) { ['incorrect'] }
+
+        describe '#errors' do
+          it 'saves errors' do
+            expect(entry.errors)
+              .to include 'jobs config should be a hash'
+          end
+        end
+      end
+    end
+  end
+end
-- 
GitLab