|
6 | 6 | let(:migration_filename) { '20251030100000_add_unique_constraint_to_sidecar_process_types.rb' } |
7 | 7 | end |
8 | 8 |
|
9 | | - let!(:app) { VCAP::CloudController::AppModel.make } |
10 | | - let!(:sidecar) { VCAP::CloudController::SidecarModel.make(app:) } |
11 | | - let!(:revision) { VCAP::CloudController::RevisionModel.make(app:) } |
12 | | - let!(:revision_sidecar) { VCAP::CloudController::RevisionSidecarModel.make(revision:) } |
| 9 | + let(:app_guid) { SecureRandom.uuid } |
| 10 | + let(:sidecar_guid) { SecureRandom.uuid } |
| 11 | + let(:revision_guid) { SecureRandom.uuid } |
| 12 | + let(:revision_sidecar_guid) { SecureRandom.uuid } |
13 | 13 |
|
14 | 14 | it 'removes duplicates, adds unique constraints, and is reversible' do |
| 15 | + db[:apps].insert(guid: app_guid, name: 'test-app') |
| 16 | + db[:sidecars].insert(guid: sidecar_guid, name: 'test-sidecar', command: 'command', app_guid: app_guid) |
| 17 | + db[:revisions].insert(guid: revision_guid, app_guid: app_guid) |
| 18 | + db[:revision_sidecars].insert(guid: revision_sidecar_guid, name: 'test-sidecar', command: 'command', revision_guid: revision_guid) |
| 19 | + |
15 | 20 | # ========================================================================================= |
16 | 21 | # SETUP: Create duplicate entries for both tables to test the de-duplication logic. |
17 | 22 | # ========================================================================================= |
18 | | - db[:sidecar_process_types].insert(sidecar_guid: sidecar.guid, type: 'web', app_guid: app.guid, guid: SecureRandom.uuid) |
19 | | - db[:sidecar_process_types].insert(sidecar_guid: sidecar.guid, type: 'web', app_guid: app.guid, guid: SecureRandom.uuid) |
20 | | - expect(db[:sidecar_process_types].where(sidecar_guid: sidecar.guid, type: 'web').count).to eq(2) |
| 23 | + db[:sidecar_process_types].insert(sidecar_guid: sidecar_guid, type: 'web', app_guid: app_guid, guid: SecureRandom.uuid) |
| 24 | + db[:sidecar_process_types].insert(sidecar_guid: sidecar_guid, type: 'web', app_guid: app_guid, guid: SecureRandom.uuid) |
| 25 | + expect(db[:sidecar_process_types].where(sidecar_guid: sidecar_guid, type: 'web').count).to eq(2) |
21 | 26 |
|
22 | | - db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar.guid, type: 'worker', guid: SecureRandom.uuid) |
23 | | - db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar.guid, type: 'worker', guid: SecureRandom.uuid) |
24 | | - expect(db[:revision_sidecar_process_types].where(revision_sidecar_guid: revision_sidecar.guid, type: 'worker').count).to eq(2) |
| 27 | + db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar_guid, type: 'worker', guid: SecureRandom.uuid) |
| 28 | + db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar_guid, type: 'worker', guid: SecureRandom.uuid) |
| 29 | + expect(db[:revision_sidecar_process_types].where(revision_sidecar_guid: revision_sidecar_guid, type: 'worker').count).to eq(2) |
25 | 30 |
|
26 | 31 | # ========================================================================================= |
27 | 32 | # UP MIGRATION: Run the migration to apply the unique constraints. |
|
31 | 36 | # ========================================================================================= |
32 | 37 | # ASSERT UP MIGRATION: Verify that duplicates are removed and constraints are enforced. |
33 | 38 | # ========================================================================================= |
34 | | - expect(db[:sidecar_process_types].where(sidecar_guid: sidecar.guid, type: 'web').count).to eq(1) |
| 39 | + expect(db[:sidecar_process_types].where(sidecar_guid: sidecar_guid, type: 'web').count).to eq(1) |
35 | 40 | expect(db.indexes(:sidecar_process_types)).to include(:sidecar_process_types_sidecar_guid_type_index) |
36 | | - expect { db[:sidecar_process_types].insert(sidecar_guid: sidecar.guid, type: 'web', app_guid: app.guid, guid: SecureRandom.uuid) }.to raise_error(Sequel::UniqueConstraintViolation) |
| 41 | + expect { db[:sidecar_process_types].insert(sidecar_guid: sidecar_guid, type: 'web', app_guid: app_guid, guid: SecureRandom.uuid) }.to raise_error(Sequel::UniqueConstraintViolation) |
37 | 42 |
|
38 | | - expect(db[:revision_sidecar_process_types].where(revision_sidecar_guid: revision_sidecar.guid, type: 'worker').count).to eq(1) |
| 43 | + expect(db[:revision_sidecar_process_types].where(revision_sidecar_guid: revision_sidecar_guid, type: 'worker').count).to eq(1) |
39 | 44 | expect(db.indexes(:revision_sidecar_process_types)).to include(:revision_sidecar_process_types_revision_sidecar_guid_type_index) |
40 | | - expect { db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar.guid, type: 'worker', guid: SecureRandom.uuid) }.to raise_error(Sequel::UniqueConstraintViolation) |
| 45 | + expect { db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar_guid, type: 'worker', guid: SecureRandom.uuid) }.to raise_error(Sequel::UniqueConstraintViolation) |
41 | 46 |
|
42 | 47 | # ========================================================================================= |
43 | 48 | # TEST IDEMPOTENCY: Running the migration again should not cause any errors. |
|
53 | 58 | # ASSERT DOWN MIGRATION: Verify that constraints are removed and duplicates can be re-inserted. |
54 | 59 | # ========================================================================================= |
55 | 60 | expect(db.indexes(:sidecar_process_types)).not_to include(:sidecar_process_types_sidecar_guid_type_index) |
56 | | - expect { db[:sidecar_process_types].insert(sidecar_guid: sidecar.guid, type: 'web', app_guid: app.guid, guid: SecureRandom.uuid) }.not_to raise_error |
| 61 | + expect { db[:sidecar_process_types].insert(sidecar_guid: sidecar_guid, type: 'web', app_guid: app_guid, guid: SecureRandom.uuid) }.not_to raise_error |
57 | 62 |
|
58 | 63 | expect(db.indexes(:revision_sidecar_process_types)).not_to include(:revision_sidecar_process_types_revision_sidecar_guid_type_index) |
59 | | - expect { db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar.guid, type: 'worker', guid: SecureRandom.uuid) }.not_to raise_error |
| 64 | + expect { db[:revision_sidecar_process_types].insert(revision_sidecar_guid: revision_sidecar_guid, type: 'worker', guid: SecureRandom.uuid) }.not_to raise_error |
60 | 65 | end |
61 | 66 | end |
0 commit comments