torque-postgresql 2.2.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/torque/postgresql/adapter/database_statements.rb +12 -1
  3. data/lib/torque/postgresql/adapter/oid/enum_set.rb +1 -1
  4. data/lib/torque/postgresql/adapter/oid.rb +0 -3
  5. data/lib/torque/postgresql/adapter/quoting.rb +14 -19
  6. data/lib/torque/postgresql/adapter/schema_creation.rb +1 -2
  7. data/lib/torque/postgresql/adapter/schema_definitions.rb +0 -37
  8. data/lib/torque/postgresql/adapter/schema_dumper.rb +0 -40
  9. data/lib/torque/postgresql/adapter/schema_statements.rb +0 -15
  10. data/lib/torque/postgresql/adapter.rb +0 -9
  11. data/lib/torque/postgresql/associations/belongs_to_many_association.rb +5 -3
  12. data/lib/torque/postgresql/associations/{association.rb → foreign_association.rb} +1 -4
  13. data/lib/torque/postgresql/associations/preloader/association.rb +53 -26
  14. data/lib/torque/postgresql/associations/preloader/loader_query.rb +36 -0
  15. data/lib/torque/postgresql/associations/preloader.rb +1 -0
  16. data/lib/torque/postgresql/associations.rb +6 -1
  17. data/lib/torque/postgresql/attributes/builder/period.rb +6 -2
  18. data/lib/torque/postgresql/config.rb +2 -11
  19. data/lib/torque/postgresql/reflection/abstract_reflection.rb +5 -7
  20. data/lib/torque/postgresql/relation.rb +10 -12
  21. data/lib/torque/postgresql/schema_cache.rb +2 -1
  22. data/lib/torque/postgresql/version.rb +1 -1
  23. data/lib/torque-postgresql.rb +0 -1
  24. data/spec/models/question_select.rb +2 -0
  25. data/spec/schema.rb +147 -147
  26. data/spec/spec_helper.rb +7 -6
  27. data/spec/tests/arel_spec.rb +29 -7
  28. data/spec/tests/belongs_to_many_spec.rb +14 -0
  29. data/spec/tests/enum_set_spec.rb +7 -5
  30. data/spec/tests/enum_spec.rb +1 -84
  31. data/spec/tests/interval_spec.rb +2 -1
  32. metadata +49 -57
  33. data/lib/torque/range.rb +0 -20
  34. data/spec/tests/range_spec.rb +0 -36
