diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 6460bfd..a42c631 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -467,6 +467,19 @@ jobs: echo "No coverage file generated" fi + - name: Check coverage minimum + if: matrix.label == 'dev' + working-directory: backend + run: | + if [ -f coverage.out ]; then + COVERAGE=$(go tool cover -func=coverage.out | grep total | awk '{print $3}' | sed 's/%//') + if (( $(echo "$COVERAGE < 60" | bc -l) )); then + echo "FAIL: Coverage $COVERAGE% is below 60% minimum" + exit 1 + fi + echo "PASS: Coverage $COVERAGE% meets 60% minimum" + fi + - name: Upload coverage artifact if: matrix.label == 'dev' run: | diff --git a/.githooks/pre-commit b/.githooks/pre-commit index f230274..8c24eb9 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -13,13 +13,12 @@ NC='\033[0m' # No Colour FAILED=0 -# ---------- Frontend (prettier --write, then eslint) ---------- -FRONTEND_STAGED=$(git diff --cached --name-only -- 'frontend/' | head -1) -if [ -n "$FRONTEND_STAGED" ]; then +# ---------- Frontend (prettier --write staged, then eslint) ---------- +STAGED_FRONTEND=$(git diff --cached --name-only --diff-filter=ACMR | grep '^frontend/' || true) +if [ -n "$STAGED_FRONTEND" ]; then printf "${YELLOW}Auto-formatting staged frontend files with prettier...${NC}\n" - cd frontend && npx prettier --write . 2>&1 + echo "$STAGED_FRONTEND" | xargs npx prettier --write 2>/dev/null || true # Re-stage any files prettier modified so formatting is included in the commit - cd .. git diff --name-only -- 'frontend/' | xargs -r git add fi diff --git a/backend/handlers/payments/giftcards.go b/backend/handlers/payments/giftcards.go index 5902674..845825e 100644 --- a/backend/handlers/payments/giftcards.go +++ b/backend/handlers/payments/giftcards.go @@ -1086,7 +1086,7 @@ func BuyGiftCard(w http.ResponseWriter, r *http.Request) { recipient = userEmail } // Notify admin about the friend gift card (email delivery not yet implemented — admin must send manually) - if _, err := tx.Exec(ctx, ` + if _, err := db.Conn.Exec(context.Background(), ` INSERT INTO admin_notifications (reason, booking_id, user_id) VALUES ('gift_card_purchased_for_friend', NULL, $1) `, userID); err != nil { diff --git a/backend/handlers/payments/till_test.go b/backend/handlers/payments/till_test.go index a204a80..8c9dc12 100644 --- a/backend/handlers/payments/till_test.go +++ b/backend/handlers/payments/till_test.go @@ -20,6 +20,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/jackc/pgx/v5" + "github.com/stretchr/testify/require" ) func TestCreateTillSale_OnTheHouse(t *testing.T) { @@ -541,17 +542,10 @@ func TestGetTillCheckoutStatus_Completed(t *testing.T) { } // Wait for the mock goroutine to complete the checkout with polling. - deadline := time.Now().Add(5 * time.Second) - for { + require.Eventually(t, func() bool { _, err := SquareClient.GetCheckout(context.Background(), *createResp.CheckoutID) - if err == nil { - break - } - if time.Now().After(deadline) { - t.Fatalf("timed out waiting for checkout to complete: %v", err) - } - time.Sleep(100 * time.Millisecond) - } + return err == nil + }, 5*time.Second, 100*time.Millisecond) // Now call GetTillCheckoutStatus — should return COMPLETED. statusReq := httptest.NewRequest("GET", "/api/admin/till/checkout/"+*createResp.CheckoutID+"/status", nil)