diff --git a/go.mod b/go.mod index feec6c1..8a9832b 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,7 @@ module backend/core require ( github.com/golang/protobuf v1.1.0 // indirect + github.com/google/go-cmp v0.3.1 github.com/joho/godotenv v1.3.0 github.com/julienschmidt/httprouter v0.0.0-20180715161854-348b672cd90d github.com/lib/pq v0.0.0-20180523175426-90697d60dd84 diff --git a/go.sum b/go.sum index 30a3805..02e4a6d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/golang/protobuf v1.1.0 h1:0iH4Ffd/meGoXqF2lSAhZHt8X+cPgkfn/cb6Cce5Vpc= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/julienschmidt/httprouter v0.0.0-20180715161854-348b672cd90d h1:of6+TpypLAaiv4JxgH5aplBZnt0b65B4v4c8q5oy+Sk= diff --git a/main.go b/main.go index 838e1be..0e2b83e 100644 --- a/main.go +++ b/main.go @@ -19,7 +19,20 @@ func main() { if err != nil { log.Fatal("Error loading .env file") } + + // Database + db := connect() + // Handler + h := NewHandler(db) + // Routes + router := NewRouter(h) + listen = os.Getenv("LISTEN") + log.Printf("starting server on %s", listen) + log.Fatal(http.ListenAndServe(listen, router)) +} + +func connect() *sql.DB { postgres = os.Getenv("POSTGRES") // Open postgres @@ -28,13 +41,10 @@ func main() { if err != nil { log.Fatal(err) } - defer db.Close() + err = db.Ping() + if err != nil { + log.Fatal(err) + } - // Handler - h := NewHandler(db) - // Routes - router := NewRouter(h) - - log.Printf("starting server on %s", listen) - log.Fatal(http.ListenAndServe(listen, router)) + return db } diff --git a/testutils_test.go b/testutils_test.go new file mode 100644 index 0000000..451937c --- /dev/null +++ b/testutils_test.go @@ -0,0 +1,23 @@ +package main + +import ( + "database/sql" + "net/http/httptest" + "testing" +) + +func assertCode(t *testing.T, w *httptest.ResponseRecorder, code int) { + if got, want := w.Code, code; want != got { + t.Errorf("Want response code %d, got %d", want, got) + } +} + +func assertDB(t *testing.T, db *sql.DB, query string) { + rows, err := db.Query(query) + if err != nil { + t.Errorf("Error during query %s: %s", query, err) + } + if rows.Next() != true { + t.Errorf("Want one result, found none for query %s", query) + } +} diff --git a/user_test.go b/user_test.go new file mode 100644 index 0000000..d201947 --- /dev/null +++ b/user_test.go @@ -0,0 +1,47 @@ +// +build integration + +package main + +import ( + "bytes" + "database/sql" + "encoding/json" + //"github.com/google/go-cmp/cmp" + "net/http" + "net/http/httptest" + "testing" +) + +func TestUser(t *testing.T) { + db := connect() + defer db.Close() + h := NewHandler(db) + r := NewRouter(h) + + t.Run("Create", testCreateUser(db, r)) +} + +func testCreateUser(db *sql.DB, router http.Handler) func(t *testing.T) { + return func(t *testing.T) { + mockUser := &User{ + PhoneNumber: "+65 99999999", + } + b, _ := json.Marshal(mockUser) + + w := httptest.NewRecorder() + r := httptest.NewRequest("POST", "/", bytes.NewBuffer(b)) + + router.ServeHTTP(w, r) + assertCode(t, w, 200) + + assertDB(t, db, `SELECT * FROM "user" WHERE phone_number = "+65 97663827`) + } +} + +/* + got, want := new(User), created + json.NewDecoder(w.Body).Decode(got) + if diff := cmp.Diff(got, want); len(diff) != 0 { + t.Error(diff) + } +*/