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 }