github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/it/impl_journal_test.go (about) 1 /* 2 * Copyright (c) 2021-present unTill Pro, Ltd. 3 */ 4 5 package sys_it 6 7 import ( 8 "fmt" 9 "testing" 10 "time" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/voedger/voedger/pkg/istructs" 15 "github.com/voedger/voedger/pkg/sys/journal" 16 it "github.com/voedger/voedger/pkg/vit" 17 ) 18 19 func TestBasicUsage_Journal(t *testing.T) { 20 require := require.New(t) 21 vit := it.NewVIT(t, &it.SharedConfig_App1) 22 defer vit.TearDown() 23 24 ws := vit.WS(istructs.AppQName_test1_app1, "test_ws") 25 tableNum := vit.NextNumber() 26 idUntillUsers := vit.GetAny("app1pkg.untill_users", ws) 27 28 bill := fmt.Sprintf(`{ 29 "cuds": [{ 30 "fields": { 31 "sys.ID": 1, 32 "sys.QName": "app1pkg.bill", 33 "tableno": %d, 34 "id_untill_users": %d, 35 "table_part": "a", 36 "proforma": 3, 37 "working_day": "20230228" 38 } 39 }] 40 }`, tableNum, idUntillUsers) 41 resp := vit.PostWS(ws, "c.sys.CUD", bill) 42 ID := resp.NewID() 43 expectedOffset := resp.CurrentWLogOffset 44 45 WaitForIndexOffset(vit, ws, journal.QNameViewWLogDates, expectedOffset) 46 47 //Read by unix timestamp 48 body := fmt.Sprintf(` 49 { 50 "args":{"From":%d,"Till":%d,"EventTypes":"all"}, 51 "elements":[{"fields":["Offset","EventTime","Event"]}] 52 }`, vit.Now().UnixMilli(), vit.Now().UnixMilli()) 53 resp = vit.PostWS(ws, "q.sys.Journal", body) 54 55 require.JSONEq(fmt.Sprintf(` 56 { 57 "args": {}, 58 "cuds": [ 59 { 60 "fields": { 61 "id_untill_users": %[4]d, 62 "proforma": 3, 63 "sys.ID": %[1]d, 64 "sys.IsActive": true, 65 "sys.QName": "app1pkg.bill", 66 "table_part": "a", 67 "tableno": %[2]d, 68 "working_day": "20230228" 69 }, 70 "IsNew": true, 71 "sys.ID": %[1]d, 72 "sys.QName": "app1pkg.bill" 73 } 74 ], 75 "DeviceID": 0, 76 "RegisteredAt": %[3]d, 77 "Synced": false, 78 "SyncedAt": 0, 79 "sys.QName": "sys.CUD" 80 }`, ID, tableNum, vit.Now().UnixMilli(), idUntillUsers), resp.SectionRow()[2].(string)) 81 82 expectedEvent := fmt.Sprintf(` 83 { 84 "args": {}, 85 "cuds": [ 86 { 87 "fields": { 88 "id_untill_users": %[4]d, 89 "proforma": 3, 90 "sys.ID": %[1]d, 91 "sys.IsActive": true, 92 "sys.QName": "app1pkg.bill", 93 "table_part": "a", 94 "tableno": %[2]d, 95 "working_day": "20230228" 96 }, 97 "IsNew": true, 98 "sys.ID": %[1]d, 99 "sys.QName": "app1pkg.bill" 100 } 101 ], 102 "DeviceID": 0, 103 "RegisteredAt": %[3]d, 104 "Synced": false, 105 "SyncedAt": 0, 106 "sys.QName": "sys.CUD" 107 }`, ID, tableNum, vit.Now().UnixMilli(), idUntillUsers) 108 109 require.Equal(expectedOffset, istructs.Offset(resp.SectionRow()[0].(float64))) 110 require.Equal(int64(resp.SectionRow()[1].(float64)), vit.Now().UnixMilli()) 111 require.JSONEq(expectedEvent, resp.SectionRow()[2].(string)) 112 113 //Read by offset 114 body = fmt.Sprintf(` 115 { 116 "args":{"From":%d,"Till":%d,"EventTypes":"all","RangeUnit":"Offset"}, 117 "elements":[{"fields":["Offset","EventTime","Event"]}] 118 }`, expectedOffset, expectedOffset) 119 resp = vit.PostWS(ws, "q.sys.Journal", body) 120 121 require.JSONEq(fmt.Sprintf(` 122 { 123 "args": {}, 124 "cuds": [ 125 { 126 "fields": { 127 "id_untill_users": %[4]d, 128 "proforma": 3, 129 "sys.ID": %[1]d, 130 "sys.IsActive": true, 131 "sys.QName": "app1pkg.bill", 132 "table_part": "a", 133 "tableno": %[2]d, 134 "working_day": "20230228" 135 }, 136 "IsNew": true, 137 "sys.ID": %[1]d, 138 "sys.QName": "app1pkg.bill" 139 } 140 ], 141 "DeviceID": 0, 142 "RegisteredAt": %[3]d, 143 "Synced": false, 144 "SyncedAt": 0, 145 "sys.QName": "sys.CUD" 146 }`, ID, tableNum, vit.Now().UnixMilli(), idUntillUsers), resp.SectionRow()[2].(string)) 147 148 expectedEvent = fmt.Sprintf(` 149 { 150 "args": {}, 151 "cuds": [ 152 { 153 "fields": { 154 "id_untill_users": %[4]d, 155 "proforma": 3, 156 "sys.ID": %[1]d, 157 "sys.IsActive": true, 158 "sys.QName": "app1pkg.bill", 159 "table_part": "a", 160 "tableno": %[2]d, 161 "working_day": "20230228" 162 }, 163 "IsNew": true, 164 "sys.ID": %[1]d, 165 "sys.QName": "app1pkg.bill" 166 } 167 ], 168 "DeviceID": 0, 169 "RegisteredAt": %[3]d, 170 "Synced": false, 171 "SyncedAt": 0, 172 "sys.QName": "sys.CUD" 173 }`, ID, tableNum, vit.Now().UnixMilli(), idUntillUsers) 174 175 require.Equal(expectedOffset, istructs.Offset(resp.SectionRow()[0].(float64))) 176 require.Equal(int64(resp.SectionRow()[1].(float64)), vit.Now().UnixMilli()) 177 require.JSONEq(expectedEvent, resp.SectionRow()[2].(string)) 178 } 179 180 func TestJournal_read_in_years_range_1(t *testing.T) { 181 require := require.New(t) 182 vit := it.NewVIT(t, &it.SharedConfig_App1) 183 defer vit.TearDown() 184 vit.SetNow(vit.Now().AddDate(1, 0, 0)) 185 186 setTimestamp := func(year int, month time.Month, day int) time.Time { 187 now := time.Date(year, month, day, 0, 0, 0, 0, time.UTC) 188 vit.SetNow(now) 189 return now 190 } 191 192 ws := vit.WS(istructs.AppQName_test1_app1, "test_ws") 193 idUntillUsers := vit.GetAny("app1pkg.untill_users", ws) 194 195 createBill := func(tableNo int) istructs.Offset { 196 bill := fmt.Sprintf(`{"cuds":[{"fields":{"sys.ID":1,"sys.QName":"app1pkg.bill","tableno":%d,"id_untill_users":%d,"table_part":"a","proforma":3,"working_day":"20230227"}}]}`, tableNo, idUntillUsers) 197 return vit.PostWS(ws, "c.sys.CUD", bill).CurrentWLogOffset 198 } 199 200 startYear := vit.Now().Year() 201 nextYear := startYear + 1 202 203 //Create bills at different years 204 setTimestamp(nextYear, time.August, 17) 205 createBill(vit.NextNumber()) 206 time1 := setTimestamp(nextYear, time.October, 13) 207 table1 := vit.NextNumber() 208 offset1 := createBill(table1) 209 nextYear++ 210 time2 := setTimestamp(nextYear, time.June, 5) 211 table2 := vit.NextNumber() 212 offset2 := createBill(table2) 213 nextYear++ 214 time3 := setTimestamp(nextYear, time.July, 7) 215 table3 := vit.NextNumber() 216 offset3 := createBill(table3) 217 nextYear++ 218 time4 := setTimestamp(nextYear, time.September, 3) 219 table4 := vit.NextNumber() 220 offset4 := createBill(table4) 221 setTimestamp(nextYear, time.November, 5) 222 offset := createBill(vit.NextNumber()) 223 224 WaitForIndexOffset(vit, ws, journal.QNameViewWLogDates, offset) 225 226 //Read journal 227 from := time.Date(startYear+1, time.August, 18, 0, 0, 0, 0, time.UTC).UnixMilli() 228 till := time.Date(nextYear, time.November, 4, 0, 0, 0, 0, time.UTC).UnixMilli() 229 body := fmt.Sprintf(` 230 { 231 "args":{"From":%d,"Till":%d,"EventTypes":"all"}, 232 "elements":[{"fields":["Offset","EventTime","Event"]}] 233 }`, from, till) 234 235 resp := vit.PostWS(ws, "q.sys.Journal", body) 236 237 require.Equal(float64(offset1), resp.SectionRow()[0]) 238 require.Equal(float64(time1.UnixMilli()), resp.SectionRow()[1]) 239 require.Contains(resp.SectionRow()[2], fmt.Sprintf(`"tableno":%d`, table1)) 240 require.Equal(float64(offset2), resp.SectionRow(1)[0]) 241 require.Equal(float64(time2.UnixMilli()), resp.SectionRow(1)[1]) 242 require.Contains(resp.SectionRow(1)[2], fmt.Sprintf(`"tableno":%d`, table2)) 243 require.Equal(float64(offset3), resp.SectionRow(2)[0]) 244 require.Equal(float64(time3.UnixMilli()), resp.SectionRow(2)[1]) 245 require.Contains(resp.SectionRow(2)[2], fmt.Sprintf(`"tableno":%d`, table3)) 246 require.Equal(float64(offset4), resp.SectionRow(3)[0]) 247 require.Equal(float64(time4.UnixMilli()), resp.SectionRow(3)[1]) 248 require.Contains(resp.SectionRow(3)[2], fmt.Sprintf(`"tableno":%d`, table4)) 249 }