85 lines
2.3 KiB
Ruby
85 lines
2.3 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe Gitlab::Ci::Pipeline::Expression::Statement do
|
|
let(:pipeline) { build(:ci_pipeline) }
|
|
|
|
subject do
|
|
described_class.new(text, pipeline)
|
|
end
|
|
|
|
before do
|
|
pipeline.variables.build([key: 'VARIABLE', value: 'my variable'])
|
|
end
|
|
|
|
describe '#parse_tree' do
|
|
context 'when expression is empty' do
|
|
let(:text) { '' }
|
|
|
|
it 'raises an error' do
|
|
expect { subject.parse_tree }
|
|
.to raise_error described_class::StatementError
|
|
end
|
|
end
|
|
|
|
context 'when expression grammar is incorrect' do
|
|
table = [
|
|
'$VAR "text"', # missing operator
|
|
'== "123"', # invalid right side
|
|
"'single quotes'", # single quotes string
|
|
'$VAR ==', # invalid right side
|
|
'12345', # unknown syntax
|
|
'' # empty statement
|
|
]
|
|
|
|
table.each do |syntax|
|
|
it "raises an error when syntax is `#{syntax}`" do
|
|
expect { described_class.new(syntax, pipeline).parse_tree }
|
|
.to raise_error described_class::StatementError
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when expression grammar is correct' do
|
|
context 'when using an operator' do
|
|
let(:text) { '$VAR == "value"' }
|
|
|
|
it 'returns a reverse descent parse tree' do
|
|
expect(subject.parse_tree)
|
|
.to be_a Gitlab::Ci::Pipeline::Expression::Lexeme::Equals
|
|
end
|
|
end
|
|
|
|
context 'when using a single token' do
|
|
let(:text) { '$VARIABLE' }
|
|
|
|
it 'returns a single token instance' do
|
|
expect(subject.parse_tree)
|
|
.to be_a Gitlab::Ci::Pipeline::Expression::Lexeme::Variable
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#evaluate' do
|
|
statements = [
|
|
['$VARIABLE == "my variable"', true],
|
|
["$VARIABLE == 'my variable'", true],
|
|
['"my variable" == $VARIABLE', true],
|
|
['$VARIABLE == null', false],
|
|
['$VAR == null', true],
|
|
['null == $VAR', true],
|
|
['$VARIABLE', 'my variable'],
|
|
['$VAR', nil]
|
|
]
|
|
|
|
statements.each do |expression, value|
|
|
context "when using expression `#{expression}`" do
|
|
let(:text) { expression }
|
|
|
|
it "evaluates to `#{value.inspect}`" do
|
|
expect(subject.evaluate).to eq value
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|