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