Skip to content

Commit 76663a4

Browse files
committed
testserver: register SQL exec routes as overridable defaults
Move the SQL Statement Execution lifecycle routes from testserver.New into AddDefaultHandlers. Registering them in New made them permanent first-wins registrations, so tests could not install raw handlers for those paths (needed for malformed bodies, transport errors, or custom status codes the testsql fake does not model). As default handlers they are overridable: a raw Server.Handle for the same pattern registered before AddDefaultHandlers wins, as do test.toml stubs in acceptance. The libs/sqlexec HTTP tests opt in via a newServer helper. Co-authored-by: Isaac
1 parent d20b108 commit 76663a4

3 files changed

Lines changed: 26 additions & 13 deletions

File tree

libs/sqlexec/sqlexec_http_test.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ import (
1818
// test via server.HandleSQL matchers. Unlike the mock-interface unit tests they
1919
// exercise the full request/response JSON serialization, and unlike the
2020
// integration tests they are hermetic and run on every PR without a warehouse.
21+
// newServer returns a testserver with the default handlers installed, which is
22+
// where the SQL Statement Execution routes live (they delegate to the matchers
23+
// registered via server.HandleSQL).
24+
func newServer(t *testing.T) *testserver.Server {
25+
t.Helper()
26+
server := testserver.New(t)
27+
testserver.AddDefaultHandlers(server)
28+
return server
29+
}
30+
2131
func httpClient(t *testing.T, server *testserver.Server) *sqlexec.Client {
2232
t.Helper()
2333
w, err := databricks.NewWorkspaceClient(&databricks.Config{Host: server.URL, Token: "token"})
@@ -27,7 +37,7 @@ func httpClient(t *testing.T, server *testserver.Server) *sqlexec.Client {
2737
}
2838

2939
func TestHTTPExecuteSuccess(t *testing.T) {
30-
server := testserver.New(t)
40+
server := newServer(t)
3141
server.HandleSQL("SELECT 1 AS a, 2 AS b", func(testsql.Request) testsql.Result {
3242
return testsql.Result{Columns: []string{"a", "b"}, Rows: [][]string{{"1", "2"}}}
3343
})
@@ -39,7 +49,7 @@ func TestHTTPExecuteSuccess(t *testing.T) {
3949
}
4050

4151
func TestHTTPExecutePolls(t *testing.T) {
42-
server := testserver.New(t)
52+
server := newServer(t)
4353
server.HandleSQL("SELECT 1", func(testsql.Request) testsql.Result {
4454
return testsql.Result{Rows: [][]string{{"done"}}, Polls: 1}
4555
})
@@ -50,7 +60,7 @@ func TestHTTPExecutePolls(t *testing.T) {
5060
}
5161

5262
func TestHTTPExecutePaginatesChunks(t *testing.T) {
53-
server := testserver.New(t)
63+
server := newServer(t)
5464
server.HandleSQL("SELECT * FROM big", func(testsql.Request) testsql.Result {
5565
return testsql.Result{Rows: [][]string{{"0"}, {"1"}, {"2"}}, Chunks: 3}
5666
})
@@ -61,7 +71,7 @@ func TestHTTPExecutePaginatesChunks(t *testing.T) {
6171
}
6272

6373
func TestHTTPExecuteFailedReturns200(t *testing.T) {
64-
server := testserver.New(t)
74+
server := newServer(t)
6575
// A failed statement comes back as HTTP 200 with state=FAILED, not an HTTP
6676
// error; the engine must inspect the body and surface a *StatementError.
6777
server.HandleSQL("SELECT * FROM nope", func(testsql.Request) testsql.Result {
@@ -78,7 +88,7 @@ func TestHTTPExecuteFailedReturns200(t *testing.T) {
7888
}
7989

8090
func TestHTTPSubmitAndCancel(t *testing.T) {
81-
server := testserver.New(t)
91+
server := newServer(t)
8292
server.HandleSQL("SELECT 1", func(testsql.Request) testsql.Result {
8393
return testsql.Result{}
8494
})

libs/testserver/handlers.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,17 @@ func AddDefaultHandlers(server *Server) {
567567
return MapDelete(req.Workspace, req.Workspace.SqlWarehouses, req.Vars["warehouse_id"])
568568
})
569569

570+
// SQL Statement Execution lifecycle. Tests program these by registering
571+
// matchers via Server.HandleSQL / HandleSQLPattern (see statements.go).
572+
// They live here, not in New, so they act as overridable defaults: a test
573+
// that needs raw control over a SQL endpoint (malformed body, transport
574+
// error, custom status) can register its own handler for the same pattern
575+
// before calling AddDefaultHandlers, or stub it via test.toml in acceptance.
576+
server.Handle("POST", "/api/2.0/sql/statements", server.sqlExecuteStatement)
577+
server.Handle("GET", "/api/2.0/sql/statements/{statement_id}", server.sqlGetStatement)
578+
server.Handle("GET", "/api/2.0/sql/statements/{statement_id}/result/chunks/{chunk_index}", server.sqlGetStatementResultChunk)
579+
server.Handle("POST", "/api/2.0/sql/statements/{statement_id}/cancel", server.sqlCancelStatement)
580+
570581
server.Handle("GET", "/api/2.0/preview/sql/data_sources", func(req Request) any {
571582
return req.Workspace.SqlDataSourcesList(req)
572583
})

libs/testserver/server.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,14 +297,6 @@ Response.Body = '<response body here>'
297297
}
298298
})
299299

300-
// Register the SQL Statement Execution lifecycle endpoints. Tests program
301-
// these by registering matchers via Server.HandleSQL / HandleSQLPattern;
302-
// see statements.go.
303-
s.Handle("POST", "/api/2.0/sql/statements", s.sqlExecuteStatement)
304-
s.Handle("GET", "/api/2.0/sql/statements/{statement_id}", s.sqlGetStatement)
305-
s.Handle("GET", "/api/2.0/sql/statements/{statement_id}/result/chunks/{chunk_index}", s.sqlGetStatementResultChunk)
306-
s.Handle("POST", "/api/2.0/sql/statements/{statement_id}/cancel", s.sqlCancelStatement)
307-
308300
return s
309301
}
310302

0 commit comments

Comments
 (0)