Commit 9d700020 authored by pbair's avatar pbair

Track schema versions using filenames

Move tracking of schema_migration.versions out of the structure.sql file
and into empty files within the db/schema_migrations directory, which
should prevent conflicts when multiple migrations are added at one time
parent 384c8fdc
# frozen_string_literal: true
# Patch to use COPY in db/structure.sql when populating schema_migrations table
# Patch to write version information as empty files under the db/schema_migrations directory
# This is intended to reduce potential for merge conflicts in db/structure.sql
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Database::PostgresqlAdapter::SchemaVersionsCopyMixin)
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Database::PostgresqlAdapter::DumpSchemaVersionsMixin)
# Patch to load version information from empty files under the db/schema_migrations directory
ActiveRecord::Tasks::PostgreSQLDatabaseTasks.prepend(Gitlab::Database::PostgresqlDatabaseTasks::LoadSchemaVersionsMixin)
......@@ -22917,1177 +22917,5 @@ ALTER TABLE ONLY public.u2f_registrations
ALTER TABLE public.product_analytics_events_experimental
ADD CONSTRAINT product_analytics_events_experimental_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.projects(id) ON DELETE CASCADE;
COPY "schema_migrations" (version) FROM STDIN;
20181228175414
20190102152410
20190103140724
20190104182041
20190107151020
20190108192941
20190109153125
20190114172110
20190115054215
20190115054216
20190115092821
20190116234221
20190124200344
20190130091630
20190131122559
20190204115450
20190206193120
20190211131150
20190214112022
20190215154930
20190218134158
20190218134209
20190219201635
20190220142344
20190220150130
20190222051615
20190225152525
20190225160301
20190228192410
20190301081611
20190301182457
20190312071108
20190312113229
20190312113634
20190313092516
20190315191339
20190320174702
20190322132835
20190322164830
20190325080727
20190325105715
20190325111602
20190325165127
20190326164045
20190327163904
20190329085614
20190402150158
20190402224749
20190403161806
20190404143330
20190404231137
20190408163745
20190409224933
20190410173409
20190412155659
20190412183653
20190414185432
20190415030217
20190415095825
20190415172035
20190416185130
20190416213556
20190416213615
20190416213631
20190418132125
20190418132750
20190418182545
20190419121952
20190419123057
20190422082247
20190423124640
20190424134256
20190426180107
20190429082448
20190430131225
20190430142025
20190506135337
20190506135400
20190511144331
20190513174947
20190514105711
20190515125613
20190516011213
20190516151857
20190516155724
20190517153211
20190520200123
20190520201748
20190521174505
20190522143720
20190523112344
20190524062810
20190524071727
20190524073827
20190527011309
20190527194830
20190527194900
20190528173628
20190528180441
20190529142545
20190530042141
20190530154715
20190531153110
20190602014139
20190603124955
20190604091310
20190604184643
20190605104727
20190605184422
20190606014128
20190606034427
20190606054649
20190606054742
20190606054832
20190606163724
20190606175050
20190606202100
20190607085356
20190607145325
20190607190856
20190607205656
20190610142825
20190611090827
20190611100201
20190611100202
20190611161641
20190611161642
20190612111201
20190612111404
20190613030606
20190613044655
20190613073003
20190613231640
20190617123615
20190618171120
20190619175843
20190620105427
20190620112608
20190621022810
20190621151636
20190623212503
20190624123615
20190625115224
20190625184066
20190626175626
20190627051902
20190627100221
20190627122264
20190628145246
20190628185000
20190628185004
20190628191740
20190702173936
20190703043358
20190703130053
20190703171157
20190703171555
20190703185326
20190709204413
20190709220014
20190709220143
20190710151229
20190711124721
20190711200053
20190711200508
20190711201818
20190712040400
20190712040412
20190712064021
20190715042813
20190715043944
20190715043954
20190715044501
20190715114644
20190715140740
20190715142138
20190715173819
20190715193142
20190715215532
20190715215549
20190716144222
20190719122333
20190719174505
20190722104947
20190722132830
20190722144316
20190723105753
20190723153247
20190724112147
20190725012225
20190725080128
20190725183432
20190726101050
20190726101133
20190729062536
20190729090456
20190729180447
20190731084415
20190801060809
20190801114109
20190801142441
20190801193427
20190802012622
20190802091750
20190802195602
20190802235445
20190805140353
20190806071559
20190807023052
20190808152507
20190809072552
20190812070645
20190814205640
20190815093936
20190815093949
20190816151221
20190819131155
20190819231552
20190820163320
20190821040941
20190822175441
20190822181528
20190822185441
20190823055948
20190826090628
20190826100605
20190827102026
20190827222124
20190828083843
20190828110802
20190828170945
20190828172831
20190829131130
20190830075508
20190830080123
20190830080626
20190830140240
20190901174200
20190902131045
20190902152329
20190902160015
20190903150358
20190903150435
20190904173203
20190904205212
20190905022045
20190905074652
20190905091812
20190905091831
20190905140605
20190905223800
20190905223900
20190906104555
20190907184714
20190909045845
20190909141517
20190910000130
20190910103144
20190910114843
20190910125852
20190910211526
20190910212256
20190911115056
20190911115109
20190911115207
20190911115222
20190911251732
20190912061145
20190912223232
20190913174707
20190913175827
20190914223900
20190917173107
20190918025618
20190918102042
20190918104212
20190918104222
20190918104731
20190918121135
20190919040324
20190919091300
20190919104119
20190919162036
20190919183411
20190920122420
20190920194925
20190920224341
20190924124627
20190924152703
20190925055714
20190925055902
20190926041216
20190926180443
20190926225633
20190927055500
20190927055540
20190927074328
20190929180751
20190929180813
20190929180827
20190930025655
20190930063627
20190930082942
20190930153535
20191001040549
20191001170300
20191002031332
20191002123516
20191003015155
20191003060227
20191003064615
20191003130045
20191003150045
20191003161031
20191003161032
20191003195218
20191003195620
20191003200045
20191003250045
20191003300045
20191003350045
20191004080818
20191004081520
20191004133612
20191004151428
20191007163701
20191007163736
20191008013056
20191008142331
20191008143850
20191008180203
20191008200204
20191009100244
20191009110124
20191009110757
20191009222222
20191010174846
20191011084019
20191013100213
20191014025629
20191014030134
20191014030730
20191014084150
20191014123159
20191014132931
20191015154408
20191016072826
20191016133352
20191016220135
20191017001326
20191017045817
20191017094449
20191017134513
20191017180026
20191017191341
20191021101942
20191022113635
20191023093207
20191023132005
20191023152913
20191024134020
20191025092748
20191026041447
20191026120008
20191026120112
20191026124116
20191028130054
20191028162543
20191028184740
20191029095537
20191029125305
20191029191901
20191030135044
20191030152934
20191030193050
20191030223057
20191031095636
20191031112603
20191101092917
20191103202505
20191104142124
20191104205020
20191105094558
20191105094625
20191105134413
20191105140942
20191105155113
20191105193652
20191106144901
20191106150931
20191107064946
20191107173446
20191107220314
20191108031900
20191108202723
20191111115229
20191111115431
20191111121500
20191111165017
20191111175230
20191112023159
20191112090226
20191112105448
20191112115247
20191112115317
20191112212815
20191112214305
20191112221821
20191112232338
20191114132259
20191114173508
20191114173602
20191114173624
20191114201118
20191114204343
20191115001123
20191115001843
20191115091425
20191115114032
20191115115043
20191115115522
20191118053631
20191118155702
20191118173522
20191118182722
20191118211629
20191119023952
20191119220425
20191119221041
20191119231621
20191120084627
20191120115530
20191120200015
20191121111621
20191121121947
20191121122856
20191121161018
20191121193110
20191122135327
20191122161519
20191123062354
20191123081456
20191124150431
20191125024005
20191125114345
20191125133353
20191125140458
20191126134210
20191127030005
20191127151619
20191127151629
20191127163053
20191127221608
20191128145231
20191128145232
20191128145233
20191128162854
20191129134844
20191129144630
20191129144631
20191202031812
20191202181924
20191203121729
20191204070713
20191204093410
20191204114127
20191204192726
20191205060723
20191205084057
20191205094702
20191205145647
20191205212923
20191205212924
20191206014412
20191206022133
20191206122926
20191207104000
20191208071111
20191208071112
20191208110214
20191209143606
20191209215316
20191210211253
20191212140117
20191212162434
20191213104838
20191213120427
20191213143656
20191213184609
20191214175727
20191216074800
20191216074802
20191216074803
20191216094119
20191216183531
20191216183532
20191217165641
20191217212348
20191218084115
20191218122457
20191218124915
20191218125015
20191218190253
20191218225624
20191223124940
20191225071320
20191227140254
20191229140154
20200102140148
20200102170221
20200103190741
20200103192859
20200103192914
20200103195205
20200104113850
20200106071113
20200106085831
20200107172020
20200108100603
20200108155731
20200108233040
20200109030418
20200109085206
20200109233938
20200110089001
20200110090153
20200110121314
20200110144316
20200110203532
20200113133352
20200113151354
20200114112932
20200114113341
20200114140305
20200114204949
20200115135132
20200115135234
20200116051619
20200116175538
20200117112554
20200117194830
20200117194840
20200117194850
20200117194900
20200120083607
20200121132641
20200121192942
20200121194000
20200121194048
20200121194154
20200121200203
20200122123016
20200122144759
20200122161638
20200123040535
20200123045415
20200123090839
20200123091422
20200123091622
20200123091734
20200123091854
20200123155929
20200124053531
20200124110831
20200124143014
20200127090233
20200127111840
20200128105731
20200128132510
20200128133510
20200128134110
20200128141125
20200128184209
20200128210353
20200129034515
20200129035446
20200129035708
20200129133716
20200129172428
20200130134335
20200130145430
20200130161817
20200131140428
20200131181354
20200131191754
20200202100932
20200203015140
20200203025400
20200203025602
20200203025619
20200203025744
20200203025801
20200203025821
20200203104214
20200203173508
20200203183508
20200203232433
20200204070729
20200204113223
20200204113224
20200204113225
20200204131054
20200204131831
20200205143231
20200206091544
20200206112850
20200206135203
20200206141511
20200207062728
20200207090921
20200207132752
20200207151640
20200207182131
20200207184023
20200207185149
20200209131152
20200210062432
20200210092405
20200210135504
20200210184410
20200210184420
20200211152410
20200211155000
20200211155100
20200211155539
20200211174946
20200212014653
20200212052620
20200212133945
20200212134201
20200213093702
20200213100530
20200213155311
20200213204737
20200213220159
20200213220211
20200213224220
20200214025454
20200214034836
20200214085940
20200214214934
20200215222507
20200215225103
20200217210353
20200217223651
20200217225719
20200218113721
20200219105209
20200219133859
20200219135440
20200219141307
20200219142522
20200219183456
20200219184219
20200219193058
20200219193117
20200220115023
20200220180944
20200221023320
20200221074028
20200221100514
20200221105436
20200221142216
20200221144534
20200222055543
20200224020219
20200224163804
20200224185814
20200225111018
20200225123228
20200226100614
20200226100624
20200226100634
20200226124757
20200226162156
20200226162239
20200226162634
20200226162723
20200227140242
20200227164113
20200227165129
20200228160542
20200229171700
20200302142052
20200302152516
20200303055348
20200303074328
20200303181648
20200304023245
20200304023851
20200304024025
20200304024042
20200304085423
20200304090155
20200304121828
20200304121844
20200304124406
20200304160800
20200304160801
20200304160823
20200304211738
20200305020458
20200305020459
20200305082754
20200305082858
20200305121159
20200305151736
20200305200641
20200306095654
20200306160521
20200306170211
20200306170321
20200306170531
20200306192548
20200306193236
20200309140540
20200309162244
20200309195209
20200309195710
20200310075115
20200310123229
20200310132654
20200310133822
20200310135818
20200310135823
20200310145304
20200310215714
20200311074438
20200311082301
20200311084025
20200311093210
20200311094020
20200311130802
20200311141053
20200311141943
20200311154110
20200311165635
20200311192351
20200311214912
20200312053852
20200312125121
20200312134637
20200312160532
20200312163407
20200313101649
20200313123934
20200313202430
20200313203525
20200313203550
20200313204021
20200314060834
20200316111759
20200316162648
20200316173312
20200317110602
20200317142110
20200318140400
20200318152134
20200318162148
20200318163148
20200318164448
20200318165448
20200318175008
20200318183553
20200319071702
20200319123041
20200319124127
20200319203901
20200320112455
20200320123839
20200320212400
20200323011225
20200323011955
20200323071918
20200323074147
20200323075043
20200323080714
20200323122201
20200323134519
20200324093258
20200324115359
20200325094612
20200325104755
20200325104756
20200325104833
20200325104834
20200325111432
20200325152327
20200325160952
20200325162730
20200325183636
20200326114443
20200326122700
20200326124443
20200326134443
20200326135443
20200326144443
20200326145443
20200330074719
20200330121000
20200330123739
20200330132913
20200330203826
20200330203837
20200331103637
20200331113728
20200331113738
20200331132103
20200331195952
20200331220930
20200401091051
20200401095430
20200401211005
20200402001106
20200402115013
20200402115623
20200402123926
20200402124802
20200402135250
20200402185044
20200403132349
20200403184110
20200403185127
20200403185422
20200406095930
20200406100909
20200406102111
20200406102120
20200406132529
20200406135648
20200406141452
20200406192059
20200406193427
20200407094005
20200407094923
20200407120000
20200407121321
20200407171133
20200407171417
20200407182205
20200407222647
20200408110856
20200408125046
20200408132152
20200408133211
20200408153842
20200408154331
20200408154349
20200408154411
20200408154428
20200408154455
20200408154533
20200408154604
20200408154624
20200408175424
20200408212219
20200409085956
20200409105455
20200409105456
20200409211607
20200410104828
20200410232012
20200411125656
20200413072059
20200413230056
20200414112444
20200414114611
20200414115801
20200414144547
20200415153154
20200415160722
20200415161021
20200415161206
20200415192656
20200415203024
20200416005331
20200416111111
20200416120128
20200416120354
20200417044453
20200417075843
20200417145946
20200420092011
20200420094444
20200420104303
20200420104323
20200420115948
20200420141733
20200420162730
20200420172113
20200420172752
20200420172927
20200420201933
20200421054930
20200421054948
20200421092907
20200421111005
20200421195234
20200421233150
20200422091541
20200422213749
20200423075720
20200423080334
20200423080607
20200423081409
20200423081441
20200423081519
20200423101529
20200424043515
20200424050250
20200424101920
20200424102023
20200424135319
20200427064130
20200428134356
20200429001827
20200429002150
20200429015603
20200429023324
20200429181335
20200429181955
20200429182245
20200430103158
20200430123614
20200430130048
20200430174637
20200504191813
20200504200709
20200505164958
20200505171834
20200505172405
20200506085748
20200506125731
20200506154421
20200507221434
20200508021128
20200508050301
20200508091106
20200508140959
20200508203901
20200509203901
20200510181937
20200510182218
20200510182556
20200510182824
20200510183128
20200511080113
20200511083541
20200511092246
20200511092505
20200511092714
20200511115430
20200511115431
20200511121549
20200511121610
20200511121620
20200511130129
20200511130130
20200511145545
20200511162057
20200511162115
20200511181027
20200511191027
20200511208012
20200511220023
20200512085150
20200512160004
20200512164334
20200512195442
20200513160930
20200513171959
20200513224143
20200513234502
20200513235347
20200513235532
20200514000009
20200514000132
20200514000340
20200515152649
20200515153633
20200515155620
20200518091745
20200518114540
20200518133123
20200519074709
20200519101002
20200519115908
20200519141534
20200519171058
20200519194042
20200519201128
20200520103514
20200521022725
20200521225327
20200521225337
20200521225346
20200522205606
20200522235146
20200524104346
20200525114553
20200525121014
20200525144525
20200526000407
20200526013844
20200526115436
20200526120714
20200526142550
20200526153844
20200526164946
20200526164947
20200526193555
20200526231421
20200527092027
20200527094322
20200527095401
20200527135313
20200527151413
20200527152116
20200527152657
20200527170649
20200527211000
20200527211605
20200528054112
20200528123703
20200528125905
20200528171933
20200601120434
20200601210148
20200602013900
20200602013901
20200602143020
20200603073101
20200603180338
20200604001128
20200604143628
20200604145731
20200604174544
20200604174558
20200605003204
20200605093113
20200605160806
20200605160836
20200605160851
20200607223047
20200607235435
20200608072931
20200608075553
20200608195222
20200608203426
20200608205813
20200608212030
20200608212435
20200608212549
20200608212652
20200608212807
20200608212824
20200608214008
20200609002841
20200609012539
20200609142506
20200609142507
20200609142508
20200609212701
20200610130002
20200613104045
20200615083635
20200615111857
20200615121217
20200615123055
20200615141554
20200615193524
20200615232735
20200615234047
20200616124338
20200616145031
20200617000757
20200617001001
20200617001118
20200617001637
20200617001848
20200617002030
20200617150041
20200617205000
20200618105638
20200618134223
20200618134723
20200618152212
20200619000316
20200619154527
20200619154528
20200622040750
20200622070606
20200622070620
20200622095419
20200622103836
20200622104923
20200622235737
20200623000148
20200623000320
20200623073431
20200623090030
20200623121135
20200623141217
20200623141544
20200623142159
20200623170000
20200623185440
20200624075411
20200624142107
20200624142207
20200624222443
20200625045442
20200625082258
20200625113337
20200625174052
20200625190458
20200626060151
20200626130220
20200628210938
20200629192638
20200630091656
20200630110826
20200701064756
20200701070435
20200701091253
20200701093859
20200701190523
20200701205710
20200701221303
20200702123805
20200702201039
20200703035021
20200703064117
20200703121557
20200703124823
20200703125016
20200703154822
20200703165434
20200704143633
20200704161600
20200706005325
20200706035141
20200706154619
20200706170536
20200707071941
20200707094341
20200707095849
20200708080631
20200709101408
20200710102418
20200710102846
20200710105332
20200710130234
20200712084655
20200712235622
20200713071042
20200713141854
20200713152443
20200714075739
20200715124210
20200715135130
20200715202659
20200716044023
20200716120000
20200716120419
20200716145156
20200718040100
20200718040200
20200718040300
20200720154123
20200722084623
\.
-- schema_migrations.version information is no longer stored in this file,
-- but instead tracked in the db/schema_migrations directory
......@@ -3,24 +3,20 @@
module Gitlab
module Database
module PostgresqlAdapter
module SchemaVersionsCopyMixin
module DumpSchemaVersionsMixin
extend ActiveSupport::Concern
def dump_schema_information # :nodoc:
versions = schema_migration.all_versions
copy_versions_sql(versions) if versions.any?
touch_version_files(versions) if versions.any?
nil
end
private
def copy_versions_sql(versions)
sm_table = quote_table_name(schema_migration.table_name)
sql = +"COPY #{sm_table} (version) FROM STDIN;\n"
sql << versions.map { |v| Integer(v) }.sort.join("\n")
sql << "\n\\.\n"
sql
def touch_version_files(versions)
Gitlab::Database::SchemaVersionFiles.touch_all(versions)
end
end
end
......
# frozen_string_literal: true
module Gitlab
module Database
module PostgresqlDatabaseTasks
module LoadSchemaVersionsMixin
extend ActiveSupport::Concern
def structure_load(*args)
super(*args)
load_version_files
end
private
def load_version_files
Gitlab::Database::SchemaVersionFiles.load_all
end
end
end
end
end
......@@ -23,6 +23,10 @@ module Gitlab
structure.gsub!(/\n{3,}/, "\n\n")
io << structure
io << <<~MSG
-- schema_migrations.version information is no longer stored in this file,
-- but instead tracked in the db/schema_migrations directory
MSG
nil
end
......
# frozen_string_literal: true
module Gitlab
module Database
class SchemaVersionFiles
SCHEMA_DIRECTORY = "db/schema_migrations"
def self.touch_all(versions)
FileUtils.rm_rf(schema_dirpath)
FileUtils.mkdir_p(schema_dirpath)
versions.each do |version|
FileUtils.touch(schema_dirpath.join(version))
end
end
def self.load_all
version_filenames = find_version_filenames
return if version_filenames.empty?
values = version_filenames.map { |vf| "('#{connection.quote_string(vf)}')" }
connection.execute(<<~SQL)
INSERT INTO schema_migrations (version)
VALUES #{values.join(",")}
ON CONFLICT DO NOTHING
SQL
end
def self.schema_dirpath
@schema_dirpath ||= Rails.root.join(SCHEMA_DIRECTORY)
end
def self.find_version_filenames
Dir.glob("20[0-9][0-9]*", base: schema_dirpath)
end
def self.connection
ActiveRecord::Base.connection
end
end
end
end
......@@ -77,19 +77,3 @@ ALTER TABLE ONLY public.abuse_reports
CREATE INDEX index_abuse_reports_on_user_id ON public.abuse_reports USING btree (user_id);
INSERT INTO "schema_migrations" (version) VALUES
('20200305121159'),
('20200306095654'),
('20200306160521'),
('20200306170211'),
('20200306170321'),
('20200306170531'),
('20200309140540'),
('20200309195209'),
('20200309195710'),
('20200310132654'),
('20200310135823');
......@@ -27,16 +27,5 @@ ALTER TABLE ONLY public.abuse_reports
CREATE INDEX index_abuse_reports_on_user_id ON public.abuse_reports USING btree (user_id);
INSERT INTO "schema_migrations" (version) VALUES
('20200305121159'),
('20200306095654'),
('20200306160521'),
('20200306170211'),
('20200306170321'),
('20200306170531'),
('20200309140540'),
('20200309195209'),
('20200309195710'),
('20200310132654'),
('20200310135823');
-- schema_migrations.version information is no longer stored in this file,
-- but instead tracked in the db/schema_migrations directory
......@@ -2,9 +2,8 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::PostgresqlAdapter::SchemaVersionsCopyMixin do
describe Gitlab::Database::PostgresqlAdapter::DumpSchemaVersionsMixin do
let(:schema_migration) { double('schem_migration', table_name: table_name, all_versions: versions) }
let(:versions) { %w(5 2 1000 200 4 93 2) }
let(:table_name) { "schema_migrations" }
let(:instance) do
......@@ -13,30 +12,25 @@ RSpec.describe Gitlab::Database::PostgresqlAdapter::SchemaVersionsCopyMixin do
before do
allow(instance).to receive(:schema_migration).and_return(schema_migration)
allow(instance).to receive(:quote_table_name).with(table_name).and_return("\"#{table_name}\"")
end
subject { instance.dump_schema_information }
it 'uses COPY FROM STDIN' do
expect(subject.split("\n").first).to match(/COPY "schema_migrations" \(version\) FROM STDIN;/)
end
context 'when version files exist' do
let(:versions) { %w(5 2 1000 200 4 93 2) }
it 'contains a sorted list of versions by their numeric value' do
version_lines = subject.split("\n")[1..-2].map(&:to_i)
it 'touches version files' do
expect(Gitlab::Database::SchemaVersionFiles).to receive(:touch_all).with(versions)
expect(version_lines).to eq(versions.map(&:to_i).sort)
instance.dump_schema_information
end
it 'contains a end-of-data marker' do
expect(subject).to end_with("\\.\n")
end
context 'with non-Integer versions' do
let(:versions) { %w(5 2 4 abc) }
context 'when version files do not exist' do
let(:versions) { [] }
it 'does not touch version files' do
expect(Gitlab::Database::SchemaVersionFiles).not_to receive(:touch_all)
it 'raises an error' do
expect { subject }.to raise_error(/invalid value for Integer/)
instance.dump_schema_information
end
end
end
# frozen_string_literal: true
require 'spec_helper'
describe Gitlab::Database::SchemaVersionFiles do
describe '.touch_all' do
let(:versions) { %w[123 456 890] }
it 'touches a file for each version given' do
Dir.mktmpdir do |tmpdir|
schema_dirpath = Pathname.new(tmpdir).join("test")
FileUtils.mkdir_p(schema_dirpath)
old_version_filepath = schema_dirpath.join("001")
FileUtils.touch(old_version_filepath)
expect(File.exist?(old_version_filepath)).to be(true)
allow(described_class).to receive(:schema_dirpath).and_return(schema_dirpath)
described_class.touch_all(versions)
expect(File.exist?(old_version_filepath)).to be(false)
versions.each do |version|
version_filepath = schema_dirpath.join(version)
expect(File.exist?(version_filepath)).to be(true)
end
end
end
end
describe '.load_all' do
let(:connection) { double('connection') }
before do
allow(described_class).to receive(:connection).and_return(connection)
allow(described_class).to receive(:find_version_filenames).and_return(filenames)
end
context 'when there are no version files' do
let(:filenames) { [] }
it 'does nothing' do
expect(connection).not_to receive(:quote_string)
expect(connection).not_to receive(:execute)
described_class.load_all
end
end
context 'when there are version files' do
let(:filenames) { %w[123 456 789] }
it 'inserts the missing versions into schema_migrations' do
filenames.each do |filename|
expect(connection).to receive(:quote_string).with(filename).and_return(filename)
end
expect(connection).to receive(:execute).with(<<~SQL)
INSERT INTO schema_migrations (version)
VALUES ('123'),('456'),('789')
ON CONFLICT DO NOTHING
SQL
described_class.load_all
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment