Skip to content

Commit 815fa17

Browse files
committed
Improve migration and add migration tests
1 parent 83c3db5 commit 815fa17

4 files changed

+219
-54
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
Sequel.migration do
2+
up do
3+
alter_table :apps do
4+
add_column :service_binding_k8s_enabled, :boolean, default: false, null: false, if_not_exists: true
5+
add_column :file_based_vcap_services_enabled, :boolean, default: false, null: false, if_not_exists: true
6+
7+
unless @db.check_constraints(:apps).include?(:only_one_sb_feature_enabled)
8+
add_constraint(name: :only_one_sb_feature_enabled, if_not_exists: true) do
9+
Sequel.lit('NOT (service_binding_k8s_enabled AND file_based_vcap_services_enabled)')
10+
end
11+
end
12+
end
13+
end
14+
15+
down do
16+
alter_table :apps do
17+
drop_constraint :only_one_sb_feature_enabled if @db.check_constraints(:apps).include?(:only_one_sb_feature_enabled)
18+
drop_column :service_binding_k8s_enabled, if_exists: true
19+
drop_column :file_based_vcap_services_enabled, if_exists: true
20+
end
21+
end
22+
end

db/migrations/20250225132929_add_apps_service_binding_k8s_enabled_column.rb

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
require 'spec_helper'
2+
require 'migrations/helpers/migration_shared_context'
3+
4+
RSpec.describe 'migration to add service_binding_k8s_enabled column to apps table', isolation: :truncation, type: :migration do
5+
include_context 'migration' do
6+
let(:migration_filename) { '20250225132929_add_apps_file_based_service_binding_feature_columns.rb' }
7+
end
8+
9+
describe 'apps table' do
10+
subject(:run_migration) { Sequel::Migrator.run(db, migrations_path, target: current_migration_index, allow_missing_migration_files: true) }
11+
12+
describe 'up' do
13+
describe 'column service_binding_k8s_enabled' do
14+
it 'adds a column `service_binding_k8s_enabled`' do
15+
expect(db[:apps].columns).not_to include(:service_binding_k8s_enabled)
16+
run_migration
17+
expect(db[:apps].columns).to include(:service_binding_k8s_enabled)
18+
end
19+
20+
it 'sets the default value of existing entries to false' do
21+
db[:apps].insert(guid: 'existing_app_guid')
22+
run_migration
23+
expect(db[:apps].first(guid: 'existing_app_guid')[:service_binding_k8s_enabled]).to be(false)
24+
end
25+
26+
it 'sets the default value of new entries to false' do
27+
run_migration
28+
db[:apps].insert(guid: 'new_app_guid')
29+
expect(db[:apps].first(guid: 'new_app_guid')[:service_binding_k8s_enabled]).to be(false)
30+
end
31+
32+
it 'forbids null values' do
33+
run_migration
34+
expect { db[:apps].insert(guid: 'app_guid__nil', service_binding_k8s_enabled: nil) }.to raise_error(Sequel::NotNullConstraintViolation)
35+
end
36+
37+
context 'when it already exists' do
38+
before do
39+
db.add_column :apps, :service_binding_k8s_enabled, :boolean, default: false, null: false, if_not_exists: true
40+
end
41+
42+
it 'does not fail' do
43+
expect(db[:apps].columns).to include(:service_binding_k8s_enabled)
44+
expect { run_migration }.not_to raise_error
45+
expect(db[:apps].columns).to include(:service_binding_k8s_enabled)
46+
expect(db[:apps].columns).to include(:file_based_vcap_services_enabled)
47+
expect(db.check_constraints(:apps)).to include(:only_one_sb_feature_enabled)
48+
end
49+
end
50+
end
51+
52+
describe 'column file_based_vcap_services_enabled' do
53+
it 'adds a column `file_based_vcap_services_enabled`' do
54+
expect(db[:apps].columns).not_to include(:file_based_vcap_services_enabled)
55+
run_migration
56+
expect(db[:apps].columns).to include(:file_based_vcap_services_enabled)
57+
end
58+
59+
it 'sets the default value of existing entries to false' do
60+
db[:apps].insert(guid: 'existing_app_guid')
61+
run_migration
62+
expect(db[:apps].first(guid: 'existing_app_guid')[:file_based_vcap_services_enabled]).to be(false)
63+
end
64+
65+
it 'sets the default value of new entries to false' do
66+
run_migration
67+
db[:apps].insert(guid: 'new_app_guid')
68+
expect(db[:apps].first(guid: 'new_app_guid')[:file_based_vcap_services_enabled]).to be(false)
69+
end
70+
71+
it 'forbids null values' do
72+
run_migration
73+
expect { db[:apps].insert(guid: 'app_guid__nil', file_based_vcap_services_enabled: nil) }.to raise_error(Sequel::NotNullConstraintViolation)
74+
end
75+
76+
context 'when it already exists' do
77+
before do
78+
db.add_column :apps, :file_based_vcap_services_enabled, :boolean, default: false, null: false, if_not_exists: true
79+
end
80+
81+
it 'does not fail' do
82+
expect(db[:apps].columns).to include(:file_based_vcap_services_enabled)
83+
expect { run_migration }.not_to raise_error
84+
expect(db[:apps].columns).to include(:service_binding_k8s_enabled)
85+
expect(db[:apps].columns).to include(:file_based_vcap_services_enabled)
86+
expect(db.check_constraints(:apps)).to include(:only_one_sb_feature_enabled)
87+
end
88+
end
89+
end
90+
91+
describe 'check constraint' do
92+
it 'adds the check constraint' do
93+
expect(db.check_constraints(:apps)).not_to include(:only_one_sb_feature_enabled)
94+
run_migration
95+
expect(db.check_constraints(:apps)).to include(:only_one_sb_feature_enabled)
96+
end
97+
98+
it 'forbids setting both features to true' do
99+
run_migration
100+
expect { db[:apps].insert(guid: 'some_app', file_based_vcap_services_enabled: true, service_binding_k8s_enabled: true) }.to raise_error(Sequel::CheckConstraintViolation)
101+
end
102+
103+
context 'when it already exists' do
104+
before do
105+
db.add_column :apps, :service_binding_k8s_enabled, :boolean, default: false, null: false, if_not_exists: true
106+
db.add_column :apps, :file_based_vcap_services_enabled, :boolean, default: false, null: false, if_not_exists: true
107+
db.alter_table :apps do
108+
add_constraint(name: :only_one_sb_feature_enabled) do
109+
Sequel.lit('NOT (service_binding_k8s_enabled AND file_based_vcap_services_enabled)')
110+
end
111+
end
112+
end
113+
114+
it 'does not fail' do
115+
expect { run_migration }.not_to raise_error
116+
end
117+
end
118+
end
119+
end
120+
121+
describe 'down' do
122+
subject(:run_rollback) { Sequel::Migrator.run(db, migrations_path, target: current_migration_index - 1, allow_missing_migration_files: true) }
123+
124+
before do
125+
run_migration
126+
end
127+
128+
describe 'column service_binding_k8s_enabled' do
129+
it 'removes column `service_binding_k8s_enabled`' do
130+
expect(db[:apps].columns).to include(:service_binding_k8s_enabled)
131+
run_rollback
132+
expect(db[:apps].columns).not_to include(:service_binding_k8s_enabled)
133+
end
134+
135+
context 'when it does not exist' do
136+
before do
137+
db.drop_column :apps, :service_binding_k8s_enabled
138+
end
139+
140+
it 'does not fail' do
141+
expect(db[:apps].columns).not_to include(:service_binding_k8s_enabled)
142+
expect { run_rollback }.not_to raise_error
143+
expect(db[:apps].columns).not_to include(:service_binding_k8s_enabled)
144+
expect(db[:apps].columns).not_to include(:file_based_vcap_services_enabled)
145+
expect(db.check_constraints(:apps)).not_to include(:only_one_sb_feature_enabled)
146+
end
147+
end
148+
end
149+
150+
describe 'column file_based_vcap_services_enabled' do
151+
it 'removes column `file_based_vcap_services_enabled`' do
152+
expect(db[:apps].columns).to include(:file_based_vcap_services_enabled)
153+
run_rollback
154+
expect(db[:apps].columns).not_to include(:file_based_vcap_services_enabled)
155+
end
156+
157+
context 'when it does not exist' do
158+
before do
159+
db.drop_column :apps, :file_based_vcap_services_enabled
160+
end
161+
162+
it 'does not fail' do
163+
expect(db[:apps].columns).not_to include(:file_based_vcap_services_enabled)
164+
expect { run_rollback }.not_to raise_error
165+
expect(db[:apps].columns).not_to include(:service_binding_k8s_enabled)
166+
expect(db[:apps].columns).not_to include(:file_based_vcap_services_enabled)
167+
expect(db.check_constraints(:apps)).not_to include(:only_one_sb_feature_enabled)
168+
end
169+
end
170+
end
171+
172+
describe 'check constraint' do
173+
it 'removes the check constraint' do
174+
expect(db.check_constraints(:apps)).to include(:only_one_sb_feature_enabled)
175+
run_rollback
176+
expect(db.check_constraints(:apps)).not_to include(:only_one_sb_feature_enabled)
177+
end
178+
179+
context 'when it does not exist' do
180+
before do
181+
db.alter_table :apps do
182+
drop_constraint :only_one_sb_feature_enabled
183+
end
184+
end
185+
186+
it 'does not fail' do
187+
expect(db.check_constraints(:apps)).not_to include(:only_one_sb_feature_enabled)
188+
expect { run_rollback }.not_to raise_error
189+
expect(db[:apps].columns).not_to include(:service_binding_k8s_enabled)
190+
expect(db[:apps].columns).not_to include(:file_based_vcap_services_enabled)
191+
expect(db.check_constraints(:apps)).not_to include(:only_one_sb_feature_enabled)
192+
end
193+
end
194+
end
195+
end
196+
end
197+
end

spec/migrations/20250225132929_add_apps_service_binding_k8s_enabled_column_spec.rb

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)