summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/utils/inline_hash_spec.rb
blob: d1354a7ae0ace92248e433c37c082803c2e640cb (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
# frozen_string_literal: true

require 'fast_spec_helper'

RSpec.describe Gitlab::Utils::InlineHash do
  describe '.merge_keys' do
    subject { described_class.merge_keys(source) }

    let(:source) do
      {
        nested_param: {
          key: :Value
        },
        'root_param' => 'Root',
        unnested_symbol_key: :unnested_symbol_value,
        12 => 22,
        'very' => {
          'deep' => {
            'nested' => {
              'param' => 'Deep nested value'
            }
          }
        }
      }
    end

    it 'transforms a nested hash into a one-level hash' do
      is_expected.to eq(
        'nested_param.key' => :Value,
        'root_param' => 'Root',
        :unnested_symbol_key => :unnested_symbol_value,
        12 => 22,
        'very.deep.nested.param' => 'Deep nested value'
      )
    end

    it 'retains key insertion order' do
      expect(subject.keys)
        .to eq(['nested_param.key', 'root_param', :unnested_symbol_key, 12, 'very.deep.nested.param'])
    end

    context 'with a custom connector' do
      subject { described_class.merge_keys(source, connector: '::') }

      it 'uses the connector to merge keys' do
        is_expected.to eq(
          'nested_param::key' => :Value,
          'root_param' => 'Root',
          :unnested_symbol_key => :unnested_symbol_value,
          12 => 22,
          'very::deep::nested::param' => 'Deep nested value'
        )
      end
    end

    context 'with a starter prefix' do
      subject { described_class.merge_keys(source, prefix: 'options') }

      it 'prefixes all the keys' do
        is_expected.to eq(
          'options.nested_param.key' => :Value,
          'options.root_param' => 'Root',
          'options.unnested_symbol_key' => :unnested_symbol_value,
          'options.12' => 22,
          'options.very.deep.nested.param' => 'Deep nested value'
        )
      end
    end
  end
end