diff --git a/web/scores_test.go b/web/scores_test.go new file mode 100644 index 0000000..676eb72 --- /dev/null +++ b/web/scores_test.go @@ -0,0 +1,122 @@ +// Copyright 2020 Team 254. All Rights Reserved. +// Author: kenschenke@gmail.com (Ken Schenke) + +package web + +import ( + "encoding/json" + "github.com/Team254/cheesy-arena/field" + "github.com/Team254/cheesy-arena/game" + "github.com/stretchr/testify/assert" + "net/http/httptest" + "testing" +) + +func TestGetScores(t *testing.T) { + web := setupTestWeb(t) + + score1 := game.TestScore1() + score2 := game.TestScore2() + web.arena.RedScore.AutoPoints = score1.AutoPoints + web.arena.RedScore.TeleopPoints = score1.TeleopPoints + web.arena.RedScore.EndgamePoints = score1.EndgamePoints + web.arena.BlueScore.AutoPoints = score2.AutoPoints + web.arena.BlueScore.TeleopPoints = score2.TeleopPoints + web.arena.BlueScore.EndgamePoints = score2.EndgamePoints + + recorder := web.getHttpResponse("/api/scores") + assert.Equal(t, 200, recorder.Code) + + var reqScores jsonScore + json.Unmarshal(recorder.Body.Bytes(), &reqScores) + assert.Equal(t, score1.AutoPoints, reqScores.Red.Auto) + assert.Equal(t, score1.TeleopPoints, reqScores.Red.Teleop) + assert.Equal(t, score1.EndgamePoints, reqScores.Red.Endgame) + assert.Equal(t, score2.AutoPoints, reqScores.Blue.Auto) + assert.Equal(t, score2.TeleopPoints, reqScores.Blue.Teleop) + assert.Equal(t, score2.EndgamePoints, reqScores.Blue.Endgame) +} + +func TestPatchScores(t *testing.T) { + web := setupTestWeb(t) + var recorder *httptest.ResponseRecorder + + web.arena.MatchState = field.PreMatch + recorder = web.patchHttpResponse("/api/scores", "{}") + assert.Equal(t, 200, recorder.Code) + assert.Equal(t, recorder.Body.String(), "Score cannot be updated in this match state") + + score1 := game.TestScore1() + score2 := game.TestScore2() + web.arena.RedScore.AutoPoints = score1.AutoPoints + web.arena.RedScore.TeleopPoints = score1.TeleopPoints + web.arena.RedScore.EndgamePoints = score1.EndgamePoints + web.arena.BlueScore.AutoPoints = score2.AutoPoints + web.arena.BlueScore.TeleopPoints = score2.TeleopPoints + web.arena.BlueScore.EndgamePoints = score2.EndgamePoints + + web.arena.MatchState = field.PostMatch + recorder = web.patchHttpResponse("/api/scores", + "{\"red\":{\"auto\":5,\"teleop\":10,\"endgame\":15}}") + assert.Equal(t, 200, recorder.Code) + + assert.Equal(t, score1.AutoPoints + 5, web.arena.RedScore.AutoPoints) + assert.Equal(t, score1.TeleopPoints + 10, web.arena.RedScore.TeleopPoints) + assert.Equal(t, score1.EndgamePoints + 15, web.arena.RedScore.EndgamePoints) + assert.Equal(t, score2.AutoPoints, web.arena.BlueScore.AutoPoints) + assert.Equal(t, score2.TeleopPoints, web.arena.BlueScore.TeleopPoints) + assert.Equal(t, score2.EndgamePoints, web.arena.BlueScore.EndgamePoints) + + recorder = web.patchHttpResponse("/api/scores", + "{\"blue\":{\"auto\":-5,\"teleop\":-10,\"endgame\":-15}}") + assert.Equal(t, 200, recorder.Code) + + assert.Equal(t, score1.AutoPoints + 5, web.arena.RedScore.AutoPoints) + assert.Equal(t, score1.TeleopPoints + 10, web.arena.RedScore.TeleopPoints) + assert.Equal(t, score1.EndgamePoints + 15, web.arena.RedScore.EndgamePoints) + assert.Equal(t, score2.AutoPoints - 5, web.arena.BlueScore.AutoPoints) + assert.Equal(t, score2.TeleopPoints - 10, web.arena.BlueScore.TeleopPoints) + assert.Equal(t, score2.EndgamePoints - 15, web.arena.BlueScore.EndgamePoints) +} + +func TestPutScores(t *testing.T) { + web := setupTestWeb(t) + var recorder *httptest.ResponseRecorder + + web.arena.MatchState = field.PreMatch + recorder = web.putHttpResponse("/api/scores", "{}") + assert.Equal(t, 200, recorder.Code) + assert.Equal(t, recorder.Body.String(), "Score cannot be updated in this match state") + + score1 := game.TestScore1() + score2 := game.TestScore2() + web.arena.RedScore.AutoPoints = score1.AutoPoints + web.arena.RedScore.TeleopPoints = score1.TeleopPoints + web.arena.RedScore.EndgamePoints = score1.EndgamePoints + web.arena.BlueScore.AutoPoints = score2.AutoPoints + web.arena.BlueScore.TeleopPoints = score2.TeleopPoints + web.arena.BlueScore.EndgamePoints = score2.EndgamePoints + + web.arena.MatchState = field.PostMatch + recorder = web.putHttpResponse("/api/scores", + "{\"red\":{\"auto\":5,\"teleop\":10,\"endgame\":15}}") + assert.Equal(t, 200, recorder.Code) + + assert.Equal(t, 5, web.arena.RedScore.AutoPoints) + assert.Equal(t, 10, web.arena.RedScore.TeleopPoints) + assert.Equal(t, 15, web.arena.RedScore.EndgamePoints) + assert.Equal(t, 0, web.arena.BlueScore.AutoPoints) + assert.Equal(t, 0, web.arena.BlueScore.TeleopPoints) + assert.Equal(t, 0, web.arena.BlueScore.EndgamePoints) + + recorder = web.putHttpResponse("/api/scores", + "{\"blue\":{\"auto\":5,\"teleop\":10,\"endgame\":15}}") + assert.Equal(t, 200, recorder.Code) + + assert.Equal(t, 0, web.arena.RedScore.AutoPoints) + assert.Equal(t, 0, web.arena.RedScore.TeleopPoints) + assert.Equal(t, 0, web.arena.RedScore.EndgamePoints) + assert.Equal(t, 5, web.arena.BlueScore.AutoPoints) + assert.Equal(t, 10, web.arena.BlueScore.TeleopPoints) + assert.Equal(t, 15, web.arena.BlueScore.EndgamePoints) +} diff --git a/web/web_test.go b/web/web_test.go index 7d1f11d..6689eb2 100644 --- a/web/web_test.go +++ b/web/web_test.go @@ -40,6 +40,14 @@ func (web *Web) getHttpResponseWithHeaders(path string, headers map[string]strin return recorder } +func (web *Web) patchHttpResponse(path string, body string) *httptest.ResponseRecorder { + recorder := httptest.NewRecorder() + req, _ := http.NewRequest("PATCH", path, strings.NewReader(body)) + req.Header.Set("Content-Type", "text/plain") + web.newHandler().ServeHTTP(recorder, req) + return recorder +} + func (web *Web) postHttpResponse(path string, body string) *httptest.ResponseRecorder { recorder := httptest.NewRecorder() req, _ := http.NewRequest("POST", path, strings.NewReader(body)) @@ -48,6 +56,14 @@ func (web *Web) postHttpResponse(path string, body string) *httptest.ResponseRec return recorder } +func (web *Web) putHttpResponse(path string, body string) *httptest.ResponseRecorder { + recorder := httptest.NewRecorder() + req, _ := http.NewRequest("PUT", path, strings.NewReader(body)) + req.Header.Set("Content-Type", "text/plain") + web.newHandler().ServeHTTP(recorder, req) + return recorder +} + // Starts a real local HTTP server that can be used by more sophisticated tests. func (web *Web) startTestServer() (*httptest.Server, string) { server := httptest.NewServer(web.newHandler())