feat(server): /api/info aggregator + frontend version footer (#40)
Some checks failed
CI/CD Pipeline / Build Docker Cache (push) Successful in 9s
CI/CD Pipeline / CI Pipeline (push) Failing after 4m48s
CI/CD Pipeline / Trigger Docker Push (push) Has been skipped

Co-authored-by: Gabriel Radureau <arcodange@gmail.com>
Co-committed-by: Gabriel Radureau <arcodange@gmail.com>
This commit was merged in pull request #40.
This commit is contained in:
2026-05-05 08:29:26 +02:00
committed by arcodange
parent 4a3f1bb138
commit a2beadc458
16 changed files with 587 additions and 1 deletions

View File

@@ -2,6 +2,7 @@ package steps
import (
"fmt"
"regexp"
"strings"
"dance-lessons-coach/pkg/bdd/testserver"
@@ -99,3 +100,69 @@ func (s *CommonSteps) theFieldShouldEqual(field, expectedValue string) error {
}
return nil
}
// Regex field matching
func (s *CommonSteps) theFieldShouldMatch(field, pattern string) error {
body := string(s.client.GetLastBody())
// Extract the value of the field from JSON
// Look for "field":"value" and extract value
fieldPattern := `"` + field + `":"([^"]*)"`
re := regexp.MustCompile(fieldPattern)
matches := re.FindStringSubmatch(body)
if matches == nil {
// Try without quotes (for numbers)
fieldPatternNum := `"` + field + `":(\d+\.?\d*)`
reNum := regexp.MustCompile(fieldPatternNum)
matches = reNum.FindStringSubmatch(body)
if matches == nil {
return fmt.Errorf("field %q not found in response: %s", field, body)
}
}
// matches[1] contains the value
value := matches[1]
// Compile and match the pattern
regex, err := regexp.Compile(pattern)
if err != nil {
return fmt.Errorf("invalid regex pattern %q: %v", pattern, err)
}
if !regex.MatchString(value) {
return fmt.Errorf("field %q value %q does not match pattern %q", field, value, pattern)
}
return nil
}
// Response is JSON check
func (s *CommonSteps) theResponseShouldBeJSON() error {
body := string(s.client.GetLastBody())
// Simple check for JSON structure
body = strings.TrimSpace(body)
if !strings.HasPrefix(body, "{") && !strings.HasPrefix(body, "[") {
return fmt.Errorf("response is not JSON: %s", body)
}
return nil
}
// Response contains field (simple string containment in body)
func (s *CommonSteps) theResponseShouldContain(field string) error {
body := string(s.client.GetLastBody())
if !strings.Contains(body, `"`+field+`"`) {
return fmt.Errorf("response does not contain field %q: %s", field, body)
}
return nil
}
// Response header validation
func (s *CommonSteps) theResponseHeader(header, expectedValue string) error {
resp := s.client.GetLastResponse()
if resp == nil {
return fmt.Errorf("no response captured for header check")
}
headerValue := resp.Header.Get(header)
if headerValue != expectedValue {
return fmt.Errorf("header %q expected %q, got %q", header, expectedValue, headerValue)
}
return nil
}