github.com/jasontconnell/sitecore@v1.6.0/sitecore_test.go (about)

     1  package sitecore
     2  
     3  import (
     4  	"encoding/binary"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/golang/protobuf/proto"
    12  	"github.com/google/uuid"
    13  	"github.com/jasontconnell/sitecore/api"
    14  	"github.com/jasontconnell/sitecore/scprotobuf"
    15  )
    16  
    17  var connstr string = os.Getenv("SitecoreAPITestConnectionString")
    18  
    19  func TestBlob(t *testing.T) {
    20  	id := api.MustParseUUID("{8A28BA6E-5A13-47E8-8D25-983D3BD0E761}")
    21  	b, err := api.LoadBlob(connstr, id)
    22  
    23  	if err != nil {
    24  		t.Log(err)
    25  		t.Fail()
    26  	}
    27  
    28  	fmt.Println(b.GetData(), b.GetId())
    29  }
    30  
    31  func TestLoadItemMap(t *testing.T) {
    32  	t.Log(connstr)
    33  	start := time.Now()
    34  	items, err := api.LoadItems(connstr)
    35  	t.Log("Loaded items", time.Since(start))
    36  
    37  	if err != nil {
    38  		t.Fatal(err)
    39  	}
    40  
    41  	start = time.Now()
    42  	root, itemMap := api.LoadItemMap(items)
    43  	t.Log("Loaded item map", time.Since(start))
    44  
    45  	if root == nil {
    46  		t.Fatal("couldn't find root")
    47  	}
    48  
    49  	if len(itemMap) == 0 {
    50  		t.Fatal("no items")
    51  	}
    52  
    53  	t.Log("Root path", root.GetPath())
    54  
    55  	filtered := api.FilterItemMap(itemMap, []string{"/sitecore/templates"})
    56  	t.Log("Filtered item map", len(filtered))
    57  
    58  	t.Log(root.GetId(), root.GetPath(), len(itemMap), time.Since(start))
    59  
    60  	start = time.Now()
    61  	fields, ferr := api.LoadFields(connstr)
    62  	if ferr != nil {
    63  		t.Fatal(ferr)
    64  	}
    65  
    66  	t.Log("Fields loaded", time.Since(start))
    67  
    68  	if len(fields) == 0 {
    69  		t.Fatal("no fields received")
    70  	}
    71  
    72  	start = time.Now()
    73  	npfields, nperr := api.LoadFieldsParallel(connstr, 12)
    74  	if nperr != nil {
    75  		t.Fatal(nperr)
    76  	}
    77  
    78  	t.Log("Loaded fields parallel", time.Since(start))
    79  
    80  	if len(npfields) == 0 {
    81  		t.Fatal("non parallel fields is empty")
    82  	}
    83  
    84  	api.AssignFieldValues(itemMap, npfields)
    85  
    86  	if len(fields) != len(npfields) {
    87  		t.Log("len of non parallel fields", len(npfields))
    88  		t.Log("len of parallel fields", len(fields))
    89  
    90  		t.Fatal("len received from non-parallel is not equal to parallel version")
    91  	}
    92  
    93  	testuid := api.MustParseUUID("9541e67d-ce8c-4225-803d-33f7f29f09ef")
    94  
    95  	start = time.Now()
    96  	fieldMap := api.LoadFieldMap(fields)
    97  
    98  	t.Log("Loaded field map", time.Since(start))
    99  	fl, ok := fieldMap[testuid]
   100  	if !ok {
   101  		t.Fatal("expected item not found")
   102  	}
   103  
   104  	if len(fl) == 0 {
   105  		t.Fatal("expected item found but no field values")
   106  	}
   107  
   108  	if len(fieldMap) != len(itemMap) {
   109  		t.Fatal("not the same amount of items in field map vs item map", len(fieldMap), len(itemMap))
   110  	}
   111  }
   112  
   113  func TestRenderings(t *testing.T) {
   114  	testId := api.MustParseUUID("{768D4C5A-E8D8-4D63-BD2F-6C7D4F2BD080}")
   115  	items, err := api.LoadItems(connstr)
   116  	if err != nil {
   117  		t.Log(err)
   118  		t.Fail()
   119  	}
   120  	tlist, err := api.LoadTemplates(connstr)
   121  	if err != nil {
   122  		t.Log(err)
   123  		t.Fail()
   124  	}
   125  
   126  	_, itemMap := api.LoadItemMap(items)
   127  
   128  	npfields, nperr := api.LoadFieldsParallel(connstr, 12)
   129  	if nperr != nil {
   130  		t.Fatal(nperr)
   131  	}
   132  
   133  	api.AssignFieldValues(itemMap, npfields)
   134  
   135  	tm := api.GetTemplateMap(tlist)
   136  
   137  	t.Log("Mapping Layouts")
   138  	mperr := api.MapAllLayouts(itemMap, tm, true)
   139  	if mperr != nil {
   140  		t.Fatal(mperr)
   141  	}
   142  
   143  	testItem, ok := itemMap[testId]
   144  	if !ok {
   145  		t.Log("Item not found")
   146  		t.Fail()
   147  	}
   148  
   149  	t.Log("getting renderings for ", testItem.GetId())
   150  	for _, r := range testItem.GetRenderings() {
   151  		t.Log(r)
   152  	}
   153  }
   154  
   155  func BenchmarkFieldLoad(b *testing.B) {
   156  	fields, err := api.LoadFields(connstr)
   157  	b.ReportAllocs()
   158  
   159  	if err != nil {
   160  		b.Fatal(err)
   161  	}
   162  
   163  	if len(fields) == 0 {
   164  		b.Fatal("No fields")
   165  	}
   166  }
   167  
   168  func BenchmarkFieldLoadParallel(b *testing.B) {
   169  	fields, err := api.LoadFieldsParallel(connstr, 20)
   170  
   171  	b.ReportAllocs()
   172  
   173  	if err != nil {
   174  		b.Fatal(err)
   175  	}
   176  
   177  	if len(fields) == 0 {
   178  		b.Fatal("No fields")
   179  	}
   180  }
   181  
   182  func TestReadHybrid(t *testing.T) {
   183  	file := `c:\inetpub\wwwroot\Wolftrap\Website\App_Data\items\master\items.master.dat`
   184  	pitems, err := api.ReadProtobuf(file)
   185  	if err != nil {
   186  		t.Log(err)
   187  		t.Fail()
   188  	}
   189  	dbitems, err := api.LoadItems(connstr)
   190  	if err != nil {
   191  		t.Log(err)
   192  		t.Fail()
   193  	}
   194  
   195  	all := append(pitems, dbitems...)
   196  	root, m := api.LoadItemMap(all)
   197  	t.Log(root.GetId(), len(m))
   198  }
   199  
   200  func TestProtobuf(t *testing.T) {
   201  	file := `c:\inetpub\wwwroot\Wolftrap\Website\App_Data\items\master\items.master.dat`
   202  
   203  	b, err := ioutil.ReadFile(file)
   204  	if err != nil {
   205  		t.Fail()
   206  	}
   207  	t.Log(len(b))
   208  
   209  	var items scprotobuf.ItemsData
   210  	err = proto.Unmarshal(b, &items)
   211  	if err != nil {
   212  		t.Log(err.Error())
   213  		t.Fail()
   214  	}
   215  
   216  	// t.Log(len(items.ItemDefinitions))
   217  	// for _, d := range items.ItemDefinitions {
   218  	// 	id, err := getUuid(*d.ID.Lo, *d.ID.Hi)
   219  	// 	if err != nil {
   220  	// 		t.Log(err.Error())
   221  	// 		t.Fail()
   222  	// 		break
   223  	// 	}
   224  
   225  	// 	t.Log(id)
   226  
   227  	// 	if d.Item != nil {
   228  	// 		t.Log(d.Item.Name)
   229  	// 	}
   230  	// }
   231  
   232  	// t.Log("Shared Data")
   233  	// t.Log(len(items.SharedData))
   234  	// for _, d := range items.SharedData {
   235  	// 	for _, s := range d.SharedDataItems {
   236  	// 		id, _ := getUuid(*s.ID.Lo, *s.ID.Hi)
   237  	// 		t.Log(id, s.Value)
   238  	// 	}
   239  	// }
   240  
   241  	t.Log("Languages Data")
   242  	t.Log(len(items.LanguageData))
   243  	for _, d := range items.LanguageData {
   244  		t.Log("language data ------------")
   245  		t.Log(getUuid(*d.ID.Lo, *d.ID.Hi))
   246  		t.Log("language data len", len(d.LanguageData))
   247  		for _, l := range d.LanguageData {
   248  			t.Log(l.Language)
   249  			for _, v := range l.VersionsData {
   250  				t.Log(v.Version, len(v.Fields))
   251  				for _, f := range v.Fields {
   252  					t.Log(getUuid(*f.ID.Lo, *f.ID.Hi))
   253  					t.Log(f.Value)
   254  				}
   255  			}
   256  		}
   257  	}
   258  }
   259  
   260  func getUuid(lo, hi uint64) (uuid.UUID, error) {
   261  	if lo == 0 && hi == 0 {
   262  		return uuid.Nil, nil
   263  	}
   264  
   265  	var b uint32 = uint32(lo >> 32)
   266  	var a uint32 = uint32(lo)
   267  
   268  	var h uint32 = uint32(hi >> 32)
   269  	var d uint32 = uint32(hi)
   270  
   271  	var bytes []byte
   272  	bytes = binary.BigEndian.AppendUint32(bytes, uint32(a))
   273  	bytes = binary.BigEndian.AppendUint16(bytes, uint16(b))
   274  	bytes = binary.BigEndian.AppendUint16(bytes, uint16(b>>16))
   275  	bytes = binary.LittleEndian.AppendUint16(bytes, uint16(d))
   276  	bytes = binary.LittleEndian.AppendUint16(bytes, uint16(d>>16))
   277  	bytes = binary.LittleEndian.AppendUint16(bytes, uint16(h))
   278  	bytes = binary.LittleEndian.AppendUint16(bytes, uint16(h>>16))
   279  
   280  	return uuid.FromBytes(bytes)
   281  }