data/spec/schema.rb CHANGED
@@ -10,151 +10,151 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- begin
14
- version = 73
15
-
16
- raise SystemExit if ActiveRecord::Migrator.current_version == version
17
- ActiveRecord::Schema.define(version: version) do
18
- self.verbose = false
19
-
20
- # These are extensions that must be enabled in order to support this database
21
- enable_extension "pgcrypto"
22
- enable_extension "plpgsql"
23
-
24
- # These are user-defined types used on this database
25
- create_enum "content_status", ["created", "draft", "published", "archived"], force: :cascade
26
- create_enum "specialties", ["books", "movies", "plays"], force: :cascade
27
- create_enum "roles", ["visitor", "assistant", "manager", "admin"], force: :cascade
28
- create_enum "conflicts", ["valid", "invalid", "untrusted"], force: :cascade
29
- create_enum "types", ["A", "B", "C", "D"], force: :cascade
30
-
31
- create_table "geometries", force: :cascade do |t|
32
- t.point "point"
33
- t.line "line"
34
- t.lseg "lseg"
35
- t.box "box"
36
- t.path "closed_path"
37
- t.path "open_path"
38
- t.polygon "polygon"
39
- t.circle "circle"
40
- end
41
-
42
- create_table "time_keepers", force: :cascade do |t|
43
- t.daterange "available"
44
- t.tsrange "period"
45
- t.tstzrange "tzperiod"
46
- t.interval "th"
47
- end
48
-
49
- create_table "tags", force: :cascade do |t|
50
- t.string "name"
51
- end
52
-
53
- create_table "videos", force: :cascade do |t|
54
- t.bigint "tag_ids", array: true
55
- t.string "title"
56
- t.string "url"
57
- t.enum "type", subtype: :types
58
- t.enum "conflicts", subtype: :conflicts, array: true
59
- t.datetime "created_at", null: false
60
- t.datetime "updated_at", null: false
61
- end
62
-
63
- create_table "authors", force: :cascade do |t|
64
- t.string "name"
65
- t.string "type"
66
- t.enum "specialty", subtype: :specialties
67
- end
68
-
69
- create_table "texts", force: :cascade do |t|
70
- t.integer "user_id"
71
- t.string "content"
72
- t.enum "conflict", subtype: :conflicts
73
- end
74
-
75
- create_table "comments", force: :cascade do |t|
76
- t.integer "user_id", null: false
77
- t.integer "comment_id"
78
- t.integer "video_id"
79
- t.text "content", null: false
80
- t.string "kind"
81
- t.index ["user_id"], name: "index_comments_on_user_id", using: :btree
82
- t.index ["comment_id"], name: "index_comments_on_comment_id", using: :btree
83
- end
84
-
85
- create_table "courses", force: :cascade do |t|
86
- t.string "title", null: false
87
- t.interval "duration"
88
- t.enum "types", subtype: :types, array: true
89
- t.datetime "created_at", null: false
90
- t.datetime "updated_at", null: false
91
- end
92
-
93
- create_table "images", force: :cascade, id: false do |t|
94
- t.string "file"
95
- end
96
-
97
- create_table "posts", force: :cascade do |t|
98
- t.integer "author_id"
99
- t.integer "activity_id"
100
- t.string "title"
101
- t.text "content"
102
- t.enum "status", subtype: :content_status
103
- t.index ["author_id"], name: "index_posts_on_author_id", using: :btree
104
- end
105
-
106
- create_table "items", force: :cascade do |t|
107
- t.string "name"
108
- t.bigint "tag_ids", array: true, default: "{1}"
109
- t.datetime "created_at", null: false
110
- t.datetime "updated_at", null: false
111
- end
112
-
113
- create_table "users", force: :cascade do |t|
114
- t.string "name", null: false
115
- t.enum "role", subtype: :roles, default: :visitor
116
- t.datetime "created_at", null: false
117
- t.datetime "updated_at", null: false
118
- end
119
-
120
- create_table "activities", force: :cascade do |t|
121
- t.integer "author_id"
122
- t.string "title"
123
- t.boolean "active"
124
- t.enum "kind", subtype: :types
125
- t.datetime "created_at", null: false
126
- t.datetime "updated_at", null: false
127
- end
128
-
129
- create_table "questions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
130
- t.string "title"
131
- t.datetime "created_at", null: false
132
- t.datetime "updated_at", null: false
133
- end
134
-
135
- create_table "activity_books", force: :cascade, inherits: :activities do |t|
136
- t.text "description"
137
- t.string "url"
138
- t.boolean "activated"
139
- end
140
-
141
- create_table "activity_posts", force: :cascade, inherits: [:activities, :images] do |t|
142
- t.integer "post_id"
143
- t.string "url"
144
- t.integer "activated"
145
- end
146
-
147
- create_table "activity_post_samples", force: :cascade, inherits: :activity_posts
148
-
149
- create_table "question_selects", force: :cascade, inherits: :questions do |t|
150
- t.string "options", array: true
151
- end
152
-
153
- # create_table "activity_blanks", force: :cascade, inherits: :activities
154
-
155
- # create_table "activity_images", force: :cascade, inherits: [:activities, :images]
156
-
157
- add_foreign_key "posts", "authors"
158
- end
159
- rescue SystemExit
13
+ version = 2
14
+
15
+ return if ActiveRecord::Migrator.current_version == version
16
+ ActiveRecord::Schema.define(version: version) do
17
+ self.verbose = false
18
+
19
+ # These are extensions that must be enabled in order to support this database
20
+ enable_extension "pgcrypto"
21
+ enable_extension "plpgsql"
22
+
23
+ # Custom types defined in this database.
24
+ # Note that some types may not work with other database engines. Be careful if changing database.
25
+ create_enum "content_status", ["created", "draft", "published", "archived"]
26
+ create_enum "specialties", ["books", "movies", "plays"]
27
+ create_enum "roles", ["visitor", "assistant", "manager", "admin"]
28
+ create_enum "conflicts", ["valid", "invalid", "untrusted"]
29
+ create_enum "types", ["A", "B", "C", "D"]
30
+
31
+ create_table "geometries", force: :cascade do |t|
32
+ t.point "point"
33
+ t.line "line"
34
+ t.lseg "lseg"
35
+ t.box "box"
36
+ t.path "closed_path"
37
+ t.path "open_path"
38
+ t.polygon "polygon"
39
+ t.circle "circle"
40
+ end
41
+
42
+ create_table "time_keepers", force: :cascade do |t|
43
+ t.daterange "available"
44
+ t.tsrange "period"
45
+ t.tstzrange "tzperiod"
46
+ t.interval "th"
47
+ end
48
+
49
+ create_table "tags", force: :cascade do |t|
50
+ t.string "name"
51
+ end
52
+
53
+ create_table "videos", force: :cascade do |t|
54
+ t.bigint "tag_ids", array: true
55
+ t.string "title"
56
+ t.string "url"
57
+ t.enum "type", enum_type: :types
58
+ t.enum "conflicts", enum_type: :conflicts, array: true
59
+ t.datetime "created_at", null: false
60
+ t.datetime "updated_at", null: false
61
+ end
62
+
63
+ create_table "authors", force: :cascade do |t|
64
+ t.string "name"
65
+ t.string "type"
66
+ t.enum "specialty", enum_type: :specialties
67
+ end
68
+
69
+ create_table "texts", force: :cascade do |t|
70
+ t.integer "user_id"
71
+ t.string "content"
72
+ t.enum "conflict", enum_type: :conflicts
73
+ end
74
+
75
+ create_table "comments", force: :cascade do |t|
76
+ t.integer "user_id", null: false
77
+ t.integer "comment_id"
78
+ t.integer "video_id"
79
+ t.text "content", null: false
80
+ t.string "kind"
81
+ t.index ["user_id"], name: "index_comments_on_user_id", using: :btree
82
+ t.index ["comment_id"], name: "index_comments_on_comment_id", using: :btree
83
+ end
84
+
85
+ create_table "courses", force: :cascade do |t|
86
+ t.string "title", null: false
87
+ t.interval "duration"
88
+ t.enum "types", enum_type: :types, array: true
89
+ t.datetime "created_at", null: false
90
+ t.datetime "updated_at", null: false
91
+ end
92
+
93
+ create_table "images", force: :cascade, id: false do |t|
94
+ t.string "file"
95
+ end
96
+
97
+ create_table "posts", force: :cascade do |t|
98
+ t.integer "author_id"
99
+ t.integer "activity_id"
100
+ t.string "title"
101
+ t.text "content"
102
+ t.enum "status", enum_type: :content_status
103
+ t.index ["author_id"], name: "index_posts_on_author_id", using: :btree
104
+ end
105
+
106
+ create_table "items", force: :cascade do |t|
107
+ t.string "name"
108
+ t.bigint "tag_ids", array: true, default: "{1}"
109
+ t.datetime "created_at", null: false
110
+ t.datetime "updated_at", null: false
111
+ end
112
+
113
+ create_table "users", force: :cascade do |t|
114
+ t.string "name", null: false
115
+ t.enum "role", enum_type: :roles, default: :visitor
116
+ t.datetime "created_at", null: false
117
+ t.datetime "updated_at", null: false
118
+ end
119
+
120
+ create_table "activities", force: :cascade do |t|
121
+ t.integer "author_id"
122
+ t.string "title"
123
+ t.boolean "active"
124
+ t.enum "kind", enum_type: :types
125
+ t.datetime "created_at", null: false
126
+ t.datetime "updated_at", null: false
127
+ end
128
+
129
+ create_table "questions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
130
+ t.string "title"
131
+ t.datetime "created_at", null: false
132
+ t.datetime "updated_at", null: false
133
+ end
134
+
135
+ create_table "activity_books", force: :cascade, inherits: :activities do |t|
136
+ t.text "description"
137
+ t.string "url"
138
+ t.boolean "activated"
139
+ end
140
+
141
+ create_table "activity_posts", force: :cascade, inherits: [:activities, :images] do |t|
142
+ t.integer "post_id"
143
+ t.string "url"
144
+ t.integer "activated"
145
+ end
146
+
147
+ create_table "activity_post_samples", force: :cascade, inherits: :activity_posts
148
+
149
+ create_table "question_selects", force: :cascade, inherits: :questions do |t|
150
+ t.string "options", array: true
151
+ end
152
+
153
+ # create_table "activity_blanks", force: :cascade, inherits: :activities
154
+
155
+ # create_table "activity_images", force: :cascade, inherits: [:activities, :images]
156
+
157
+ add_foreign_key "posts", "authors"
160
158
  end
