# frozen_string_literal: true
require "cases/helper"
require "support/connection_helper"
class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
include ConnectionHelper
class PostgresqlEnum < ActiveRecord::Base
self.table_name = "postgresql_enums"
end
def setup
@connection = ActiveRecord::Base.connection
@connection.transaction do
@connection.execute <<-SQL
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
SQL
@connection.create_table("postgresql_enums") do |t|
t.column :current_mood, :mood
end
end
end
teardown do
@connection.drop_table "postgresql_enums", if_exists: true
@connection.execute "DROP TYPE IF EXISTS mood"
reset_connection
end
def test_column
column = PostgresqlEnum.columns_hash["current_mood"]
assert_equal :enum, column.type
assert_equal "mood", column.sql_type
assert_not column.array?
type = PostgresqlEnum.type_for_attribute("current_mood")
assert_not type.binary?
end
def test_enum_defaults
@connection.add_column "postgresql_enums", "good_mood", :mood, default: "happy"
PostgresqlEnum.reset_column_information
assert_equal "happy", PostgresqlEnum.column_defaults["good_mood"]
assert_equal "happy", PostgresqlEnum.new.good_mood
ensure
PostgresqlEnum.reset_column_information
end
def test_enum_mapping
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
enum = PostgresqlEnum.first
assert_equal "sad", enum.current_mood
enum.current_mood = "happy"
enum.save!
assert_equal "happy", enum.reload.current_mood
end
def test_invalid_enum_update
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
enum = PostgresqlEnum.first
enum.current_mood = "angry"
assert_raise ActiveRecord::StatementInvalid do
enum.save
end
end
def test_no_oid_warning
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
stderr_output = capture(:stderr) { PostgresqlEnum.first }
assert stderr_output.blank?
end
def test_enum_type_cast
enum = PostgresqlEnum.new
enum.current_mood = :happy
assert_equal "happy", enum.current_mood
end
def test_assigning_enum_to_nil
model = PostgresqlEnum.new(current_mood: nil)
assert_nil model.current_mood
assert model.save
assert_nil model.reload.current_mood
end
end