4
1
Fork 0
backend-core/user_test.go

177 lines
4.1 KiB
Go
Raw Permalink Normal View History

2019-08-31 23:03:56 +08:00
// +build integration
package main
import (
"bytes"
"database/sql"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/google/go-cmp/cmp"
2019-08-31 23:03:56 +08:00
)
func TestUser(t *testing.T) {
db := connect()
defer db.Close()
2019-10-23 13:57:00 +08:00
h := NewHandler(db, nil)
2019-08-31 23:03:56 +08:00
r := NewRouter(h)
t.Run("Create", testCreateUser(db, r))
2019-09-01 01:00:53 +08:00
t.Run("GetUserByPhone", testGetUserByPhone(db, r))
t.Run("GetUser", testGetUser(db, r))
2019-09-03 10:52:21 +08:00
t.Run("UpdateUser", testUpdateUser(db, r))
2019-08-31 23:03:56 +08:00
}
func testCreateUser(db *sql.DB, router http.Handler) func(t *testing.T) {
return func(t *testing.T) {
2019-09-03 10:52:21 +08:00
// Setup
2019-09-28 23:01:36 +08:00
mockUser := User{
2019-08-31 23:03:56 +08:00
PhoneNumber: "+65 99999999",
2019-08-31 23:32:42 +08:00
FirstName: "Test",
2019-09-03 10:52:21 +08:00
LastName: "User 1",
2019-08-31 23:03:56 +08:00
}
b, _ := json.Marshal(mockUser)
2019-09-03 10:52:21 +08:00
// Test
2019-08-31 23:03:56 +08:00
w := httptest.NewRecorder()
2019-08-31 23:32:42 +08:00
r := httptest.NewRequest("POST", "/user", bytes.NewBuffer(b))
2019-08-31 23:03:56 +08:00
router.ServeHTTP(w, r)
assertCode(t, w, 200)
2019-09-03 10:52:21 +08:00
// Assert
got, want := new(User), mockUser
wantPhone, _ := ParsePhone(want.PhoneNumber)
json.NewDecoder(w.Body).Decode(got)
if got.FirstName != want.FirstName || got.LastName != want.LastName || got.PhoneNumber != wantPhone {
t.Error("Wanted a User with same FirstName, LastName, PhoneNumber. Got something else")
}
assertDB(t, db, `SELECT * FROM "user" WHERE phone_number = '+65 9999 9999' AND first_name = 'Test' AND last_name = 'User 1'`)
2019-08-31 23:03:56 +08:00
}
}
2019-09-01 01:00:53 +08:00
func testGetUserByPhone(db *sql.DB, router http.Handler) func(t *testing.T) {
return func(t *testing.T) {
2019-09-03 10:52:21 +08:00
// Setup
2019-09-28 23:01:36 +08:00
mockUser := User{
2019-09-03 10:52:21 +08:00
PhoneNumber: "+65 99999998",
2019-09-01 01:00:53 +08:00
FirstName: "Test",
2019-09-03 10:52:21 +08:00
LastName: "User 2",
2019-09-01 01:00:53 +08:00
}
2019-09-03 10:52:21 +08:00
b, _ := json.Marshal(mockUser)
ws := httptest.NewRecorder()
rs := httptest.NewRequest("POST", "/user", bytes.NewBuffer(b))
router.ServeHTTP(ws, rs)
createdUser := new(User)
json.NewDecoder(ws.Body).Decode(createdUser)
2019-09-01 01:00:53 +08:00
2019-09-03 10:52:21 +08:00
// Test
2019-09-01 01:00:53 +08:00
w := httptest.NewRecorder()
2019-09-03 10:52:21 +08:00
r := httptest.NewRequest("GET", "/user?phone_number=%2B6599999998", nil)
2019-09-01 01:00:53 +08:00
router.ServeHTTP(w, r)
assertCode(t, w, 200)
2019-09-03 10:52:21 +08:00
// Assert
got, want := new(User), createdUser
2019-09-01 01:00:53 +08:00
json.NewDecoder(w.Body).Decode(got)
2019-09-03 10:52:21 +08:00
if diff := cmp.Diff(got, want); len(diff) != 0 {
t.Error(diff)
2019-09-01 01:00:53 +08:00
}
2019-09-03 10:52:21 +08:00
2019-08-31 23:03:56 +08:00
}
2019-09-01 01:00:53 +08:00
}
func testGetUser(db *sql.DB, router http.Handler) func(t *testing.T) {
return func(t *testing.T) {
2019-09-03 10:52:21 +08:00
// Setup
2019-09-28 23:01:36 +08:00
mockUser := User{
2019-09-03 10:52:21 +08:00
PhoneNumber: "+65 99999997",
2019-09-01 01:00:53 +08:00
FirstName: "User",
2019-09-03 10:52:21 +08:00
LastName: "Test 2",
2019-09-01 01:00:53 +08:00
}
2019-09-03 10:52:21 +08:00
b, _ := json.Marshal(mockUser)
2019-09-01 01:00:53 +08:00
2019-09-03 10:52:21 +08:00
ws := httptest.NewRecorder()
rs := httptest.NewRequest("POST", "/user", bytes.NewBuffer(b))
router.ServeHTTP(ws, rs)
2019-09-01 01:00:53 +08:00
createdUser := new(User)
2019-09-03 10:52:21 +08:00
json.NewDecoder(ws.Body).Decode(createdUser)
2019-09-01 01:00:53 +08:00
2019-09-03 10:52:21 +08:00
// Test
2019-09-01 01:00:53 +08:00
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/user/id/"+createdUser.ID, nil)
router.ServeHTTP(w, r)
assertCode(t, w, 200)
2019-09-03 10:52:21 +08:00
// Assert
2019-09-01 01:00:53 +08:00
got, want := new(User), createdUser
json.NewDecoder(w.Body).Decode(got)
if diff := cmp.Diff(got, want); len(diff) != 0 {
t.Error(diff)
}
2019-09-03 10:52:21 +08:00
}
}
func testUpdateUser(db *sql.DB, router http.Handler) func(t *testing.T) {
return func(t *testing.T) {
// Setup
2019-09-28 23:01:36 +08:00
mockUser := User{
2019-09-03 10:52:21 +08:00
PhoneNumber: "+65 99999996",
FirstName: "User",
LastName: "Test 3",
}
bs, _ := json.Marshal(mockUser)
ws := httptest.NewRecorder()
rs := httptest.NewRequest("POST", "/user", bytes.NewBuffer(bs))
router.ServeHTTP(ws, rs)
createdUser := new(User)
json.NewDecoder(ws.Body).Decode(createdUser)
// Test
b := []byte(`{"first_name": "Ambrose", "last_name": "Chua"}`)
updateUser := new(User)
json.NewDecoder(bytes.NewBuffer(b)).Decode(updateUser)
updatedUser := createdUser
updatedUser.FirstName = updateUser.FirstName
updatedUser.LastName = updateUser.LastName
w := httptest.NewRecorder()
r := httptest.NewRequest("PATCH", "/user", bytes.NewBuffer(b))
claim, _ := json.Marshal(&RawClient{UserId: createdUser.ID, ClientId: "test"})
r.Header.Add("X-User-Claim", string(claim))
router.ServeHTTP(w, r)
assertCode(t, w, 200)
// Assert
wt := httptest.NewRecorder()
rt := httptest.NewRequest("GET", "/user/id/"+createdUser.ID, nil)
router.ServeHTTP(wt, rt)
got, want := new(User), updatedUser
json.NewDecoder(wt.Body).Decode(got)
if diff := cmp.Diff(got, want); len(diff) != 0 {
t.Error(diff)
}
2019-09-01 01:00:53 +08:00
}
}