52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
package domain
|
|
|
|
import "testing"
|
|
|
|
func TestPatternValidation(t *testing.T) {
|
|
p := Pattern{Title: "demo", Width: 2, Height: 1, Cells: []*string{str("R"), nil}, Colors: []Color{{Code: "R", Hex: "#ff0000"}}, Visibility: "private"}
|
|
if err := p.Validate(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
p.Cells[0] = str("missing")
|
|
if p.Validate() == nil {
|
|
t.Fatal("unknown color accepted")
|
|
}
|
|
p.Cells = []*string{}
|
|
if p.Validate() == nil {
|
|
t.Fatal("wrong grid size accepted")
|
|
}
|
|
}
|
|
func str(s string) *string { return &s }
|
|
func TestTransitionAuthorization(t *testing.T) {
|
|
cases := []struct {
|
|
role, old, next string
|
|
own bool
|
|
ok bool
|
|
}{{"guest", "pending", "cancelled", true, true}, {"guest", "accepted", "cancelled", true, false}, {"guest", "pending", "cancelled", false, false}, {"staff", "pending", "completed", false, false}, {"staff", "pending", "accepted", false, true}, {"admin", "accepted", "completed", false, true}}
|
|
for _, c := range cases {
|
|
if Transition(c.role, c.old, c.next, c.own) != c.ok {
|
|
t.Fatalf("%+v", c)
|
|
}
|
|
}
|
|
}
|
|
func TestIdempotencyContent(t *testing.T) {
|
|
if Fingerprint("help", "one", "") == Fingerprint("help", "two", "") {
|
|
t.Fatal("different contents collide")
|
|
}
|
|
if Fingerprint("help", "one", "") != Fingerprint("help", "one", "") {
|
|
t.Fatal("unstable fingerprint")
|
|
}
|
|
}
|
|
func TestPrivateIsolation(t *testing.T) {
|
|
p := Pattern{OwnerID: "owner", Visibility: "private", StoreID: "s1"}
|
|
if CanRead(p, User{ID: "stranger", Role: "guest", StoreID: "s1"}) {
|
|
t.Fatal("private pattern leaked")
|
|
}
|
|
if CanRead(p, User{ID: "admin", Role: "admin", StoreID: "s2"}) {
|
|
t.Fatal("cross-store admin read")
|
|
}
|
|
if !CanRead(p, User{ID: "owner"}) {
|
|
t.Fatal("owner denied")
|
|
}
|
|
}
|