159
+
160
+ ActiveRecord::Base.connection.schema_cache.clear!
data/spec/spec_helper.rb CHANGED
@@ -8,9 +8,13 @@ require 'byebug'
8
8
 
9
9
  Dotenv.load
10
10
 
11
- ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'])
12
- cache = ActiveRecord::Base.connection.schema_cache
11
+ ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'] || {
12
+ adapter: 'postgresql',
13
+ username: 'travis',
14
+ port: 5433,
15
+ })
13
16
 
17
+ cache = ActiveRecord::Base.connection.schema_cache
14
18
  cleaner = ->() do
15
19
  cache.instance_variable_set(:@inheritance_loaded, false)
16
20
  cache.instance_variable_set(:@inheritance_dependencies, {})
@@ -27,6 +31,7 @@ I18n.load_path << Pathname.pwd.join('spec', 'en.yml')
27
31
  RSpec.configure do |config|
28
32
  config.extend Mocks::CreateTable
29
33
  config.include Mocks::CacheQuery
34
+ config.include FactoryBot::Syntax::Methods
30
35
 
31
36
  config.formatter = :documentation
32
37
  config.color = true
@@ -41,10 +46,6 @@ RSpec.configure do |config|
41
46
  DatabaseCleaner.strategy = :transaction
42
47
  end
