package main import ( "testing" "github.com/gavv/httpexpect/v2" ) func startServer(t *testing.T) *httpexpect.Expect { config := ServerConfig{ Datasource: ":memory:", Port: "8181", Started: make(chan bool), } go start(t.Context(), &config) <-config.Started return httpexpect.Default(t, "http://localhost:8181/api") } func TestGetUsers(t *testing.T) { e := startServer(t) result := e.GET("/users").Expect().Status(200).JSON() result.Array().Length().IsEqual(2) result.Path("$[0].name").InList("Seeseemelk", "Huffle") result.Path("$[1].name").InList("Seeseemelk", "Huffle") } func TestGetUser(t *testing.T) { e := startServer(t) result := e.GET("/user/1").Expect().Status(200).JSON().Object() result.Value("name").IsEqual("Seeseemelk") result.Value("id").IsEqual(1) } func TestGetUserUnknown(t *testing.T) { e := startServer(t) e.GET("/user/999").Expect().Status(404) } func TestGetUserBadId(t *testing.T) { e := startServer(t) e.GET("/user/bad-id").Expect().Status(400) } func TestGetUserGoalsWhenNoGoalsPresent(t *testing.T) { e := startServer(t) result := e.GET("/user/1/goals").Expect().Status(200).JSON().Array() result.Length().IsEqual(0) } func TestGetUserGoalsNoUser(t *testing.T) { e := startServer(t) e.GET("/user/999/goals").Expect().Status(404) } func TestGetUserGoalsBadId(t *testing.T) { e := startServer(t) e.GET("/user/bad-id/goals").Expect().Status(400) } func TestCreateUserGoal(t *testing.T) { e := startServer(t) // Create a new goal requestBody := map[string]interface{}{ "name": "Test Goal", "target": 5000, "weight": 10, } response := e.POST("/user/1/goals"). WithJSON(requestBody). Expect(). Status(201). JSON().Object() // Verify the response has an ID response.ContainsKey("id") goalId := response.Value("id").Number().Raw() // Verify the goal exists in the list of goals goals := e.GET("/user/1/goals"). Expect(). Status(200). JSON().Array() goals.Length().IsEqual(1) goal := goals.Value(0).Object() goal.Value("id").IsEqual(goalId) goal.Value("name").IsEqual("Test Goal") goal.Value("target").IsEqual(5000) goal.Value("weight").IsEqual(10) goal.Value("progress").IsEqual(0) } func TestCreateUserGoalNoUser(t *testing.T) { e := startServer(t) requestBody := map[string]interface{}{ "name": "Test Goal", "target": 5000, "weight": 10, } e.POST("/user/999/goals"). WithJSON(requestBody). Expect(). Status(404) } func TestCreateUserGoalInvalidInput(t *testing.T) { e := startServer(t) // Test with empty name requestBody := map[string]interface{}{ "name": "", "target": 5000, "weight": 10, } e.POST("/user/1/goals"). WithJSON(requestBody). Expect(). Status(400) // Test with missing fields invalidRequest := map[string]interface{}{ "target": 5000, } e.POST("/user/1/goals"). WithJSON(invalidRequest). Expect(). Status(400) } func TestCreateUserGoalBadId(t *testing.T) { e := startServer(t) requestBody := map[string]interface{}{ "name": "Test Goal", "target": 5000, "weight": 10, } e.POST("/user/bad-id/goals"). WithJSON(requestBody). Expect(). Status(400) }