variants units
This commit is contained in:
88
models/flexibleInt_test.go
Normal file
88
models/flexibleInt_test.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
)
|
||||
|
||||
/*
|
||||
A strict type on one field rejects the whole request.
|
||||
|
||||
Fiber's BodyParser stops at the first field it cannot convert and returns 400
|
||||
"Invalid request body" — so `"primaryaddress": true` from a checkbox threw away
|
||||
the address, the street and the pincode with it. The shopper saw no error worth
|
||||
acting on and then had no address to choose at checkout.
|
||||
|
||||
Measured 2026-09-02 against the running backend: three plausible payloads for
|
||||
one address form, three 400s.
|
||||
*/
|
||||
|
||||
func readInt(t *testing.T, body string) (FlexibleInt, error) {
|
||||
t.Helper()
|
||||
var v struct {
|
||||
N FlexibleInt `json:"n"`
|
||||
}
|
||||
err := json.Unmarshal([]byte(`{"n":`+body+`}`), &v)
|
||||
return v.N, err
|
||||
}
|
||||
|
||||
func mustRead(t *testing.T, body string, want FlexibleInt) {
|
||||
t.Helper()
|
||||
got, err := readInt(t, body)
|
||||
if err != nil {
|
||||
t.Fatalf("%s: %v", body, err)
|
||||
}
|
||||
if got != want {
|
||||
t.Errorf("%s -> %d, want %d", body, got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestACheckboxIsANumber(t *testing.T) {
|
||||
// "Set as my default address" sends a boolean.
|
||||
mustRead(t, "true", 1)
|
||||
mustRead(t, "false", 0)
|
||||
}
|
||||
|
||||
func TestATextInputIsANumber(t *testing.T) {
|
||||
mustRead(t, `"1"`, 1)
|
||||
mustRead(t, `"0"`, 0)
|
||||
}
|
||||
|
||||
func TestAWordIsReadByMeaning(t *testing.T) {
|
||||
mustRead(t, `"Active"`, 1)
|
||||
mustRead(t, `"active"`, 1)
|
||||
mustRead(t, `"Inactive"`, 0)
|
||||
}
|
||||
|
||||
func TestAnUntouchedFieldIsZeroNotAnError(t *testing.T) {
|
||||
mustRead(t, `""`, 0)
|
||||
mustRead(t, "null", 0)
|
||||
}
|
||||
|
||||
func TestAClientWithNoIntegerTypeStillWorks(t *testing.T) {
|
||||
// JavaScript has one number type, so 1 can arrive as 1.0.
|
||||
mustRead(t, "1.0", 1)
|
||||
}
|
||||
|
||||
func TestAWordItCannotReadIsRefusedRatherThanGuessed(t *testing.T) {
|
||||
// Storing 0 for something unrecognised would record a choice the shopper
|
||||
// never made. Better to fail loudly than to invent an answer.
|
||||
if _, err := readInt(t, `"maybe"`); err == nil {
|
||||
t.Error(`"maybe" was silently accepted`)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLatitudeSurvivesBothShapes(t *testing.T) {
|
||||
// A map picker sends a number; a text field sends a string. Both are the
|
||||
// same place, and rejecting either loses the whole address.
|
||||
var withNumber, withString Customerlocations
|
||||
if err := json.Unmarshal([]byte(`{"latitude":11.0168}`), &withNumber); err != nil {
|
||||
t.Fatalf("number latitude: %v", err)
|
||||
}
|
||||
if err := json.Unmarshal([]byte(`{"latitude":"11.0168"}`), &withString); err != nil {
|
||||
t.Fatalf("string latitude: %v", err)
|
||||
}
|
||||
if withNumber.Latitude != withString.Latitude {
|
||||
t.Errorf("%q from a number, %q from a string", withNumber.Latitude, withString.Latitude)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user