class RSpec::Matchers::Sequel::HaveEnum

TODO: refactor with Sequel API www.rubydoc.info/gems/sequel/4.13.0/Sequel/Postgres/EnumDatabaseMethods

Public Class Methods

new(enum_name) click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 60
def initialize(enum_name)
  @enum_values = []
  @enum_name   = enum_name
end

Public Instance Methods

failure_message() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 17
def failure_message
  "expected database to #{description} #{@error}"
end
failure_message_when_negated() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 13
def failure_message_when_negated
  "expected database not to #{@description} #{@error}"
end
matches?(db) click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 8
def matches?(db)
  @db = db
  enum_exists? &&  with_valid_values?
end
with_values(*values) click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 21
def with_values(*values)
  @enum_values = values.flatten
  self
end

Private Instance Methods

description() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 28
def description
  text = [%(have enum named "#{@enum_name}")]
  text << %(with values "#{@enum_values}") unless @enum_values.empty?
  text.join(' ')
end
enum_exists?() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 34
def enum_exists?
  !!@db.fetch("SELECT '#{@enum_name}'::regtype;").first
rescue ::Sequel::DatabaseError => e 
  
  if e.message[0..18] == 'PG::UndefinedObject'
    @error = "but it doesn't exist"
    return false
  end
  
  raise e
end
with_valid_values?() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_enum.rb, line 46
def with_valid_values?
  return true if @enum_values.empty?

  sql = "SELECT e.enumlabel FROM pg_enum e JOIN pg_type t ON t.oid = e.enumtypid WHERE t.typname = '#{@enum_name}';"
  values = @db.fetch(sql).map { |enum| enum[:enumlabel] }

  if @enum_values.sort == values.sort
    true
  else
    @error = "but got #{values}"
    false
  end
end