43
48
 
44
- config.before(:each, js: true) do
45
- DatabaseCleaner.strategy = :truncation
46
- end
47
-
48
49
  config.before(:each) do
49
50
  DatabaseCleaner.start
50
51
  end
@@ -51,10 +51,14 @@ RSpec.describe 'Arel' do
51
51
  context 'on default value' do
52
52
  let(:connection) { ActiveRecord::Base.connection }
53
53
 
54
- before(:context) { Torque::PostgreSQL.config.use_extended_defaults = true }
55
- after(:context) { Torque::PostgreSQL.config.use_extended_defaults = false }
56
54
  after { Author.reset_column_information }
57
55
 
56
+ it 'does not break the change column default value method' do
57
+ connection.add_column(:authors, :enabled, :boolean)
58
+ expect { connection.change_column_default(:authors, :enabled, { from: nil, to: true }) }.not_to raise_error
59
+ expect(Author.columns_hash['enabled'].default).to eq('true')
60
+ end
61
+
58
62
  it 'does not break jsonb' do
59
63
  expect { connection.add_column(:authors, :profile, :jsonb, default: []) }.not_to raise_error
60
64
  expect(Author.columns_hash['profile'].default).to eq('[]')
@@ -62,19 +66,37 @@ RSpec.describe 'Arel' do
62
66
 
63
67
  it 'works properly when column is an array' do
64
68
  expect { connection.add_column(:authors, :tag_ids, :bigint, array: true, default: []) }.not_to raise_error
65
- expect(Author.columns_hash['tag_ids'].default).to eq([])
69
+ expect(Author.new.tag_ids).to eq([])
70
+ end
71
+
72
+ it 'works with an array with enum values for a new enum' do
73
+ value = ['a', 'b']
74
+
75
+ expect do
76
+ connection.create_enum(:samples, %i[a b c d])
77
+ connection.add_column(:authors, :samples, :enum, enum_type: :samples, array: true, default: value)
78
+ end.not_to raise_error
79
+
80
+ expect(Author.new.samples).to eq(value)
66
81
  end
67
82
 
68
- it 'works with an array with enum values' do
83
+ it 'works with an array with enum values for an existing enum' do
69
84
  value = ['visitor', 'assistant']
70
- expect { connection.add_column(:authors, :roles, :roles, array: true, default: value) }.not_to raise_error
71
- expect(Author.columns_hash['roles'].default).to eq(value)
85
+ expect { connection.add_column(:authors, :roles, :enum, enum_type: :roles, array: true, default: value) }.not_to raise_error
86
+ expect(Author.new.roles).to eq(value)
72
87
  end
73
88
 
74
89
  it 'works with multi dimentional array' do
75
90
  value = [['1', '2'], ['3', '4']]
76
91
  expect { connection.add_column(:authors, :tag_ids, :string, array: true, default: value) }.not_to raise_error
77
- expect(Author.columns_hash['tag_ids'].default).to eq(value)
92
+ expect(Author.new.tag_ids).to eq(value)
93
+ end
94
+
95
+ it 'works with change column default value' do
96
+ value = ['2', '3']
97
+ connection.add_column(:authors, :tag_ids, :string, array: true)
98
+ expect { connection.change_column_default(:authors, :tag_ids, { from: nil, to: value }) }.not_to raise_error
99
+ expect(Author.new.tag_ids).to eq(value)
78
100
  end
