1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activerecord/test/cases/view_test.rb
George Claghorn 908cfef6e2 Resolve enums in test fixtures
Currently, values for columns backing Active Record enums must be
specified as integers in test fixtures:

    awdr:
      title: "Agile Web Development with Rails"
      status: 2

    rfr:
      title: "Ruby for Rails"
      status: <%= Book.statuses[:proposed] %>

This is potentially confusing, since enum values are typically
specified as symbols or strings in application code. To resolve the
confusion, this change permits the use of symbols or strings to specify
enum values:

    awdr:
      status: :published

It is compatible with fixtures that specify enum values as integers.
2015-05-27 21:48:58 -04:00

113 lines
2.7 KiB
Ruby

require "cases/helper"
require "models/book"
module ViewBehavior
extend ActiveSupport::Concern
included do
fixtures :books
end
class Ebook < ActiveRecord::Base
self.primary_key = "id"
end
def setup
super
@connection = ActiveRecord::Base.connection
create_view "ebooks", <<-SQL
SELECT id, name, status FROM books WHERE format = 'ebook'
SQL
end
def teardown
super
drop_view "ebooks"
end
def test_reading
books = Ebook.all
assert_equal [books(:rfr).id], books.map(&:id)
assert_equal ["Ruby for Rails"], books.map(&:name)
end
def test_table_exists
view_name = Ebook.table_name
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"
end
def test_column_definitions
assert_equal([["id", :integer],
["name", :string],
["status", :integer]], Ebook.columns.map { |c| [c.name, c.type] })
end
def test_attributes
assert_equal({"id" => 2, "name" => "Ruby for Rails", "status" => 0},
Ebook.first.attributes)
end
def test_does_not_assume_id_column_as_primary_key
model = Class.new(ActiveRecord::Base) do
self.table_name = "ebooks"
end
assert_nil model.primary_key
end
end
if ActiveRecord::Base.connection.supports_views?
class ViewWithPrimaryKeyTest < ActiveRecord::TestCase
include ViewBehavior
private
def create_view(name, query)
@connection.execute "CREATE VIEW #{name} AS #{query}"
end
def drop_view(name)
@connection.execute "DROP VIEW #{name}" if @connection.table_exists? name
end
end
class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
fixtures :books
class Paperback < ActiveRecord::Base; end
setup do
@connection = ActiveRecord::Base.connection
@connection.execute <<-SQL
CREATE VIEW paperbacks
AS SELECT name, status FROM books WHERE format = 'paperback'
SQL
end
teardown do
@connection.execute "DROP VIEW paperbacks" if @connection.table_exists? "paperbacks"
end
def test_reading
books = Paperback.all
assert_equal ["Agile Web Development with Rails"], books.map(&:name)
end
def test_table_exists
view_name = Paperback.table_name
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"
end
def test_column_definitions
assert_equal([["name", :string],
["status", :integer]], Paperback.columns.map { |c| [c.name, c.type] })
end
def test_attributes
assert_equal({"name" => "Agile Web Development with Rails", "status" => 2},
Paperback.first.attributes)
end
def test_does_not_have_a_primary_key
assert_nil Paperback.primary_key
end
end
end