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
|