79
101
  end
80
102
 
@@ -339,6 +339,20 @@ RSpec.describe 'BelongsToMany' do
339
339
  expect(entries.first.tags.size).to be_eql(5)
340
340
  end
341
341
 
342
+ it 'can preload records using ActiveRecord::Associations::Preloader' do
343
+ records = FactoryBot.create_list(:tag, 5)
344
+ subject.tags.concat(records)
345
+
346
+ entries = Video.all
347
+ arguments = { records: entries, associations: :tags, available_records: Tag.all.to_a }
348
+ ActiveRecord::Associations::Preloader.new(**arguments).call
349
+ entries = entries.load
350
+
351
+ expect(entries.size).to be_eql(1)
352
+ expect(entries.first.tags).to be_loaded
353
+ expect(entries.first.tags.size).to be_eql(5)
354
+ end
355
+
342
356
  it 'can joins records' do
343
357
  query = Video.all.joins(:tags)
344
358
  expect(query.to_sql).to match(/INNER JOIN "tags"/)
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  RSpec.describe 'Enum' do
4
4
  let(:connection) { ActiveRecord::Base.connection }
5
5
  let(:attribute_klass) { Torque::PostgreSQL::Attributes::EnumSet }
6
+ let(:table_definition) { ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition }
6
7
 
7
8
  def decorate(model, field, options = {})
8
9
  attribute_klass.include_on(model, :enum_set)
@@ -25,12 +26,13 @@ RSpec.describe 'Enum' do
25
26
  end
26
27
 
27
28
  context 'on table definition' do
28
- subject { ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.new('articles') }
29
+ subject { table_definition.new(connection, 'articles') }
29
30
 
30
31
  it 'can be defined as an array' do
31
- subject.enum(:content_status, array: true)
32
+ subject.enum(:content_status, array: true, enum_type: :content_status)
32
33
  expect(subject['content_status'].name).to be_eql('content_status')
33
- expect(subject['content_status'].type).to be_eql(:content_status)
34
+ expect(subject['content_status'].type).to be_eql(:enum)
35
+ expect(subject['content_status'].options[:enum_type]).to be_eql(:content_status)
34
36
 
35
37
  array = subject['content_status'].respond_to?(:options) \
36
38
  ? subject['content_status'].options[:array] \
@@ -43,14 +45,14 @@ RSpec.describe 'Enum' do
43
45
  context 'on schema' do
44
46
  it 'can be used on tables' do
45
47
  dump_io = StringIO.new
46
- checker = /t\.enum +"conflicts", +array: true, +subtype: :conflicts/
48
+ checker = /t\.enum +"conflicts", +array: true, +enum_type: "conflicts"/
47
49
  ActiveRecord::SchemaDumper.dump(connection, dump_io)
48
50
  expect(dump_io.string).to match checker
49
51
  end
50
52
 
51
53
  xit 'can have a default value as an array of symbols' do
52
54
  dump_io = StringIO.new
53
- checker = /t\.enum +"types", +default: \[:A, :B\], +array: true, +subtype: :types/
55
+ checker = /t\.enum +"types", +default: \[:A, :B\], +array: true, +enum_type: "types"/
54
56
  ActiveRecord::SchemaDumper.dump(connection, dump_io)
55
57
  expect(dump_io.string).to match checker
56
58
  end
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  RSpec.describe 'Enum' do
4
4
  let(:connection) { ActiveRecord::Base.connection }
5
5
  let(:attribute_klass) { Torque::PostgreSQL::Attributes::Enum }
6
+ let(:table_definition) { ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition }
6
7
 
7
8
  def decorate(model, field, options = {})
8
9
  attribute_klass.include_on(model, :pg_enum)
@@ -25,12 +26,6 @@ RSpec.describe 'Enum' do
25
26
  end
26
27
 
27
28
  context 'on migration' do
28
- it 'can be created' do
29
- connection.create_enum(:status, %i(foo bar))
30
- expect(connection.type_exists?(:status)).to be_truthy
31
- expect(connection.enum_values(:status)).to be_eql(['foo', 'bar'])
32
- end
33
-
34
29
  it 'can be deleted' do
35
30
  connection.create_enum(:status, %i(foo bar))
36
31
  expect(connection.type_exists?(:status)).to be_truthy
@@ -45,16 +40,6 @@ RSpec.describe 'Enum' do
45
40
  expect(connection.type_exists?(:status)).to be_truthy
