client_preview_validation_test.go

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: LicenseRef-MutuaL-1.2
 4
 5package cooked
 6
 7import (
 8	"context"
 9	"net/http"
10	"strings"
11	"testing"
12)
13
14func TestPreviewRecipeTextACIDAPIClientResponses1AcceptsIntegerDecimalPortions(t *testing.T) {
15	var previewCalls int
16	client, closeServer := newTestClient(t, rawPreviewRecipeTextTestHandler(
17		t,
18		&previewCalls,
19		"{\"title\":\"Pasta\",\"markdown\":\"# Pasta\",\"portions\":1.0}",
20	))
21	defer closeServer()
22
23	preview, err := client.PreviewRecipeText(context.Background(), "Pasta", "Boil pasta.")
24	if err != nil {
25		t.Fatalf("PreviewRecipeText() error = %v", err)
26	}
27	if previewCalls != 1 {
28		t.Fatalf("preview calls = %d, want 1", previewCalls)
29	}
30	if preview.Portions != 1 {
31		t.Fatalf("preview portions = %d, want 1", preview.Portions)
32	}
33}
34
35func TestPreviewRecipeTextACIDAPIClientResponses1RejectsFractionalPortions(t *testing.T) {
36	var previewCalls int
37	client, closeServer := newTestClient(t, rawPreviewRecipeTextTestHandler(
38		t,
39		&previewCalls,
40		"{\"title\":\"Pasta\",\"markdown\":\"# Pasta\",\"portions\":1.5}",
41	))
42	defer closeServer()
43
44	_, err := client.PreviewRecipeText(context.Background(), "Pasta", "Boil pasta.")
45	if err == nil {
46		t.Fatal("PreviewRecipeText() error = nil, want fractional portions error")
47	}
48	if !strings.Contains(err.Error(), "must be integer-valued") {
49		t.Fatalf("PreviewRecipeText() error = %v, want integer-valued portions error", err)
50	}
51	if previewCalls != 1 {
52		t.Fatalf("preview calls = %d, want 1", previewCalls)
53	}
54}
55
56func rawPreviewRecipeTextTestHandler(t *testing.T, previewCalls *int, body string) http.HandlerFunc {
57	t.Helper()
58
59	return func(w http.ResponseWriter, r *http.Request) {
60		switch r.URL.Path {
61		case "/api/public/login":
62			writeLoginResponse(t, w)
63		case "/api/new/from-text/preview":
64			requireMethod(t, r, http.MethodPost, "preview")
65			requireSessionCookie(t, r)
66			requirePreviewRecipeTextRequest(t, r)
67			(*previewCalls)++
68			w.Header().Set("Content-Type", "application/json")
69			if _, err := w.Write([]byte(body)); err != nil {
70				t.Fatalf("write raw preview response: %v", err)
71			}
72		default:
73			t.Fatalf("unexpected path %s", r.URL.Path)
74		}
75	}
76}