Skip to content

Commit 4034054

Browse files
authored
Merge pull request #14 from dpordomingo/tests
Add some tests to be used by the CI
2 parents 67246bb + fe788ec commit 4034054

File tree

10 files changed

+149
-9
lines changed

10 files changed

+149
-9
lines changed

server/common_test.go

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package server_test
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"io"
7+
"io/ioutil"
8+
"net/http"
9+
10+
"github.com/stretchr/testify/suite"
11+
)
12+
13+
func GetResponse(method string, path string, body io.Reader) (*http.Response, error) {
14+
req, err := http.NewRequest(method, path, body)
15+
if err != nil {
16+
return nil, fmt.Errorf("it should be possible to build a request; %s", err.Error())
17+
}
18+
19+
cli := &http.Client{}
20+
resp, err := cli.Do(req)
21+
if err != nil {
22+
return nil, fmt.Errorf("the server should answer with a response; %s", err.Error())
23+
}
24+
25+
return resp, nil
26+
}
27+
28+
type ClientTestSuite struct {
29+
suite.Suite
30+
}
31+
32+
func (c *ClientTestSuite) AssertResponseBody(resp *http.Response, expectedContent string, msg string) {
33+
c.Require().NotNil(resp, "the response body should not be nil")
34+
respBody, err := ioutil.ReadAll(resp.Body)
35+
c.Require().Nil(err, "the response body should be readable")
36+
37+
defer resp.Body.Close()
38+
c.Equal(expectedContent, string(respBody), msg)
39+
}
40+
41+
func (c *ClientTestSuite) AssertResponseStatus(resp *http.Response, expectedStatus int, msg string) {
42+
c.Require().NotNil(resp, "the response body should not be nil")
43+
c.Equal(expectedStatus, resp.StatusCode, fmt.Sprintf("status should be %d; %s", expectedStatus, msg))
44+
}
45+
46+
func (c *ClientTestSuite) AssertResponseBodyStatus(resp *http.Response, expectedStatus int, expectedContent string, msg string) {
47+
c.AssertResponseBody(resp, expectedContent, msg)
48+
c.AssertResponseStatus(resp, expectedStatus, "")
49+
}
50+
51+
type mockDB struct{}
52+
53+
func (db *mockDB) Close() error {
54+
return nil
55+
}
56+
57+
func (db *mockDB) Query(query string, args ...interface{}) (*sql.Rows, error) {
58+
return nil, nil
59+
}

server/handler/query.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"github.com/src-d/gitbase-playground/server/serializer"
12+
"github.com/src-d/gitbase-playground/server/service"
1213
"gopkg.in/bblfsh/sdk.v1/uast"
1314

