File: result_spec.rb

package info (click to toggle)
ruby-mongo 2.23.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,020 kB
  • sloc: ruby: 110,810; makefile: 5
file content (126 lines) | stat: -rw-r--r-- 3,924 bytes parent folder | download
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
# rubocop:todo all

require 'lite_spec_helper'

describe Mongo::Srv::Result do
  let(:result) do
    described_class.new('bar.com')
  end

  describe '#add_record' do
    context 'when incoming hostname is in mixed case' do
      let(:record) do
        double('record').tap do |record|
          allow(record).to receive(:target).and_return('FOO.bar.COM')
          allow(record).to receive(:port).and_return(42)
          allow(record).to receive(:ttl).and_return(1)
        end
      end

      it 'stores hostname in lower case' do
        result.add_record(record)
        expect(result.address_strs).to eq(['foo.bar.com:42'])
      end
    end

    example_srv_names = ['i-love-rb', 'i-love-rb.mongodb', 'i-love-ruby.mongodb.io'];
    example_host_names = [
      'rb-00.i-love-rb',
      'rb-00.i-love-rb.mongodb',
      'i-love-ruby-00.mongodb.io'
    ];
    example_host_names_that_do_not_match_parent = [
      'rb-00.i-love-rb-a-little',
      'rb-00.i-love-rb-a-little.mongodb',
      'i-love-ruby-00.evil-mongodb.io'
    ];

    (0..2).each do |i|
      context "when srvName has #{i+1} part#{i != 0 ? 's' : ''}" do
        let(:srv_name) { example_srv_names[i] }
        let(:host_name) { example_host_names[i] }
        let(:mismatched_host_name) { example_host_names_that_do_not_match_parent[i] }
        context 'when address does not match parent domain' do
          let(:record) do
            double('record').tap do |record|
              allow(record).to receive(:target).and_return(mismatched_host_name)
              allow(record).to receive(:port).and_return(42)
              allow(record).to receive(:ttl).and_return(1)
            end
          end
          it 'raises MismatchedDomain error' do
            expect {
              result = described_class.new(srv_name)
              result.add_record(record)
            }.to raise_error(Mongo::Error::MismatchedDomain)
          end
        end

        context 'when address matches parent domain' do
          let(:record) do
            double('record').tap do |record|
              allow(record).to receive(:target).and_return(host_name)
              allow(record).to receive(:port).and_return(42)
              allow(record).to receive(:ttl).and_return(1)
            end
          end
          it 'adds the record' do
            result = described_class.new(srv_name)
            result.add_record(record)

            expect(result.address_strs).to eq([host_name + ':42'])
          end
        end

        if i < 2
          context 'when the address is less than 3 parts' do
            let(:record) do
              double('record').tap do |record|
                allow(record).to receive(:target).and_return(srv_name)
                allow(record).to receive(:port).and_return(42)
                allow(record).to receive(:ttl).and_return(1)
              end
            end
            it 'does not accept address if it does not contain an extra domain level' do
              expect {
                result = described_class.new(srv_name)
                result.add_record(record)
              }.to raise_error(Mongo::Error::MismatchedDomain)
            end
          end
        end
      end
    end
  end

  describe '#normalize_hostname' do
    let(:actual) do
      result.send(:normalize_hostname, hostname)
    end

    context 'when hostname is in mixed case' do
      let(:hostname) { 'FOO.bar.COM' }

      it 'converts to lower case' do
        expect(actual).to eq('foo.bar.com')
      end
    end

    context 'when hostname has one trailing dot' do
      let(:hostname) { 'foo.' }

      it 'removes the trailing dot' do
        expect(actual).to eq('foo')
      end
    end

    context 'when hostname has multiple trailing dots' do
      let(:hostname) { 'foo..' }

      it 'returns hostname unchanged' do
        expect(actual).to eq('foo..')
      end
    end
  end
end