Class: Spectre::MySQL::Client

Inherits:
Object
  • Object
show all
Includes:
Delegate
Defined in:
lib/spectre/mysql.rb

Instance Method Summary collapse

Constructor Details

#initialize(config, logger) ⇒ Client

Returns a new instance of Client.



43
44
45
46
47
48
49
# File 'lib/spectre/mysql.rb', line 43

def initialize config, logger
  @config = config['mysql'] || {}
  @logger = logger

  @result = nil
  @last_conn = nil
end

Instance Method Details

#mysql(name = nil) ⇒ Object



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
# File 'lib/spectre/mysql.rb', line 51

def mysql(name = nil, &)
  config = {}

  if !name.nil? and @config.key? name
    config.merge! @config[name]

    unless config['host']
      raise "No `host' set for MySQL client '#{name}'. Check your MySQL config in your environment."
    end

  elsif !name.nil?
    config['host'] = name
  elsif @last_conn
    config['host']     = @last_conn[:host]
    config['username'] = @last_conn[:username]
    config['password'] = @last_conn[:password]
    config['database'] = @last_conn[:database]
    config['ssl']      = @last_conn[:ssl_mode]
  else
    raise 'No name given and there was no previous MySQL connection to use'
  end

  MySqlQuery.new(config).instance_eval(&) if block_given?

  @last_conn = {
    host: config['host'],
    username: config['username'],
    password: config['password'],
    database: config['database'],
    ssl_mode: (config['ssl'] || :required).to_sym,
  }

  @logger.info "Connecting to database #{@last_conn[:username]}@#{@last_conn[:host]}:#{@last_conn[:database]}"

  client = ::Mysql2::Client.new(**@last_conn)

  begin
    res = nil

    config['query']&.each do |statement|
      @logger.info("Executing statement '#{statement}'")
      # cast: false returns all columns as strings — Spectre tests treat values as opaque,
      # and this avoids mysql2's BigDecimal/Date casting failures on driver-level mismatches.
      res = client.query(statement, cast: false, cast_booleans: false)
    end

    @result = res.map { |row| OpenStruct.new(row) } if res
  ensure
    client.close
  end
end

#resultObject



103
104
105
106
107
# File 'lib/spectre/mysql.rb', line 103

def result
  raise 'No MySQL query has been executed yet' unless @result

  @result
end