github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/state/impl_event_storage_test.go (about)

     1  /*
     2   * Copyright (c) 2022-present unTill Pro, Ltd.
     3   */
     4  
     5  package state
     6  
     7  import (
     8  	"context"
     9  	"embed"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	istorageimpl "github.com/voedger/voedger/pkg/istorage/provider"
    15  
    16  	"github.com/voedger/voedger/pkg/appdef"
    17  	"github.com/voedger/voedger/pkg/iratesce"
    18  	"github.com/voedger/voedger/pkg/istorage/mem"
    19  	"github.com/voedger/voedger/pkg/istructs"
    20  	"github.com/voedger/voedger/pkg/istructsmem"
    21  	payloads "github.com/voedger/voedger/pkg/itokens-payloads"
    22  	"github.com/voedger/voedger/pkg/itokensjwt"
    23  	"github.com/voedger/voedger/pkg/parser"
    24  )
    25  
    26  func TestEventStorage_Get(t *testing.T) {
    27  	require := require.New(t)
    28  	testQName := appdef.NewQName("main", "Command")
    29  
    30  	app := appStructs(
    31  		`APPLICATION test();
    32  		WORKSPACE ws1 (
    33  			TABLE t1 INHERITS CDoc (
    34  				x int32
    35  			);
    36  			TYPE CommandParam(
    37  				i int32
    38  			);
    39  			EXTENSION ENGINE BUILTIN(
    40  				COMMAND Command(CommandParam);
    41  			);
    42  		)
    43  		`,
    44  		func(cfg *istructsmem.AppConfigType) {
    45  			cfg.Resources.Add(istructsmem.NewCommandFunction(testQName, istructsmem.NullCommandExec))
    46  		})
    47  	partitionNr := istructs.PartitionID(1)
    48  	wsid := istructs.WSID(1)
    49  	offset := istructs.Offset(123)
    50  	tQname := appdef.NewQName("main", "t1")
    51  
    52  	reb := app.Events().GetNewRawEventBuilder(istructs.NewRawEventBuilderParams{
    53  		GenericRawEventBuilderParams: istructs.GenericRawEventBuilderParams{
    54  			Workspace:         wsid,
    55  			HandlingPartition: partitionNr,
    56  			PLogOffset:        offset,
    57  			QName:             testQName,
    58  		},
    59  	})
    60  	argb := reb.ArgumentObjectBuilder()
    61  	argb.PutInt32("i", 1)
    62  	_, err := argb.Build()
    63  	require.NoError(err)
    64  
    65  	cud := reb.CUDBuilder()
    66  	rw := cud.Create(tQname)
    67  	rw.PutRecordID(appdef.SystemField_ID, 1)
    68  	rw.PutInt32("x", 1)
    69  
    70  	rawEvent, err := reb.BuildRawEvent()
    71  	if err != nil {
    72  		panic(err)
    73  	}
    74  
    75  	event, err := app.Events().PutPlog(rawEvent, nil, istructsmem.NewIDGenerator())
    76  	if err != nil {
    77  		panic(err)
    78  	}
    79  
    80  	eventFunc := func() istructs.IPLogEvent {
    81  		return event
    82  	}
    83  
    84  	s := ProvideAsyncActualizerStateFactory()(context.Background(), appStructsFunc(app), nil, nil, nil, nil, eventFunc, nil, nil, 0, 0)
    85  
    86  	require.Equal(event, s.PLogEvent())
    87  
    88  	kb, err := s.KeyBuilder(Event, appdef.NullQName)
    89  	require.NoError(err)
    90  	value, err := s.MustExist(kb)
    91  	require.NotNil(value)
    92  	require.NoError(err)
    93  
    94  	require.Equal(int64(wsid), value.AsInt64(Field_Workspace))
    95  	require.Equal(int64(0), value.AsInt64(Field_RegisteredAt))
    96  	require.Equal(int64(0), value.AsInt64(Field_SyncedAt))
    97  	require.Equal(int64(0), value.AsInt64(Field_Offset))
    98  	require.Equal(int64(0), value.AsInt64(Field_WLogOffset))
    99  	require.Equal(int64(0), value.AsInt64(Field_DeviceID))
   100  	require.Equal(testQName, value.AsQName(Field_QName))
   101  	require.False(value.AsBool(Field_Synced))
   102  
   103  	v := value.AsValue(Field_ArgumentObject)
   104  	require.NotNil(v)
   105  	require.Equal(int32(1), v.AsInt32("i"))
   106  
   107  	c := value.AsValue(Field_CUDs)
   108  	require.NotNil(c)
   109  	require.Equal(1, c.Length())
   110  	cud1 := c.GetAsValue(0)
   111  	require.NotNil(cud1)
   112  	require.Equal(int32(1), cud1.AsInt32("x"))
   113  	require.Equal(tQname, cud1.AsQName("sys.QName"))
   114  
   115  	// test sync actualizer state
   116  	syncState := ProvideSyncActualizerStateFactory()(context.Background(), appStructsFunc(app), nil, nil, nil, nil, eventFunc, 0)
   117  	require.Equal(event, syncState.PLogEvent())
   118  }
   119  
   120  type (
   121  	appCfgCallback func(cfg *istructsmem.AppConfigType)
   122  )
   123  
   124  //go:embed sql_example_syspkg/*.vsql
   125  var sfs embed.FS
   126  
   127  func appStructs(appdefSql string, prepareAppCfg appCfgCallback) istructs.IAppStructs {
   128  	appDef := appdef.New()
   129  
   130  	fs, err := parser.ParseFile("file1.vsql", appdefSql)
   131  	if err != nil {
   132  		panic(err)
   133  	}
   134  
   135  	pkg, err := parser.BuildPackageSchema("test/main", []*parser.FileSchemaAST{fs})
   136  	if err != nil {
   137  		panic(err)
   138  	}
   139  
   140  	pkgSys, err := parser.ParsePackageDir(appdef.SysPackage, sfs, "sql_example_syspkg")
   141  	if err != nil {
   142  		panic(err)
   143  	}
   144  
   145  	packages, err := parser.BuildAppSchema([]*parser.PackageSchemaAST{
   146  		pkgSys,
   147  		pkg,
   148  	})
   149  	if err != nil {
   150  		panic(err)
   151  	}
   152  
   153  	err = parser.BuildAppDefs(packages, appDef)
   154  	if err != nil {
   155  		panic(err)
   156  	}
   157  
   158  	cfgs := make(istructsmem.AppConfigsType, 1)
   159  	cfg := cfgs.AddConfig(istructs.AppQName_test1_app1, appDef)
   160  	cfg.SetNumAppWorkspaces(istructs.DefaultNumAppWorkspaces)
   161  	if prepareAppCfg != nil {
   162  		prepareAppCfg(cfg)
   163  	}
   164  
   165  	asf := mem.Provide()
   166  	storageProvider := istorageimpl.Provide(asf)
   167  	prov := istructsmem.Provide(
   168  		cfgs,
   169  		iratesce.TestBucketsFactory,
   170  		payloads.ProvideIAppTokensFactory(itokensjwt.TestTokensJWT()),
   171  		storageProvider)
   172  	structs, err := prov.AppStructs(istructs.AppQName_test1_app1)
   173  	if err != nil {
   174  		panic(err)
   175  	}
   176  	return structs
   177  }