github.com/authzed/spicedb@v1.32.1-0.20240520085336-ebda56537386/pkg/development/wasm/main_test.go (about) 1 //go:build wasm 2 // +build wasm 3 4 // To Run: 5 // 1) Install wasmbrowsertest: `go install github.com/agnivade/wasmbrowsertest@latest` 6 // 2) Run: `GOOS=js GOARCH=wasm go test -exec wasmbrowsertest` 7 8 package main 9 10 import ( 11 "syscall/js" 12 "testing" 13 14 "github.com/stretchr/testify/require" 15 "google.golang.org/protobuf/encoding/protojson" 16 17 core "github.com/authzed/spicedb/pkg/proto/core/v1" 18 devinterface "github.com/authzed/spicedb/pkg/proto/developer/v1" 19 ) 20 21 func TestMissingArgument(t *testing.T) { 22 encodedResult := runDeveloperRequest(js.Null(), []js.Value{}) 23 response := &devinterface.DeveloperResponse{} 24 err := protojson.Unmarshal([]byte(encodedResult.(js.Value).String()), response) 25 require.NoError(t, err) 26 require.Equal(t, "invalid number of arguments specified", response.GetInternalError()) 27 } 28 29 func TestEmptyRequest(t *testing.T) { 30 response := run(t, &devinterface.DeveloperRequest{}) 31 require.Equal(t, "missing required context", response.GetInternalError()) 32 } 33 34 func TestEmptySchema(t *testing.T) { 35 response := run(t, &devinterface.DeveloperRequest{ 36 Context: &devinterface.RequestContext{}, 37 }) 38 require.Equal(t, "", response.GetInternalError()) 39 } 40 41 func TestInvalidSchema(t *testing.T) { 42 response := run(t, &devinterface.DeveloperRequest{ 43 Context: &devinterface.RequestContext{ 44 Schema: "definitio user {", 45 }, 46 }) 47 require.NotNil(t, response.GetDeveloperErrors()) 48 require.Equal(t, 1, len(response.GetDeveloperErrors().InputErrors)) 49 require.Equal(t, "Unexpected token at root level: TokenTypeIdentifier", response.GetDeveloperErrors().InputErrors[0].Message) 50 } 51 52 func TestInvalidRelationship(t *testing.T) { 53 response := run(t, &devinterface.DeveloperRequest{ 54 Context: &devinterface.RequestContext{ 55 Schema: `definition user {} 56 57 definition document { 58 relation viewer: user 59 } 60 `, 61 Relationships: []*core.RelationTuple{ 62 { 63 ResourceAndRelation: &core.ObjectAndRelation{ 64 Namespace: "document", 65 ObjectId: "*", 66 Relation: "viewer", 67 }, 68 Subject: &core.ObjectAndRelation{ 69 Namespace: "user", 70 ObjectId: "tom", 71 Relation: "...", 72 }, 73 }, 74 }, 75 }, 76 }) 77 require.NotNil(t, response.GetInternalError()) 78 require.Equal(t, `invalid resource id; must match ([a-zA-Z0-9/_|\-=+]{1,})`, response.GetInternalError()) 79 } 80 81 func run(t *testing.T, request *devinterface.DeveloperRequest) *devinterface.DeveloperResponse { 82 encodedRequest, err := protojson.Marshal(request) 83 require.NoError(t, err) 84 85 encodedResponse := runDeveloperRequest(js.Null(), []js.Value{js.ValueOf(string(encodedRequest))}) 86 response := &devinterface.DeveloperResponse{} 87 err = protojson.Unmarshal([]byte(encodedResponse.(js.Value).String()), response) 88 require.NoError(t, err) 89 return response 90 }