Files
dance-lessons-coach/pkg/bdd/steps/common_steps.go
Gabriel Radureau 5eec64e5e8
All checks were successful
CI/CD Pipeline / Build Docker Cache (push) Successful in 9s
CI/CD Pipeline / CI Pipeline (push) Successful in 4m15s
CI/CD Pipeline / Trigger Docker Push (push) Has been skipped
🧪 test: add JWT secret rotation BDD scenarios and step implementations (#12)
 merge: implement JWT secret rotation with BDD scenario isolation

- Implement JWT secret rotation mechanism (closes #8)
- Add per-scenario state isolation for BDD tests (closes #14)
- Validate password reset workflow via BDD tests (closes #7)
- Fix port conflicts in test validation
- Add state tracer for debugging test execution
- Document BDD isolation strategies in ADR 0025
- Fix PostgreSQL configuration environment variables

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Co-authored-by: Gabriel Radureau <arcodange@gmail.com>
Co-committed-by: Gabriel Radureau <arcodange@gmail.com>
2026-04-11 17:56:45 +02:00

66 lines
1.9 KiB
Go

package steps
import (
"fmt"
"strings"
"dance-lessons-coach/pkg/bdd/testserver"
)
// CommonSteps holds shared step definitions that are used across multiple domains
type CommonSteps struct {
client *testserver.Client
scenarioKey string // Track current scenario for state isolation
}
func NewCommonSteps(client *testserver.Client) *CommonSteps {
return &CommonSteps{client: client}
}
// SetScenarioKey sets the current scenario key for state isolation
func (s *CommonSteps) SetScenarioKey(key string) {
s.scenarioKey = key
}
// Response validation steps
func (s *CommonSteps) theResponseShouldBe(arg1, arg2 string) error {
// The regex captures the full JSON from the feature file, including quotes
// We need to extract just the key and value without the surrounding quotes and backslashes
// Remove the surrounding quotes and backslashes
cleanArg1 := strings.Trim(arg1, `"\`)
cleanArg2 := strings.Trim(arg2, `"\`)
// Build the expected JSON string
expected := fmt.Sprintf(`{"%s":"%s"}`, cleanArg1, cleanArg2)
return s.client.ExpectResponseBody(expected)
}
func (s *CommonSteps) theResponseShouldContainError(expectedError string) error {
// Check if the response contains the expected error
body := string(s.client.GetLastBody())
// For JWT validation errors, check for invalid_token error type
if strings.Contains(body, "invalid_token") {
// If we expect any invalid error and got invalid_token, that's acceptable for JWT tests
if strings.Contains(expectedError, "invalid") {
return nil
}
}
if !strings.Contains(body, expectedError) {
return fmt.Errorf("expected response to contain error %q, got %q", expectedError, body)
}
return nil
}
// Status code validation
func (s *CommonSteps) theStatusCodeShouldBe(expectedStatus int) error {
actualStatus := s.client.GetLastStatusCode()
if actualStatus != expectedStatus {
return fmt.Errorf("expected status %d, got %d", expectedStatus, actualStatus)
}
return nil
}