Skip to content

Commit 02f9a78

Browse files
Capture load errors (#22)
* Capture load errors * Unwrap error * Line
1 parent dbcfc92 commit 02f9a78

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

bq/client.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package bq
22

33
import (
44
"context"
5+
"errors"
56
"log"
67

78
"cloud.google.com/go/bigquery"
@@ -145,5 +146,17 @@ func (c *Client) Load(ctx context.Context, ds bqiface.Dataset, name string, uri
145146
return err
146147
}
147148

148-
return status.Err()
149+
if status.Err() != nil {
150+
return jobErrors(status)
151+
}
152+
153+
return nil
154+
}
155+
156+
func jobErrors(status *bigquery.JobStatus) error {
157+
var err error
158+
for _, e := range status.Errors {
159+
err = errors.Join(err, e)
160+
}
161+
return err
149162
}

bq/client_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,3 +472,65 @@ func TestClient_Load(t *testing.T) {
472472
})
473473
}
474474
}
475+
476+
func TestClient_jobErrors(t *testing.T) {
477+
err1 := &bigquery.Error{
478+
Message: "Error1",
479+
}
480+
err2 := &bigquery.Error{
481+
Message: "Error2",
482+
}
483+
tests := []struct {
484+
name string
485+
status *bigquery.JobStatus
486+
wantErr bool
487+
wantNum int
488+
}{
489+
{
490+
name: "no-error",
491+
status: &bigquery.JobStatus{},
492+
wantErr: false,
493+
},
494+
{
495+
name: "one-error",
496+
status: &bigquery.JobStatus{
497+
Errors: []*bigquery.Error{err1},
498+
},
499+
wantErr: true,
500+
wantNum: 1,
501+
},
502+
{
503+
name: "multiple-errors",
504+
status: &bigquery.JobStatus{
505+
Errors: []*bigquery.Error{err1, err2},
506+
},
507+
wantErr: true,
508+
wantNum: 2,
509+
},
510+
}
511+
512+
for _, tt := range tests {
513+
t.Run(tt.name, func(t *testing.T) {
514+
err := jobErrors(tt.status)
515+
if (err != nil) != tt.wantErr {
516+
t.Fatalf("jobErrors() error = %v, wantErr = %v", err, tt.wantErr)
517+
}
518+
519+
if !tt.wantErr {
520+
return
521+
}
522+
523+
u, ok := err.(interface {
524+
Unwrap() []error
525+
})
526+
if !ok {
527+
t.Fatal("jobErrors() failed to cast returned error")
528+
}
529+
530+
gotNum := len(u.Unwrap())
531+
if gotNum != tt.wantNum {
532+
t.Fatalf("jobErrors() gotNum = %d, wantNum = %d", gotNum, tt.wantNum)
533+
}
534+
})
535+
}
536+
}

0 commit comments

Comments
 (0)