summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb')
-rw-r--r--spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb156
1 files changed, 156 insertions, 0 deletions
diff --git a/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb b/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb
new file mode 100644
index 00000000000..882e389e040
--- /dev/null
+++ b/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb
@@ -0,0 +1,156 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::WebIde::Config::Entry::Terminal do
+ let(:entry) { described_class.new(config, with_image_ports: true) }
+
+ describe '.nodes' do
+ context 'when filtering all the entry/node names' do
+ subject { described_class.nodes.keys }
+
+ let(:result) do
+ %i[before_script script image services variables]
+ end
+
+ it { is_expected.to match_array result }
+ end
+ end
+
+ describe 'validations' do
+ before do
+ entry.compose!
+ end
+
+ context 'when entry config value is correct' do
+ let(:config) { { script: 'rspec' } }
+
+ describe '#valid?' do
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'when the same port is not duplicated' do
+ let(:config) do
+ {
+ image: { name: "ruby", ports: [80] },
+ services: [{ name: "mysql", alias: "service1", ports: [81] }, { name: "mysql", alias: "service2", ports: [82] }]
+ }
+ end
+
+ describe '#valid?' do
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+ end
+
+ context 'when unknown port keys detected' do
+ let(:config) do
+ {
+ image: { name: "ruby", ports: [80] },
+ services: [{ name: "mysql", alias: "service2", ports: [{ number: 81, invalid_key: 'foobar' }] }]
+ }
+ end
+
+ it 'is not valid' do
+ expect(entry).not_to be_valid
+ expect(entry.errors.first)
+ .to match /port config contains unknown keys: invalid_key/
+ end
+ end
+ end
+
+ context 'when entry value is not correct' do
+ context 'incorrect config value type' do
+ let(:config) { ['incorrect'] }
+
+ describe '#errors' do
+ it 'reports error about a config type' do
+ expect(entry.errors)
+ .to include 'terminal config should be a hash'
+ end
+ end
+ end
+
+ context 'when config is empty' do
+ let(:config) { {} }
+
+ describe '#valid' do
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+ end
+
+ context 'when unknown keys detected' do
+ let(:config) { { unknown: true } }
+
+ describe '#valid' do
+ it 'is not valid' do
+ expect(entry).not_to be_valid
+ end
+ end
+ end
+
+ context 'when the same port is duplicated' do
+ let(:config) do
+ {
+ image: { name: "ruby", ports: [80] },
+ services: [{ name: "mysql", ports: [80] }, { name: "mysql", ports: [81] }]
+ }
+ end
+
+ describe '#valid?' do
+ it 'is invalid' do
+ expect(entry).not_to be_valid
+ expect(entry.errors.count).to eq 1
+ expect(entry.errors.first).to match "each port number can only be referenced once"
+ end
+ end
+ end
+ end
+ end
+
+ describe '#relevant?' do
+ it 'is a relevant entry' do
+ entry = described_class.new({ script: 'rspec' })
+
+ expect(entry).to be_relevant
+ end
+ end
+
+ context 'when composed' do
+ before do
+ entry.compose!
+ end
+
+ describe '#value' do
+ context 'when entry is correct' do
+ let(:config) do
+ { before_script: %w[ls pwd],
+ script: 'sleep 100',
+ tags: ['webide'],
+ image: 'ruby:2.5',
+ services: ['mysql'],
+ variables: { KEY: 'value' } }
+ end
+
+ it 'returns correct value' do
+ expect(entry.value)
+ .to eq(
+ tag_list: ['webide'],
+ yaml_variables: [{ key: 'KEY', value: 'value', public: true }],
+ options: {
+ image: { name: "ruby:2.5" },
+ services: [{ name: "mysql" }],
+ before_script: %w[ls pwd],
+ script: ['sleep 100']
+ }
+ )
+ end
+ end
+ end
+ end
+end