File: explainable_spec.rb

package info (click to toggle)
ruby-mongo 2.21.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 14,764 kB
  • sloc: ruby: 108,806; makefile: 5; sh: 2
file content (119 lines) | stat: -rw-r--r-- 2,748 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
# frozen_string_literal: true
# rubocop:todo all

require 'spec_helper'

describe Mongo::Collection::View::Explainable do

  let(:selector) do
    {}
  end

  let(:options) do
    {}
  end

  let(:view) do
    Mongo::Collection::View.new(authorized_collection, selector, options)
  end

  before do
    authorized_collection.delete_many
  end

  describe '#explain' do

    shared_examples 'executes the explain' do
      context '3.0+ server' do
        min_server_fcv '3.0'

        context 'not sharded' do
          require_topology :single, :replica_set

          it 'executes the explain' do
            explain[:queryPlanner][:namespace].should == authorized_collection.namespace
          end
        end

        context 'sharded' do
          require_topology :sharded

          context 'pre-3.2 server' do
            max_server_version '3.0'

            it 'executes the explain' do
              skip 'https://jira.mongodb.org/browse/RUBY-3399'
              explain[:queryPlanner][:parsedQuery].should be_a(Hash)
            end
          end

          context '3.2+ server' do
            min_server_fcv '3.2'

            it 'executes the explain' do
              skip 'https://jira.mongodb.org/browse/RUBY-3399'
              explain[:queryPlanner][:mongosPlannerVersion].should == 1
            end
          end
        end
      end

      context '2.6 server' do
        max_server_version '2.6'

        it 'executes the explain' do
          explain[:cursor].should == 'BasicCursor'
        end
      end
    end

    context 'without arguments' do
      let(:explain) do
        view.explain
      end

      include_examples 'executes the explain'
    end

    context 'with verbosity argument' do
      let(:explain) do
        view.explain(verbosity: verbosity)
      end

      shared_examples 'triggers server error' do
        # 3.0 does not produce the error.
        min_server_fcv '3.2'

        it 'triggers server error' do
          lambda do
            explain
          end.should raise_error(Mongo::Error::OperationFailure, /verbosity string must be|value .* for field .*verbosity.* is not a valid value/)
        end
      end

      context 'valid symbol value' do
        let(:verbosity) { :query_planner }

        include_examples 'executes the explain'
      end

      context 'valid string value' do
        let(:verbosity) { 'executionStats' }

        include_examples 'executes the explain'
      end

      context 'invalid symbol value' do
        let(:verbosity) { :bogus }

        include_examples 'triggers server error'
      end

      context 'invalid string value' do
        let(:verbosity) { 'bogus' }

        include_examples 'triggers server error'
      end
    end
  end
end