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  }