@@ -115,6 +115,10 @@ var (
115
115
DSN : "trino://test@localhost:%s/tpch/sf1" ,
116
116
DockerPort : "8080/tcp" ,
117
117
},
118
+ "csvq" : {
119
+ // go test sets working directory to current package regardless of initial working directory
120
+ DSN : "csvq://./testdata/csvq" ,
121
+ },
118
122
}
119
123
cleanup bool
120
124
)
@@ -144,30 +148,21 @@ func TestMain(m *testing.M) {
144
148
}
145
149
146
150
for dbName , db := range dbs {
147
- var ok bool
148
- db .Resource , ok = pool .ContainerByName (db .RunOptions .Name )
149
- if ! ok {
150
- buildOpts := & dt.BuildOptions {
151
- ContextDir : "./testdata/docker" ,
152
- BuildArgs : db .BuildArgs ,
153
- }
154
- db .Resource , err = pool .BuildAndRunWithBuildOptions (buildOpts , db .RunOptions )
155
- if err != nil {
156
- log .Fatalf ("Could not start %s: %s" , dbName , err )
157
- }
158
- }
159
-
160
- hostPort := db .Resource .GetPort (db .DockerPort )
161
- db .URL , err = dburl .Parse (fmt .Sprintf (db .DSN , hostPort ))
151
+ dsn , hostPort := getConnInfo (dbName , db , pool )
152
+ db .URL , err = dburl .Parse (dsn )
162
153
if err != nil {
163
154
log .Fatalf ("Failed to parse %s URL %s: %v" , dbName , db .DSN , err )
164
155
}
165
156
166
157
if len (db .Exec ) != 0 {
158
+ readyDSN := db .ReadyDSN
167
159
if db .ReadyDSN == "" {
168
- db .ReadyDSN = db .DSN
160
+ readyDSN = db .DSN
161
+ }
162
+ if hostPort != "" {
163
+ readyDSN = fmt .Sprintf (db .ReadyDSN , hostPort )
169
164
}
170
- readyURL , err := dburl .Parse (fmt . Sprintf ( db . ReadyDSN , hostPort ) )
165
+ readyURL , err := dburl .Parse (readyDSN )
171
166
if err != nil {
172
167
log .Fatalf ("Failed to parse %s ready URL %s: %v" , dbName , db .ReadyDSN , err )
173
168
}
@@ -205,15 +200,46 @@ func TestMain(m *testing.M) {
205
200
// You can't defer this because os.Exit doesn't care for defer
206
201
if cleanup {
207
202
for _ , db := range dbs {
208
- if err := pool .Purge (db .Resource ); err != nil {
209
- log .Fatal ("Could not purge resource: " , err )
203
+ if db .Resource != nil {
204
+ if err := pool .Purge (db .Resource ); err != nil {
205
+ log .Fatal ("Could not purge resource: " , err )
206
+ }
210
207
}
211
208
}
212
209
}
213
210
214
211
os .Exit (code )
215
212
}
216
213
214
+ func getConnInfo (dbName string , db * Database , pool * dt.Pool ) (string , string ) {
215
+ if db .RunOptions == nil {
216
+ return db .DSN , ""
217
+ }
218
+
219
+ var ok bool
220
+ db .Resource , ok = pool .ContainerByName (db .RunOptions .Name )
221
+ if ok && ! db .Resource .Container .State .Running {
222
+ err := db .Resource .Close ()
223
+ if err != nil {
224
+ log .Fatalf ("Failed to clean up stale container %s: %s" , dbName , err )
225
+ }
226
+ ok = false
227
+ }
228
+ if ! ok {
229
+ buildOpts := & dt.BuildOptions {
230
+ ContextDir : "./testdata/docker" ,
231
+ BuildArgs : db .BuildArgs ,
232
+ }
233
+ var err error
234
+ db .Resource , err = pool .BuildAndRunWithBuildOptions (buildOpts , db .RunOptions )
235
+ if err != nil {
236
+ log .Fatalf ("Failed to start %s: %s" , dbName , err )
237
+ }
238
+ }
239
+ hostPort := db .Resource .GetPort (db .DockerPort )
240
+ return fmt .Sprintf (db .DSN , hostPort ), hostPort
241
+ }
242
+
217
243
func TestWriter (t * testing.T ) {
218
244
type testFunc struct {
219
245
label string
@@ -467,37 +493,48 @@ func TestCopy(t *testing.T) {
467
493
src : "select first_name, last_name, address_id, picture, email, store_id, active, username, password, last_update from staff" ,
468
494
dest : "staff_copy(first_name, last_name, address_id, picture, email, store_id, active, username, password, last_update)" ,
469
495
},
496
+ {
497
+ dbName : "csvq" ,
498
+ setupQueries : []setupQuery {
499
+ {query : "CREATE TABLE IF NOT EXISTS staff_copy AS SELECT * FROM `staff.csv` WHERE 0=1" , check : true },
500
+ },
501
+ src : "select first_name, last_name, address_id, email, store_id, active, username, password, last_update from staff" ,
502
+ dest : "staff_copy" ,
503
+ },
470
504
}
471
505
for _ , test := range testCases {
472
506
db , ok := dbs [test .dbName ]
473
507
if ! ok {
474
508
continue
475
509
}
476
510
477
- // TODO test copy from a different DB, maybe csvq?
478
- // TODO test copy from same DB
511
+ t .Run (test .dbName , func (t * testing.T ) {
512
+
513
+ // TODO test copy from a different DB, maybe csvq?
514
+ // TODO test copy from same DB
479
515
480
- for _ , q := range test .setupQueries {
481
- _ , err := db .DB .Exec (q .query )
482
- if q .check && err != nil {
483
- log .Fatalf ("Failed to run setup query `%s`: %v" , q .query , err )
516
+ for _ , q := range test .setupQueries {
517
+ _ , err := db .DB .Exec (q .query )
518
+ if q .check && err != nil {
519
+ t .Fatalf ("Failed to run setup query `%s`: %v" , q .query , err )
520
+ }
521
+ }
522
+ rows , err := pg .DB .Query (test .src )
523
+ if err != nil {
524
+ t .Fatalf ("Could not get rows to copy: %v" , err )
484
525
}
485
- }
486
- rows , err := pg .DB .Query (test .src )
487
- if err != nil {
488
- log .Fatalf ("Could not get rows to copy: %v" , err )
489
- }
490
526
491
- ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
492
- defer cancel ()
493
- var rlen int64 = 1
494
- n , err := drivers .Copy (ctx , db .URL , nil , nil , rows , test .dest )
495
- if err != nil {
496
- log .Fatalf ("Could not copy: %v" , err )
497
- }
498
- if n != rlen {
499
- log .Fatalf ("Expected to copy %d rows but got %d" , rlen , n )
500
- }
527
+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
528
+ defer cancel ()
529
+ var rlen int64 = 1
530
+ n , err := drivers .Copy (ctx , db .URL , nil , nil , rows , test .dest )
531
+ if err != nil {
532
+ t .Fatalf ("Could not copy: %v" , err )
533
+ }
534
+ if n != rlen {
535
+ t .Fatalf ("Expected to copy %d rows but got %d" , rlen , n )
536
+ }
537
+ })
501
538
}
502
539
}
503
540
0 commit comments