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 }