class RSpec::Matchers::Sequel::HaveIndexOn

Public Class Methods

new(column, unique=false) click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 38
def initialize(column, unique=false)
  @columns = Array(column)
  @unique = unique
end

Public Instance Methods

description() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 20
def description
  text = %w(have)
  text << 'unique' if @unique
  text << %(index on #{@columns.inspect})
  text << %(named "#{@name}") if @name
  text.join(' ')
end
failure_message() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 28
def failure_message
  %(expected #{@table} to #{description} but #{@error})
end
failure_message_when_negated() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 32
def failure_message_when_negated
  %(did not expect #{@table} to #{description})
end
matches?(table) click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 12
def matches?(table)
  @table = table

  get_required_index

  index_present? && correct_name? && unique?
end
named(name) click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 7
def named(name)
  @name = name.to_sym
  self
end

Private Instance Methods

correct_name?() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 73
def correct_name?
  if @name && @index.first != @name
    @error = %(index have name "#{@index.first}")
    false
  else
    true
  end
end
get_required_index() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 43
def get_required_index
  @index = DB.indexes(@table).each_pair.detect { |index, opts|
    index.to_s.split('_').last != 'key' && opts[:columns] == @columns
  }
end
get_required_key() click to toggle source

PostgreSQL adapter returns index and constraints as separate objects, each with an appropriate postfix. Other case is when constaint name is defined manually and following method must take that in account too.

# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 53
def get_required_key
  key = DB.indexes(@table).each_pair.detect do |key, opts|
    if @name
      key == @name
    else
      key.to_s.split('_').last == 'key' && opts[:columns] == @columns
    end
  end
  @key = key.nil? ? {} : key.last
end
index_present?() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 64
def index_present?
  if @index.nil?
    @error = 'none exists'
    false
  else
    true
  end
end
unique?() click to toggle source
# File lib/rspec/sequel_expectations/matchers/have_index_on.rb, line 82
def unique?
  get_required_key
  if @index.last[:unique] == @unique || @key.fetch(:unique, false) == @unique
    true
  else
    @error = 'index is non-unique'
    false
  end
end