Welcome to mirror list, hosted at ThFree Co, Russian Federation.

liquid_service_spec.rb « template_engines « services « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 7c5262bc264ecb466649cdf478cd4f3621ede333 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# 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