diff --git a/router.go b/router.go index d56b429..0ad1c67 100644 --- a/router.go +++ b/router.go @@ -12,7 +12,7 @@ func NewRouter(h *Handler) *httprouter.Router { router.GET("/user", h.GetUserByPhone) router.GET("/user/id/:user", h.GetUser) router.GET("/user/username/:username", h.GetUserByUsername) - router.PATCH("/user", h.UpdateUser) + router.PATCH("/user", AuthMiddleware(h.UpdateUser)) // Conversations router.POST("/user/conversation", AuthMiddleware(h.CreateConversation)) diff --git a/user_test.go b/user_test.go index 854e320..4d1603d 100644 --- a/user_test.go +++ b/user_test.go @@ -21,76 +21,155 @@ func TestUser(t *testing.T) { t.Run("Create", testCreateUser(db, r)) t.Run("GetUserByPhone", testGetUserByPhone(db, r)) t.Run("GetUser", testGetUser(db, r)) + t.Run("UpdateUser", testUpdateUser(db, r)) } func testCreateUser(db *sql.DB, router http.Handler) func(t *testing.T) { return func(t *testing.T) { + + // Setup mockUser := &User{ PhoneNumber: "+65 99999999", FirstName: "Test", - LastName: "User", + LastName: "User 1", } b, _ := json.Marshal(mockUser) + // Test w := httptest.NewRecorder() r := httptest.NewRequest("POST", "/user", bytes.NewBuffer(b)) router.ServeHTTP(w, r) assertCode(t, w, 200) - assertDB(t, db, `SELECT * FROM "user" WHERE phone_number = '+65 9999 9999' AND first_name = 'Test' AND last_name = 'User'`) + // 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'`) + } } func testGetUserByPhone(db *sql.DB, router http.Handler) func(t *testing.T) { return func(t *testing.T) { - mockUser := &User{ - PhoneNumber: "+65 9999 9999", - FirstName: "Test", - LastName: "User", - } + // Setup + mockUser := &User{ + PhoneNumber: "+65 99999998", + FirstName: "Test", + LastName: "User 2", + } + 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) + + // Test w := httptest.NewRecorder() - r := httptest.NewRequest("GET", "/user?phone_number=%2B6599999999", nil) + r := httptest.NewRequest("GET", "/user?phone_number=%2B6599999998", nil) router.ServeHTTP(w, r) assertCode(t, w, 200) - got, want := new(User), mockUser + // Assert + got, want := new(User), createdUser json.NewDecoder(w.Body).Decode(got) - if got.FirstName != want.FirstName || got.LastName != want.LastName || got.PhoneNumber != want.PhoneNumber { - t.Errorf("Want user %v, got %v", want, got) + if diff := cmp.Diff(got, want); len(diff) != 0 { + t.Error(diff) } + } } func testGetUser(db *sql.DB, router http.Handler) func(t *testing.T) { return func(t *testing.T) { + + // Setup mockUser := &User{ - PhoneNumber: "+65 88888888", + PhoneNumber: "+65 99999997", FirstName: "User", - LastName: "Test", + LastName: "Test 2", } - cb, _ := json.Marshal(mockUser) + b, _ := json.Marshal(mockUser) - cw := httptest.NewRecorder() - cr := httptest.NewRequest("POST", "/user", bytes.NewBuffer(cb)) - - router.ServeHTTP(cw, cr) + ws := httptest.NewRecorder() + rs := httptest.NewRequest("POST", "/user", bytes.NewBuffer(b)) + router.ServeHTTP(ws, rs) createdUser := new(User) - json.NewDecoder(cw.Body).Decode(createdUser) + json.NewDecoder(ws.Body).Decode(createdUser) + // Test w := httptest.NewRecorder() r := httptest.NewRequest("GET", "/user/id/"+createdUser.ID, nil) router.ServeHTTP(w, r) assertCode(t, w, 200) + // Assert got, want := new(User), createdUser json.NewDecoder(w.Body).Decode(got) if diff := cmp.Diff(got, want); len(diff) != 0 { t.Error(diff) } + + } +} + +func testUpdateUser(db *sql.DB, router http.Handler) func(t *testing.T) { + return func(t *testing.T) { + + // Setup + mockUser := &User{ + 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) + } + } }