-
Notifications
You must be signed in to change notification settings - Fork 29
/
dumper_spec.rb
134 lines (113 loc) · 4.26 KB
/
dumper_spec.rb
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
require 'spec_helper'
module TestDumper
module Middleware
module Dumper
module Initial
include Enableable
def after(env)
return unless middleware = enabled_middleware(TestDumper, env)
env.initial.unshift middleware.to_s
end
end
module Tables
include Enableable
def after(env)
return unless middleware = enabled_middleware(TestDumper, env)
env.dump.tables[middleware.to_s] = env.dump.tables.values.first.dup.tap {|t| t.pname = middleware.to_s }
env.dump.depends("things", middleware.to_s)
env.dump.depends(middleware.to_s, "other")
end
end
module Table
include Enableable
def after(env)
return unless middleware = enabled_middleware(TestDumper, env)
if column = env.table.columns.first
column.options[:option] = middleware.to_s
column.comments << "comment: #{middleware}"
end
if index = env.table.indexes.first
index.options[:option] = middleware.to_s
end
env.table.statements << "statement: #{middleware}"
env.table.trailer << "trailer: #{middleware}"
end
end
end
end
end
SchemaMonkey.register(TestDumper)
describe SchemaMonkey::Middleware::Dumper do
let(:migration) { ::ActiveRecord::Migration }
TestCustomType = SchemaDev::Rspec::Helpers.postgresql?
around(:each) do |example|
begin
migration.execute "CREATE TYPE custom_type AS ENUM ('a', 'b')";
example.run
ensure
migration.execute "DROP TYPE IF EXISTS custom_type CASCADE";
end
end if TestCustomType
before(:each) do
migration.create_table "things" do |t|
t.integer :column
t.index :column
end
migration.create_table "other" do |t|
t.references :thing
end
migration.add_foreign_key("other", "things")
migration.execute "CREATE TABLE custom_table ( my_column custom_type DEFAULT 'a'::custom_type NOT NULL)" if TestCustomType
end
context "column default expressions", postgresql: :only do
before(:each) do
migration.execute %Q{ALTER TABLE "things" ADD "defexpr" character varying DEFAULT substring((random())::text, 3, 6)}
end
Then { expect(dump use_middleware: false).to match(/\\"substring\\"\(\(random/) }
end
context TestDumper::Middleware::Dumper::Initial do
Then { expect(dump).to match(/Schema[.]define.*do\s+#{middleware}/) }
end
context TestDumper::Middleware::Dumper::Tables do
Then { expect(dump).to match(/create_table "other".*create_table "#{middleware}".*create_table "things"/m) }
context 'int PK handling in rails 5.2+', postgresql: :only, rails: ['>= 5.2.0'] do
before(:each) do
migration.create_table "inttable", id: :serial do |t|
end
end
Then { expect(dump).to_not match(/create_table "inttable", id: :serial.*default:/m) }
end
context 'expression index handling', postgresql: :only do
before(:each) do
migration.create_table "expressions" do |t|
t.string :field
t.string :column
t.index 'lower(field), id', name: 'index_expression_field'
t.index 'lower("column"), id', name: 'index_expression_column'
end
end
Then { expect(dump).to match(/index "lower.+field.+, id", :name=>"index_expression_field"/) }
Then { expect(dump).to match(/index "lower.+"column\\".+, id", :name=>"index_expression_column"/) }
end
end
context TestDumper::Middleware::Dumper::Table do
Then { expect(dump).to match(/t[.]integer.*:option=>"#{middleware}" \# comment: #{middleware}/) }
Then { expect(dump).to match(/statement: #{middleware}\s+end\s+(add_index.*)?\s+trailer: #{middleware}/) }
Then { expect(dump).to match(/could not dump table.*custom_table.*unknown type.*custom_type/mi) } if TestCustomType
Then { expect(dump).to match(/t[.]index.*:option=>"#{middleware}"/) }
end
private
def middleware
described_class
end
def dump(use_middleware: true)
begin
middleware.enable once:false if use_middleware
stream = StringIO.new
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
return stream.string
ensure
middleware.disable if use_middleware
end
end
end