aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/adapters/postgresql/serial_test.rb
blob: 6a99323be51b3c030198ace1d8bb9528d72fdc9c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# frozen_string_literal: true

require "cases/helper"
require "support/schema_dumping_helper"

class PostgresqlSerialTest < ActiveRecord::PostgreSQLTestCase
  include SchemaDumpingHelper

  class PostgresqlSerial < ActiveRecord::Base; end

  setup do
    @connection = ActiveRecord::Base.connection
    @connection.create_table "postgresql_serials", force: true do |t|
      t.serial :seq
      t.integer :serials_id, default: -> { "nextval('postgresql_serials_id_seq')" }
    end
  end

  teardown do
    @connection.drop_table "postgresql_serials", if_exists: true
  end

  def test_serial_column
    column = PostgresqlSerial.columns_hash["seq"]
    assert_equal :integer, column.type
    assert_equal "integer", column.sql_type
    assert column.serial?
  end

  def test_not_serial_column
    column = PostgresqlSerial.columns_hash["serials_id"]
    assert_equal :integer, column.type
    assert_equal "integer", column.sql_type
    assert_not column.serial?
  end

  def test_schema_dump_with_shorthand
    output = dump_table_schema "postgresql_serials"
    assert_match %r{t\.serial\s+"seq",\s+null: false$}, output
  end

  def test_schema_dump_with_not_serial
    output = dump_table_schema "postgresql_serials"
    assert_match %r{t\.integer\s+"serials_id",\s+default: -> \{ "nextval\('postgresql_serials_id_seq'::regclass\)" \}$}, output
  end
end

class PostgresqlBigSerialTest < ActiveRecord::PostgreSQLTestCase
  include SchemaDumpingHelper

  class PostgresqlBigSerial < ActiveRecord::Base; end

  setup do
    @connection = ActiveRecord::Base.connection
    @connection.create_table "postgresql_big_serials", force: true do |t|
      t.bigserial :seq
      t.bigint :serials_id, default: -> { "nextval('postgresql_big_serials_id_seq')" }
    end
  end

  teardown do
    @connection.drop_table "postgresql_big_serials", if_exists: true
  end

  def test_bigserial_column
    column = PostgresqlBigSerial.columns_hash["seq"]
    assert_equal :integer, column.type
    assert_equal "bigint", column.sql_type
    assert column.serial?
  end

  def test_not_bigserial_column
    column = PostgresqlBigSerial.columns_hash["serials_id"]
    assert_equal :integer, column.type
    assert_equal "bigint", column.sql_type
    assert_not column.serial?
  end

  def test_schema_dump_with_shorthand
    output = dump_table_schema "postgresql_big_serials"
    assert_match %r{t\.bigserial\s+"seq",\s+null: false$}, output
  end

  def test_schema_dump_with_not_bigserial
    output = dump_table_schema "postgresql_big_serials"
    assert_match %r{t\.bigint\s+"serials_id",\s+default: -> \{ "nextval\('postgresql_big_serials_id_seq'::regclass\)" \}$}, output
  end
end

module SequenceNameDetectionTestCases
  class CollidedSequenceNameTest < ActiveRecord::PostgreSQLTestCase
    include SchemaDumpingHelper

    def setup
      @connection = ActiveRecord::Base.connection
      @connection.create_table :foo_bar, force: true do |t|
        t.serial :baz_id
      end
      @connection.create_table :foo, force: true do |t|
        t.serial :bar_id
        t.bigserial :bar_baz_id
      end
    end

    def teardown
      @connection.drop_table :foo_bar, if_exists: true
      @connection.drop_table :foo, if_exists: true
    end

    def test_serial_columns
      columns = @connection.columns(:foo)
      columns.each do |column|
        assert_equal :integer, column.type
        assert column.serial?
      end
    end

    def test_schema_dump_with_collided_sequence_name
      output = dump_table_schema "foo"
      assert_match %r{t\.serial\s+"bar_id",\s+null: false$}, output
      assert_match %r{t\.bigserial\s+"bar_baz_id",\s+null: false$}, output
    end
  end

  class LongerSequenceNameDetectionTest < ActiveRecord::PostgreSQLTestCase
    include SchemaDumpingHelper

    def setup
      @table_name = "long_table_name_to_test_sequence_name_detection_for_serial_cols"
      @connection = ActiveRecord::Base.connection
      @connection.create_table @table_name, force: true do |t|
        t.serial :seq
        t.bigserial :bigseq
      end
    end

    def teardown
      @connection.drop_table @table_name, if_exists: true
    end

    def test_serial_columns
      columns = @connection.columns(@table_name)
      columns.each do |column|
        assert_equal :integer, column.type
        assert column.serial?
      end
    end

    def test_schema_dump_with_long_table_name
      output = dump_table_schema @table_name
      assert_match %r{create_table "#{@table_name}", force: :cascade}, output
      assert_match %r{t\.serial\s+"seq",\s+null: false$}, output
      assert_match %r{t\.bigserial\s+"bigseq",\s+null: false$}, output
    end
  end
end