github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istructsmem/internal/descr/impl_view_test.go (about)

     1  /*
     2   * Copyright (c) 2021-present Sigma-Soft, Ltd.
     3   * @author: Nikolay Nikitin
     4   */
     5  
     6  package descr
     7  
     8  import (
     9  	"encoding/json"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/voedger/voedger/pkg/appdef"
    15  )
    16  
    17  func Test_View(t *testing.T) {
    18  
    19  	var app appdef.IAppDef
    20  	viewName := appdef.NewQName("test", "view")
    21  
    22  	// prepare AppDef with view
    23  	{
    24  		adb := appdef.New()
    25  		adb.AddPackage("test", "test.com/test")
    26  
    27  		docName := appdef.NewQName("test", "doc")
    28  		_ = adb.AddCDoc(docName)
    29  
    30  		view := adb.AddView(viewName)
    31  		view.SetComment("view comment")
    32  		view.Key().PartKey().
    33  			AddField("pk_int", appdef.DataKind_int64).
    34  			AddRefField("pk_ref", docName)
    35  		view.Key().ClustCols().
    36  			AddField("cc_int", appdef.DataKind_int64).
    37  			AddRefField("cc_ref", docName).
    38  			AddField("cc_name", appdef.DataKind_string, appdef.MaxLen(100))
    39  		view.Value().
    40  			AddField("vv_int", appdef.DataKind_int64, true).
    41  			AddRefField("vv_ref", true, docName).
    42  			AddField("vv_code", appdef.DataKind_string, false, appdef.MaxLen(10), appdef.Pattern(`^\w+$`)).
    43  			AddField("vv_data", appdef.DataKind_bytes, false, appdef.MaxLen(1024)).SetFieldComment("vv_data", "One kilobyte of data")
    44  		if a, err := adb.Build(); err == nil {
    45  			app = a
    46  		} else {
    47  			panic(err)
    48  		}
    49  	}
    50  
    51  	{
    52  		v := newView()
    53  		v.read(app.View(viewName))
    54  
    55  		json, err := json.Marshal(v)
    56  
    57  		require := require.New(t)
    58  		require.NoError(err)
    59  
    60  		// os.WriteFile("C://temp//view_test.json", json, 0644)
    61  
    62  		const expected = `{
    63  			"Comment": "view comment",
    64  			"Key": {
    65  				"Partition": [
    66  					{
    67  						"Name": "pk_int",
    68  						"Data": "sys.int64",
    69  						"Required": true
    70  					},
    71  					{
    72  						"Name": "pk_ref",
    73  						"Data": "sys.RecordID",
    74  						"Required": true,
    75  						"Refs": [
    76  							"test.doc"
    77  						]
    78  					}
    79  				],
    80  				"ClustCols": [
    81  					{
    82  						"Name": "cc_int",
    83  						"Data": "sys.int64"
    84  					},
    85  					{
    86  						"Name": "cc_ref",
    87  						"Data": "sys.RecordID",
    88  						"Refs": [
    89  							"test.doc"
    90  						]
    91  					},
    92  					{
    93  						"Name": "cc_name",
    94  						"DataType": {
    95  							"Ancestor": "sys.string",
    96  							"Constraints": {
    97  								"MaxLen": 100
    98  							}
    99  						}
   100  					}
   101  				]
   102  			},
   103  			"Value": [
   104  				{
   105  					"Name": "sys.QName",
   106  					"Data": "sys.QName",
   107  					"Required": true
   108  				},
   109  				{
   110  					"Name": "vv_int",
   111  					"Data": "sys.int64",
   112  					"Required": true
   113  				},
   114  				{
   115  					"Name": "vv_ref",
   116  					"Data": "sys.RecordID",
   117  					"Required": true,
   118  					"Refs": [
   119  						"test.doc"
   120  					]
   121  				},
   122  				{
   123  					"Name": "vv_code",
   124  					"DataType": {
   125  						"Ancestor": "sys.string",
   126  						"Constraints": {
   127  							"MaxLen": 10,
   128  							"Pattern": "^\\w+$"
   129  						}
   130  					}
   131  				},
   132  				{
   133  					"Comment": "One kilobyte of data",
   134  					"Name": "vv_data",
   135  					"DataType": {
   136  						"Ancestor": "sys.bytes",
   137  						"Constraints": {
   138  							"MaxLen": 1024
   139  						}
   140  					}
   141  				}
   142  			]
   143  		}`
   144  		require.JSONEq(expected, string(json))
   145  	}
   146  }