47 lines
1.6 KiB
Go
47 lines
1.6 KiB
Go
package vdom
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// A boolean DOM property is a trap in HTML: the attribute's PRESENCE is what means
|
|
// true. checked="false" is a ticked checkbox — the value is not even read. So a false
|
|
// boolean prop must be omitted entirely, and a true one written bare.
|
|
func TestBoolPropSSR(t *testing.T) {
|
|
ticked := RenderHTML(Input(Attr("type", "checkbox"), BoolProp("checked", true)))
|
|
if !strings.Contains(ticked, " checked") {
|
|
t.Errorf("a checked box did not render the attribute: %s", ticked)
|
|
}
|
|
if strings.Contains(ticked, `checked="`) {
|
|
t.Errorf("a boolean attribute must be bare, not valued: %s", ticked)
|
|
}
|
|
|
|
unticked := RenderHTML(Input(Attr("type", "checkbox"), BoolProp("checked", false)))
|
|
if strings.Contains(unticked, "checked") {
|
|
t.Errorf(`an unchecked box must omit the attribute entirely — checked="false" renders as TICKED: %s`, unticked)
|
|
}
|
|
}
|
|
|
|
// Non-boolean props keep their values: an input's value is a string, and dropping it
|
|
// when empty would be just as wrong as writing checked="false".
|
|
func TestValuePropSSRKeepsItsValue(t *testing.T) {
|
|
got := RenderHTML(Input(Prop("value", "false")))
|
|
if !strings.Contains(got, `value="false"`) {
|
|
t.Errorf(`value="false" is a string, not a boolean, and must survive: %s`, got)
|
|
}
|
|
}
|
|
|
|
func TestIsBoolProp(t *testing.T) {
|
|
for _, k := range []string{"checked", "disabled", "selected", "open"} {
|
|
if !IsBoolProp(k) {
|
|
t.Errorf("%q should be known as a boolean property — the reconciler writes it as a string otherwise", k)
|
|
}
|
|
}
|
|
for _, k := range []string{"value", "className", "id"} {
|
|
if IsBoolProp(k) {
|
|
t.Errorf("%q is not a boolean property", k)
|
|
}
|
|
}
|
|
}
|