1415
"github.com/go-sql-driver/mysql"
@@ -46,7 +47,7 @@ func genericVals(colTypes []string) []interface{} {
4647

4748
// Query returns a function that forwards an SQL query to gitbase and returns
4849
// the rows as JSON
49-
func Query(db *sql.DB) RequestProcessFunc {
50+
func Query(db service.SQLDB) RequestProcessFunc {
5051
return func(r *http.Request) (*serializer.Response, error) {
5152
var queryRequest queryRequest
5253
body, err := ioutil.ReadAll(r.Body)

server/handler/query_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/src-d/gitbase-playground/server/handler"
1313
"github.com/src-d/gitbase-playground/server/serializer"
14+
"github.com/src-d/gitbase-playground/server/service"
1415

1516
"github.com/kelseyhightower/envconfig"
1617
"github.com/pressly/lg"
@@ -28,11 +29,11 @@ type appConfig struct {
2829

2930
type QuerySuite struct {
3031
suite.Suite
31-
db *sql.DB
32+
db service.SQLDB
3233
handler http.Handler
3334
}
3435

35-
func setupDB(require *require.Assertions) *sql.DB {
36+
func setupDB(require *require.Assertions) service.SQLDB {
3637
var conf appConfig
3738
envconfig.MustProcess("GITBASEPG", &conf)
3839

server/handler/tables.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package handler
22

33
import (
4-
"database/sql"
54
"net/http"
65
"strings"
76

87
"github.com/src-d/gitbase-playground/server/serializer"
8+
"github.com/src-d/gitbase-playground/server/service"
99
)
1010

1111
// Tables returns a function that calls /query with the SQL "SHOW TABLES"
12-
func Tables(db *sql.DB) RequestProcessFunc {
12+
func Tables(db service.SQLDB) RequestProcessFunc {
1313
return func(r *http.Request) (*serializer.Response, error) {
1414
req, _ := http.NewRequest("POST", "/query",
1515
strings.NewReader(`{ "query": "SHOW TABLES" }`))

server/handler/tables_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package handler_test
22

33
import (
4-
"database/sql"
54
"net/http"
65
"net/http/httptest"
76
"testing"
87

98
"github.com/sirupsen/logrus"
109
"github.com/src-d/gitbase-playground/server/handler"
10+
"github.com/src-d/gitbase-playground/server/service"
1111

1212
"github.com/pressly/lg"
1313
"github.com/stretchr/testify/suite"
@@ -18,7 +18,7 @@ import (
1818

1919
type TablesSuite struct {
2020
suite.Suite
21-
db *sql.DB
21+
db service.SQLDB
2222
handler http.Handler
2323
}
2424

server/router.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package server
22

33
import (
4-
"database/sql"
54
"net/http"
65

76
"github.com/src-d/gitbase-playground/server/handler"
7+
"github.com/src-d/gitbase-playground/server/service"
88

99
"github.com/go-chi/chi"
1010
"github.com/go-chi/chi/middleware"
@@ -18,7 +18,7 @@ func Router(
1818
logger *logrus.Logger,
1919
static *handler.Static,
2020
version string,
21-
db *sql.DB,
21+
db service.SQLDB,
2222
) http.Handler {
2323

2424
// cors options

server/router_test.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package server_test
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"net/http"
7+
"net/http/httptest"
8+
"testing"
9+
10+
"github.com/src-d/gitbase-playground/server"
11+
"github.com/src-d/gitbase-playground/server/handler"
12+
"github.com/src-d/gitbase-playground/server/service"
13+
14+
"github.com/stretchr/testify/suite"
15+
)
16+
17+
func TestRouterTestSuite(t *testing.T) {
18+
suite.Run(t, new(RouterTestSuite))
19+
}
20+
21+
type RouterTestSuite struct {
22+
ClientTestSuite
23+
router http.Handler
24+
server *httptest.Server
25+
db service.SQLDB
26+
}
27+
28+
const version = "test-version"
29+
30+
func (s *RouterTestSuite) SetupSuite() {
31+
logger := service.NewLogger("dev")
32+
staticHandler := &handler.Static{}
33+
s.db = &mockDB{}
34+
s.router = server.Router(
35+
logger,
36+
staticHandler,
37+
version,
38+
s.db,
39+
)
40+
}
41+
42+
func (s *RouterTestSuite) SetupTest() {
43+
s.server = httptest.NewServer(s.router)
44+
}
45+
46+
func (s *RouterTestSuite) TearDownTest() {
47+
s.server.Close()
48+
}
49+
50+
func (s *RouterTestSuite) TearDownSuite() {
51+
s.db.Close()
52+
}
53+
54+
func (s *RouterTestSuite) GetResponse(method string, path string, body io.Reader) *http.Response {
55+
url := s.server.URL + path
56+
response, err := GetResponse(method, url, body)
57+
if err != nil {
58+
s.Fail(err.Error())
59+
}
60+
61+
return response
62+
}
63+
64+
func (s *RouterTestSuite) TestVersion() {
65+
expectedVersion := fmt.Sprintf(`{"status":200,"data":{"version":"%s"}}`, version)
66+
response := s.GetResponse("GET", "/version", nil)
67+
s.AssertResponseBodyStatus(response, 200, expectedVersion, "version should be served")
68+
}

server/serializer/serializers_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package serializer_test

server/service/common.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package service
2+
3+
import "database/sql"
4+
5+
// SQLDB describes a *sql.DB
6+
type SQLDB interface {
7+
Close() error
8+
Query(query string, args ...interface{}) (*sql.Rows, error)
9+
}

server/service/common_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package service_test

0 commit comments

Comments
 (0)