I'm writting a simple rest boiler plate for future projects, I'm currently working on some tests for my controller, I'm trying to retrieve a todo by it's Id at /todo/{id}, here's the handler.
func (t TodoController) GetById(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id, err := strconv.Atoi(params["id"]) if err != nil { w.WriteHeader(http.StatusBadRequest) return } todo, err := t.todoService.GetById(id) if err != nil { w.WriteHeader(http.StatusNotFound) return } helpers.SendResponse(http.StatusOK, todo, w) } And here's the test for this controller.
var ( todoController TodoController recorder *httptest.ResponseRecorder todos []models.Todo ) func setup() { todoController = *NewTodoController(services.NewTodoService()) recorder = httptest.NewRecorder() todos = []models.Todo{ { ID: 0, Todo: "Buy milk", Completed: false, }, { ID: 1, Todo: "Buy cheese", Completed: false, }, { ID: 2, Todo: "Buy eggs", Completed: false, }, } } func TestGetById(t *testing.T) { // Arrange setup() request := httptest.NewRequest(http.MethodGet, "/todo/1", nil) var response models.Todo // Act todoController.GetById(recorder, request) result := recorder.Result() defer result.Body.Close() data, err := ioutil.ReadAll(result.Body) err = json.Unmarshal(data, &response) // Assert if err != nil { t.Errorf("Expected error to be nil but got %v", err) } assert.Equal(t, result.StatusCode, http.StatusOK, "Response should have been 200 Ok") assert.Equal(t, response, todos[1], "Response did not match the expected result") } It looks like when sending a request to /todo/1 mux is not able to retrieve the Id, so it end up returning a BadRequest error.
Here's a link to this repo: https://github.com/Je12emy/rest_boiler