46
41
  end
47
42
 
48
- it 'can have prefix' do
49
- connection.create_enum(:status, %i(foo bar), prefix: true)
50
- expect(connection.enum_values(:status)).to be_eql(['status_foo', 'status_bar'])
51
- end
52
-
53
- it 'can have suffix' do
54
- connection.create_enum(:status, %i(foo bar), suffix: 'tst')
55
- expect(connection.enum_values(:status)).to be_eql(['foo_tst', 'bar_tst'])
56
- end
57
-
58
43
  it 'inserts values at the end' do
59
44
  connection.create_enum(:status, %i(foo bar))
60
45
  connection.add_enum_values(:status, %i(baz qux))
@@ -84,74 +69,6 @@ RSpec.describe 'Enum' do
84
69
  end
85
70
  end
86
71
 
87
- context 'on table definition' do
88
- subject { ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.new('articles') }
89
-
90
- it 'has the enum method' do
91
- expect(subject).to respond_to(:enum)
92
- end
93
-
94
- it 'can be used in a single form' do
95
- subject.enum('content_status')
96
- expect(subject['content_status'].name).to be_eql('content_status')
97
- expect(subject['content_status'].type).to be_eql(:content_status)
98
- end
99
-
100
- it 'can be used in a multiple form' do
101
- subject.enum('foo', 'bar', 'baz', subtype: :content_status)
102
- expect(subject['foo'].type).to be_eql(:content_status)
103
- expect(subject['bar'].type).to be_eql(:content_status)
104
- expect(subject['baz'].type).to be_eql(:content_status)
105
- end
106
-
107
- it 'can have custom type' do
108
- subject.enum('foo', subtype: :content_status)
109
- expect(subject['foo'].name).to be_eql('foo')
110
- expect(subject['foo'].type).to be_eql(:content_status)
111
- end
112
-
113
- it 'raises StatementInvalid when type isn\'t defined' do
114
- subject.enum('foo')
115
- creation = connection.send(:schema_creation).accept subject
116
- expect{ connection.execute creation }.to raise_error(ActiveRecord::StatementInvalid)
117
- end
118
- end
119
-
120
- context 'on schema' do
121
- it 'dumps when has it' do
122
- dump_io = StringIO.new
123
- ActiveRecord::SchemaDumper.dump(connection, dump_io)
124
- expect(dump_io.string).to match /create_enum \"content_status\", \[/
125
- end
126
-
127
- it 'sorts the enum entries to better consistency' do
128
- dump_io = StringIO.new
129
- ActiveRecord::SchemaDumper.dump(connection, dump_io)
130
- items = dump_io.string.scan(/create_enum "(\w+)"/).flatten
131
- expect(items).to be_eql(items.sort)
132
- end
133
-
134
- it 'do not dump when has none' do
135
- connection.drop_type(:content_status, force: :cascade)
136
-
137
- dump_io = StringIO.new
138
- ActiveRecord::SchemaDumper.dump(connection, dump_io)
139
- expect(dump_io.string).not_to match /create_enum \"content_status\", \[/
140
- end
141
-
142
- it 'can be used on tables too' do
143
- dump_io = StringIO.new
144
- ActiveRecord::SchemaDumper.dump(connection, dump_io)
145
- expect(dump_io.string).to match /t\.enum +"status", +subtype: :content_status/
146
- end
147
-
148
- it 'can have a default value as symbol' do
149
- dump_io = StringIO.new
150
- ActiveRecord::SchemaDumper.dump(connection, dump_io)
151
- expect(dump_io.string).to match /t\.enum +"role", +default: :visitor, +subtype: :roles/
152
- end
153
- end
154
-
155
72
  context 'on value' do
156
73
  subject { Enum::ContentStatus }
157
74
  let(:values) { %w(created draft published archived) }
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe 'Interval' do
4
4
  let(:connection) { ActiveRecord::Base.connection }
5
+ let(:table_definition) { ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition }
5
6
 
6
7
  context 'on settings' do
7
8
  it 'must be set to ISO 8601' do
@@ -10,7 +11,7 @@ RSpec.describe 'Interval' do
10
11
  end
11
12
 
12
13
  context 'on table definition' do
13
- subject { ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.new('articles') }
14
+ subject { table_definition.new(connection, 'articles') }
14
15
 
15
16
  it 'has the interval method' do
16
17
  expect(subject).to respond_to(:interval)