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  }