Skip to content

Commit 34b0451

Browse files
authored
Merge pull request #12 from database-playground/pan93412/dbp-47-return-detailed-errors-when-querying-sql-in-backend
feat: return detailed error in SQL Runner
2 parents 082bff9 + 9488186 commit 34b0451

File tree

4 files changed

+33
-51
lines changed

4 files changed

+33
-51
lines changed

internal/sqlrunner/models.go

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
package sqlrunner
22

3-
import "errors"
4-
5-
var (
6-
ErrQueryError = errors.New("query error")
7-
ErrSchemaError = errors.New("schema error")
8-
ErrBadPayload = errors.New("payload is invalid")
9-
ErrInternalError = errors.New("internal error")
3+
import (
4+
"fmt"
105
)
116

127
// QueryRequest is the request to the SQL Runner API.
@@ -34,27 +29,19 @@ type DataResponse struct {
3429
Rows [][]string `json:"rows"`
3530
}
3631

32+
const (
33+
ErrorCodeQueryError = "QUERY_ERROR"
34+
ErrorCodeSchemaError = "SCHEMA_ERROR"
35+
ErrorCodeBadPayload = "BAD_PAYLOAD"
36+
ErrorCodeInternalError = "INTERNAL_ERROR"
37+
)
38+
3739
// ErrorResponse is the error response from the SQL Runner API.
3840
type ErrorResponse struct {
3941
Message string `json:"message"`
4042
Code string `json:"code"`
4143
}
4244

43-
// ConvertHttpError converts the error response from
44-
// the SQL Runner API to a more specific error.
45-
func ConvertHttpError(errResp *ErrorResponse) error {
46-
if errResp == nil {
47-
return nil
48-
}
49-
50-
switch errResp.Code {
51-
case "QUERY_ERROR":
52-
return ErrQueryError
53-
case "SCHEMA_ERROR":
54-
return ErrSchemaError
55-
case "BAD_PAYLOAD":
56-
return ErrBadPayload
57-
default:
58-
return ErrInternalError
59-
}
45+
func (e ErrorResponse) Error() string {
46+
return fmt.Sprintf("%s: %s", e.Code, e.Message)
6047
}

internal/sqlrunner/sqlrunner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (s *SqlRunner) Query(ctx context.Context, schema, query string) (DataRespon
5656

5757
// check if success
5858
if respBody.ErrorResponse != nil {
59-
return DataResponse{}, ConvertHttpError(respBody.ErrorResponse)
59+
return DataResponse{}, respBody.ErrorResponse
6060
}
6161

6262
if respBody.SuccessResponse == nil {

internal/sqlrunner/sqlrunner_test.go

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,21 @@ package sqlrunner_test
33
import (
44
"context"
55
"errors"
6-
"os"
76
"testing"
87

9-
"github.com/database-playground/backend-v2/internal/config"
108
"github.com/database-playground/backend-v2/internal/sqlrunner"
9+
"github.com/database-playground/backend-v2/internal/testhelper"
1110
)
1211

13-
func newTestSqlRunner(t *testing.T) *sqlrunner.SqlRunner {
14-
t.Helper()
15-
16-
baseUri := os.Getenv("SQLRUNNER_BASE_URI")
17-
if baseUri == "" {
18-
t.Skip("SQLRUNNER_BASE_URI is not set")
19-
}
20-
21-
cfg := config.SqlRunnerConfig{
22-
URI: baseUri,
23-
}
24-
return sqlrunner.NewSqlRunner(cfg)
25-
}
26-
2712
func TestHealthz(t *testing.T) {
28-
s := newTestSqlRunner(t)
13+
s := testhelper.NewSQLRunnerClient(t)
2914
if !s.IsHealthy(context.Background()) {
3015
t.Error("Expected IsHealthy to return true, got false")
3116
}
3217
}
3318

3419
func TestQuery_Success(t *testing.T) {
35-
s := newTestSqlRunner(t)
20+
s := testhelper.NewSQLRunnerClient(t)
3621
data, err := s.Query(context.Background(), "CREATE TABLE dev(ID int); INSERT INTO dev VALUES(1);", "SELECT * FROM dev;")
3722
if err != nil {
3823
t.Fatalf("Expected success, got error: %v", err)
@@ -46,23 +31,33 @@ func TestQuery_Success(t *testing.T) {
4631
}
4732

4833
func TestQuery_QueryError(t *testing.T) {
49-
s := newTestSqlRunner(t)
34+
s := testhelper.NewSQLRunnerClient(t)
5035
_, err := s.Query(context.Background(), "CREATE TABLE dev(ID int); INSERT INTO dev VALUES(1);", "SELECT * FROM non_existing_table;")
5136
if err == nil || err.Error() == "" {
5237
t.Error("Expected query error, got nil")
5338
}
54-
if !errors.Is(err, sqlrunner.ErrQueryError) {
55-
t.Errorf("Expected QUERY_ERROR, got %v", err)
39+
40+
var errResp *sqlrunner.ErrorResponse
41+
if !errors.As(err, &errResp) {
42+
t.Errorf("Expected ErrorResponse, got %v", err)
43+
}
44+
if errResp.Code != sqlrunner.ErrorCodeQueryError {
45+
t.Errorf("Expected QUERY_ERROR, got %v", errResp.Code)
5646
}
5747
}
5848

5949
func TestQuery_SchemaError(t *testing.T) {
60-
s := newTestSqlRunner(t)
50+
s := testhelper.NewSQLRunnerClient(t)
6151
_, err := s.Query(context.Background(), "CREATE TABLE dev(ID int", "SELECT * FROM dev;")
6252
if err == nil || err.Error() == "" {
6353
t.Error("Expected schema error, got nil")
6454
}
65-
if !errors.Is(err, sqlrunner.ErrSchemaError) {
66-
t.Errorf("Expected SCHEMA_ERROR, got %v", err)
55+
56+
var errResp *sqlrunner.ErrorResponse
57+
if !errors.As(err, &errResp) {
58+
t.Errorf("Expected ErrorResponse, got %v", err)
59+
}
60+
if errResp.Code != sqlrunner.ErrorCodeSchemaError {
61+
t.Errorf("Expected SCHEMA_ERROR, got %v", errResp.Code)
6762
}
6863
}

internal/submission/submission_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func TestSubmitAnswer_Failed_UserQueryError(t *testing.T) {
155155
require.Equal(t, submission.StatusFailed, result.Status)
156156
require.Nil(t, result.QueryResult)
157157
require.NotNil(t, result.Error)
158-
require.Contains(t, *result.Error, "query error")
158+
require.Contains(t, *result.Error, "QUERY_ERROR")
159159
}
160160

161161
func TestSubmitAnswer_Failed_ReferenceQueryError(t *testing.T) {
@@ -471,7 +471,7 @@ func TestSubmitAnswer_EventAndSubmissionRecordGeneration(t *testing.T) {
471471
require.Equal(t, "SELECT * FROM nonexistent_table;", failedSubmission.SubmittedCode)
472472
require.Nil(t, failedSubmission.QueryResult) // Should be nil for failed queries
473473
require.NotNil(t, failedSubmission.Error)
474-
require.Contains(t, *failedSubmission.Error, "query error")
474+
require.Contains(t, *failedSubmission.Error, "QUERY_ERROR")
475475
require.NotZero(t, failedSubmission.SubmittedAt)
476476

477477
// Verify event count increased (should now have 2 events total)

0 commit comments

Comments
 (0)