Implement comprehensive BDD testing framework using Godog: - Added feature files for greet and health endpoints - Created test server that runs on port 9191 - Implemented step definitions using Godog's exact patterns - Fixed undefined step warnings by following Godog conventions - All tests passing with proper response validation - Maintained black box testing principles Key files: - pkg/bdd/steps/steps.go - Step definitions using StepContext struct - pkg/bdd/testserver/ - Test server implementation - features/*.feature - BDD feature files - pkg/bdd/README.md - Documentation for proper step patterns The implementation follows Godog's exact pattern suggestions to avoid undefined step warnings and provides comprehensive API testing.
55 lines
1.0 KiB
Go
55 lines
1.0 KiB
Go
package testserver
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
type Client struct {
|
|
server *Server
|
|
lastResp *http.Response
|
|
lastBody []byte
|
|
}
|
|
|
|
func NewClient(server *Server) *Client {
|
|
return &Client{
|
|
server: server,
|
|
}
|
|
}
|
|
|
|
func (c *Client) Request(method, path string, body []byte) error {
|
|
url := c.server.GetBaseURL() + path
|
|
req, err := http.NewRequest(method, url, nil)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create request: %w", err)
|
|
}
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return fmt.Errorf("request failed: %w", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
c.lastResp = resp
|
|
c.lastBody, err = io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to read response body: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *Client) ExpectResponseBody(expected string) error {
|
|
if c.lastResp == nil {
|
|
return fmt.Errorf("no response received")
|
|
}
|
|
|
|
actual := string(c.lastBody)
|
|
if actual != expected {
|
|
return fmt.Errorf("expected response body %q, got %q", expected, actual)
|
|
}
|
|
|
|
return nil
|
|
}
|