File: base_model_spec.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (130 lines) | stat: -rw-r--r-- 3,984 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
127
128
129
130
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe ClickHouse::Models::BaseModel, feature_category: :database do
  let(:table_name) { "dummy_table" }
  let(:query_builder) { instance_double("ClickHouse::QueryBuilder") }
  let(:updated_query_builder) { instance_double("ClickHouse::QueryBuilder") }

  let(:dummy_class) do
    Class.new(described_class) do
      def self.table_name
        "dummy_table"
      end
    end
  end

  describe '#to_sql' do
    it 'delegates to the query builder' do
      expect(query_builder).to receive(:to_sql).and_return("SELECT * FROM dummy_table")

      dummy_instance = dummy_class.new(query_builder)

      expect(dummy_instance.to_sql).to eq("SELECT * FROM dummy_table")
    end
  end

  describe '#where' do
    it 'returns a new instance with refined query' do
      dummy_instance = dummy_class.new(query_builder)

      expect(query_builder).to receive(:where).with({ foo: "bar" }).and_return(updated_query_builder)

      new_instance = dummy_instance.where(foo: "bar")

      expect(new_instance).to be_a(dummy_class)
      expect(new_instance).not_to eq(dummy_instance)
    end
  end

  describe '#order' do
    it 'returns a new instance with an order clause' do
      dummy_instance = dummy_class.new(query_builder)

      expect(query_builder).to receive(:order).with(:created_at, :asc).and_return(updated_query_builder)

      new_instance = dummy_instance.order(:created_at)

      expect(new_instance).to be_a(dummy_class)
      expect(new_instance).not_to eq(dummy_instance)
    end

    context "when direction is also passed" do
      it 'returns a new instance with an order clause' do
        dummy_instance = dummy_class.new(query_builder)

        expect(query_builder).to receive(:order).with(:created_at, :desc).and_return(updated_query_builder)

        new_instance = dummy_instance.order(:created_at, :desc)

        expect(new_instance).to be_a(dummy_class)
        expect(new_instance).not_to eq(dummy_instance)
      end
    end
  end

  describe '#limit' do
    it 'returns a new instance with a limit clause' do
      dummy_instance = dummy_class.new(query_builder)

      expect(query_builder).to receive(:limit).with(10).and_return(updated_query_builder)

      new_instance = dummy_instance.limit(10)

      expect(new_instance).to be_a(dummy_class)
      expect(new_instance).not_to eq(dummy_instance)
    end
  end

  describe '#offset' do
    it 'returns a new instance with an offset clause' do
      dummy_instance = dummy_class.new(query_builder)

      expect(query_builder).to receive(:offset).with(5).and_return(updated_query_builder)

      new_instance = dummy_instance.offset(5)

      expect(new_instance).to be_a(dummy_class)
      expect(new_instance).not_to eq(dummy_instance)
    end
  end

  describe '#group' do
    it 'returns a new instance with grouped results' do
      dummy_instance = dummy_class.new(query_builder)

      expect(query_builder).to receive(:group).with(:id, :name).and_return(updated_query_builder)

      new_instance = dummy_instance.group(:id, :name)

      expect(new_instance).to be_a(dummy_class)
      expect(new_instance).not_to eq(dummy_instance)
    end
  end

  describe '#select' do
    it 'returns a new instance with selected fields' do
      dummy_instance = dummy_class.new(query_builder)

      expect(query_builder).to receive(:select).with(:id, :name).and_return(updated_query_builder)

      new_instance = dummy_instance.select(:id, :name)

      expect(new_instance).to be_a(dummy_class)
      expect(new_instance).not_to eq(dummy_instance)
    end
  end

  describe '.table_name' do
    it 'raises a NotImplementedError for the base model' do
      expect do
        described_class.table_name
      end.to raise_error(NotImplementedError, "Subclasses must define a `table_name` class method")
    end

    it 'does not raise an error for the subclass' do
      expect(dummy_class.table_name).to eq(table_name)
    end
  end
end