Class: SqlGenius::Core::Connection::FakeAdapter

Inherits:
Object
  • Object
show all
Defined in:
lib/sql_genius/core/connection/fake_adapter.rb

Overview

In-memory fake connection used by core specs. Supports stubbing queries by regex and returning canned Core::Result values, plus stubbing metadata methods. See spec/sql_genius/core/connection/ fake_adapter_spec.rb for the full surface.

Defined Under Namespace

Classes: NoStubError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeFakeAdapter

Returns a new instance of FakeAdapter.



13
14
15
16
17
18
19
20
21
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 13

def initialize
  @stubs = []
  @tables = []
  @columns_for = {}
  @indexes_for = {}
  @primary_keys = {}
  @server_version = "8.0.35"
  @current_database = "test_db"
end

Instance Attribute Details

#current_databaseObject (readonly)

Returns the value of attribute current_database.



75
76
77
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 75

def current_database
  @current_database
end

#tablesObject (readonly)

Returns the value of attribute tables.



94
95
96
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 94

def tables
  @tables
end

Instance Method Details

#closeObject



108
109
110
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 108

def close
  nil
end

#columns_for(table) ⇒ Object



96
97
98
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 96

def columns_for(table)
  @columns_for.fetch(table, [])
end

#exec_query(sql, binds: []) ⇒ Object

—– contract —–

Raises:



55
56
57
58
59
60
61
62
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 55

def exec_query(sql, binds: [])
  _ = binds
  stub = @stubs.find { |s| s[:pattern] =~ sql }
  raise NoStubError, "No stub matched SQL: #{sql}" unless stub
  raise stub[:raises] if stub[:raises]

  Result.new(columns: stub[:columns], rows: stub[:rows])
end

#indexes_for(table) ⇒ Object



100
101
102
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 100

def indexes_for(table)
  @indexes_for.fetch(table, [])
end

#primary_key(table) ⇒ Object



104
105
106
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 104

def primary_key(table)
  @primary_keys[table]
end

#quote(value) ⇒ Object



77
78
79
80
81
82
83
84
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 77

def quote(value)
  case value
  when nil then "NULL"
  when Integer, Float then value.to_s
  when String then "'#{value.gsub("'", "''")}'"
  else "'#{value.to_s.gsub("'", "''")}'"
  end
end

#quote_table_name(name) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 86

def quote_table_name(name)
  if server_version.postgresql?
    %("#{name.to_s.gsub('"', '""')}")
  else
    "`#{name}`"
  end
end

#select_value(sql) ⇒ Object



64
65
66
67
68
69
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 64

def select_value(sql)
  result = exec_query(sql)
  return if result.empty?

  result.rows.first&.first
end

#server_versionObject



71
72
73
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 71

def server_version
  ServerInfo.parse(@server_version)
end

#stub_columns_for(table, columns) ⇒ Object



41
42
43
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 41

def stub_columns_for(table, columns)
  @columns_for[table] = columns
end

#stub_current_database(name) ⇒ Object



33
34
35
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 33

def stub_current_database(name)
  @current_database = name
end

#stub_indexes_for(table, indexes) ⇒ Object



45
46
47
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 45

def stub_indexes_for(table, indexes)
  @indexes_for[table] = indexes
end

#stub_primary_key(table, name) ⇒ Object



49
50
51
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 49

def stub_primary_key(table, name)
  @primary_keys[table] = name
end

#stub_query(pattern, columns: [], rows: [], raises: nil) ⇒ Object

—– stub registration —–



25
26
27
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 25

def stub_query(pattern, columns: [], rows: [], raises: nil)
  @stubs << { pattern: pattern, columns: columns, rows: rows, raises: raises }
end

#stub_server_version(version) ⇒ Object



29
30
31
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 29

def stub_server_version(version)
  @server_version = version
end

#stub_tables(list) ⇒ Object



37
38
39
# File 'lib/sql_genius/core/connection/fake_adapter.rb', line 37

def stub_tables(list)
  @tables = list
end