diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-12 00:09:40 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-12 00:09:40 +0300 |
commit | 3f45eb27e9586ad87682c2d125770e119a7e9fe0 (patch) | |
tree | 533c2906ecf49c1403a2c21211241f21768e139a /spec/services | |
parent | 636eb69592af287dd76876e6fc3c898ad1af33f6 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services')
-rw-r--r-- | spec/services/prometheus/proxy_variable_substitution_service_spec.rb | 102 | ||||
-rw-r--r-- | spec/services/template_engines/liquid_service_spec.rb | 126 |
2 files changed, 71 insertions, 157 deletions
diff --git a/spec/services/prometheus/proxy_variable_substitution_service_spec.rb b/spec/services/prometheus/proxy_variable_substitution_service_spec.rb index 9978c631366..621b4c1f7be 100644 --- a/spec/services/prometheus/proxy_variable_substitution_service_spec.rb +++ b/spec/services/prometheus/proxy_variable_substitution_service_spec.rb @@ -142,7 +142,7 @@ describe Prometheus::ProxyVariableSubstitutionService do end it_behaves_like 'success' do - let(:expected_query) { 'up{pod_name=""}' } + let(:expected_query) { 'up{pod_name="{{pod_name}}"}' } end end @@ -161,28 +161,6 @@ describe Prometheus::ProxyVariableSubstitutionService do end end - context 'with liquid tags and ruby format variables' do - let(:params_keys) do - { - query: 'up{ {% if true %}env1="%{ci_environment_slug}",' \ - 'env2="{{ci_environment_slug}}"{% endif %} }' - } - end - - # The following spec will fail and should be changed to a 'success' spec - # once we remove support for the Ruby interpolation format. - # https://gitlab.com/gitlab-org/gitlab/issues/37990 - # - # Liquid tags `{% %}` cannot be used currently because the Ruby `%` - # operator raises an error when it encounters a Liquid `{% %}` tag in the - # string. - # - # Once we remove support for the Ruby format, users can start using - # Liquid tags. - - it_behaves_like 'error', 'Malformed string' - end - context 'ruby template rendering' do let(:params_keys) do { query: 'up{env=%{ci_environment_slug},%{environment_filter}}' } @@ -271,17 +249,79 @@ describe Prometheus::ProxyVariableSubstitutionService do end end - context 'when liquid template rendering raises error' do - before do - liquid_service = instance_double(TemplateEngines::LiquidService) + context 'gsub variable substitution tolerance for weirdness' do + context 'with whitespace around variable' do + let(:params_keys) do + { + query: 'up{' \ + "env1={{ ci_environment_slug}}," \ + "env2={{ci_environment_slug }}," \ + "{{ environment_filter }}" \ + '}' + } + end - allow(TemplateEngines::LiquidService).to receive(:new).and_return(liquid_service) - allow(liquid_service).to receive(:render).and_raise( - TemplateEngines::LiquidService::RenderError, 'error message' - ) + it_behaves_like 'success' do + let(:expected_query) do + 'up{' \ + "env1=#{environment.slug}," \ + "env2=#{environment.slug}," \ + "container_name!=\"POD\",environment=\"#{environment.slug}\"" \ + '}' + end + end + end + + context 'with empty variables' do + let(:params_keys) do + { query: "up{env1={{}},env2={{ }}}" } + end + + it_behaves_like 'success' do + let(:expected_query) { "up{env1={{}},env2={{ }}}" } + end end - it_behaves_like 'error', 'error message' + context 'with multiple occurrences of variable in string' do + let(:params_keys) do + { query: "up{env1={{ci_environment_slug}},env2={{ci_environment_slug}}}" } + end + + it_behaves_like 'success' do + let(:expected_query) { "up{env1=#{environment.slug},env2=#{environment.slug}}" } + end + end + + context 'with multiple variables in string' do + let(:params_keys) do + { query: "up{env={{ci_environment_slug}},{{environment_filter}}}" } + end + + it_behaves_like 'success' do + let(:expected_query) do + "up{env=#{environment.slug}," \ + "container_name!=\"POD\",environment=\"#{environment.slug}\"}" + end + end + end + + context 'with unknown variables in string' do + let(:params_keys) { { query: "up{env={{env_slug}}}" } } + + it_behaves_like 'success' do + let(:expected_query) { "up{env={{env_slug}}}" } + end + end + + context 'with unknown and known variables in string' do + let(:params_keys) do + { query: "up{env={{ci_environment_slug}},other_env={{env_slug}}}" } + end + + it_behaves_like 'success' do + let(:expected_query) { "up{env=#{environment.slug},other_env={{env_slug}}}" } + end + end end end end diff --git a/spec/services/template_engines/liquid_service_spec.rb b/spec/services/template_engines/liquid_service_spec.rb deleted file mode 100644 index 7c5262bc264..00000000000 --- a/spec/services/template_engines/liquid_service_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe TemplateEngines::LiquidService do - describe '#render' do - let(:template) { 'up{env={{ci_environment_slug}}}' } - let(:result) { subject } - - let_it_be(:slug) { 'env_slug' } - - let_it_be(:context) do - { - ci_environment_slug: slug, - environment_filter: "container_name!=\"POD\",environment=\"#{slug}\"" - } - end - - subject { described_class.new(template).render(context) } - - it 'with symbol keys in context it substitutes variables' do - expect(result).to include("up{env=#{slug}") - end - - context 'with multiple occurrences of variable in template' do - let(:template) do - 'up{env1={{ci_environment_slug}},env2={{ci_environment_slug}}}' - end - - it 'substitutes variables' do - expect(result).to eq("up{env1=#{slug},env2=#{slug}}") - end - end - - context 'with multiple variables in template' do - let(:template) do - 'up{env={{ci_environment_slug}},' \ - '{{environment_filter}}}' - end - - it 'substitutes all variables' do - expect(result).to eq( - "up{env=#{slug}," \ - "container_name!=\"POD\",environment=\"#{slug}\"}" - ) - end - end - - context 'with unknown variables in template' do - let(:template) { 'up{env={{env_slug}}}' } - - it 'does not substitute unknown variables' do - expect(result).to eq("up{env=}") - end - end - - context 'with extra variables in context' do - let(:template) { 'up{env={{ci_environment_slug}}}' } - - it 'substitutes variables' do - # If context has only 1 key, there is no need for this spec. - expect(context.count).to be > 1 - expect(result).to eq("up{env=#{slug}}") - end - end - - context 'with unknown and known variables in template' do - let(:template) { 'up{env={{ci_environment_slug}},other_env={{env_slug}}}' } - - it 'substitutes known variables' do - expect(result).to eq("up{env=#{slug},other_env=}") - end - end - - context 'Liquid errors' do - shared_examples 'raises RenderError' do |message| - it do - expect { result }.to raise_error(described_class::RenderError, message) - end - end - - context 'when liquid raises error' do - let(:template) { 'up{env={{ci_environment_slug}}' } - let(:liquid_template) { Liquid::Template.new } - - before do - allow(Liquid::Template).to receive(:parse).with(template).and_return(liquid_template) - allow(liquid_template).to receive(:render!).and_raise(exception, message) - end - - context 'raises Liquid::MemoryError' do - let(:exception) { Liquid::MemoryError } - let(:message) { 'Liquid error: Memory limits exceeded' } - - it_behaves_like 'raises RenderError', 'Memory limit exceeded while rendering template' - end - - context 'raises Liquid::Error' do - let(:exception) { Liquid::Error } - let(:message) { 'Liquid error: Generic error message' } - - it_behaves_like 'raises RenderError', 'Error rendering query' - end - end - - context 'with template that is expensive to render' do - let(:template) do - '{% assign loop_count = 1000 %}'\ - '{% assign padStr = "0" %}'\ - '{% assign number_to_pad = "1" %}'\ - '{% assign strLength = number_to_pad | size %}'\ - '{% assign padLength = loop_count | minus: strLength %}'\ - '{% if padLength > 0 %}'\ - ' {% assign padded = number_to_pad %}'\ - ' {% for position in (1..padLength) %}'\ - ' {% assign padded = padded | prepend: padStr %}'\ - ' {% endfor %}'\ - ' {{ padded }}'\ - '{% endif %}' - end - - it_behaves_like 'raises RenderError', 'Memory limit exceeded while rendering template' - end - end - end -end |