flamingo.me/flamingo-commerce/v3@v3.11.0/product/infrastructure/fake/searchservice_test.go (about) 1 package fake_test 2 3 import ( 4 "context" 5 "fmt" 6 "path/filepath" 7 "testing" 8 9 "flamingo.me/flamingo-commerce/v3/product/domain" 10 "flamingo.me/flamingo-commerce/v3/product/infrastructure/fake" 11 searchDomain "flamingo.me/flamingo-commerce/v3/search/domain" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestSearchService_Search(t *testing.T) { 17 s := fake.SearchService{} 18 s.Inject(&fake.ProductService{}, &struct { 19 LiveSearchJSON string `inject:"config:commerce.product.fakeservice.jsonTestDataLiveSearch,optional"` 20 CategoryFacetItemsJSON string `inject:"config:commerce.product.fakeservice.jsonTestDataCategoryFacetItems,optional"` 21 }{}) 22 23 t.Run("Category Facet", func(t *testing.T) { 24 25 t.Run("Selected category level 1", func(t *testing.T) { 26 result, err := s.Search(context.Background(), searchDomain.NewKeyValueFilter("categoryCodes", []string{"clothing"})) 27 require.Nil(t, err) 28 assert.False(t, result.Facets["categoryCodes"].Items[0].Active, "Items[0].Active") 29 assert.True(t, result.Facets["categoryCodes"].Items[1].Active, "Items[1].Active") 30 assert.True(t, result.Facets["categoryCodes"].Items[1].Selected, "Items[1].Selected") 31 }) 32 33 t.Run("Selected category level 2", func(t *testing.T) { 34 result, err := s.Search(context.Background(), searchDomain.NewKeyValueFilter("categoryCodes", []string{"headphones"})) 35 require.Nil(t, err) 36 assert.True(t, result.Facets["categoryCodes"].Items[0].Active, "Items[0].Active") 37 assert.True(t, result.Facets["categoryCodes"].Items[0].Items[1].Active, "Items[0].Items[1].Active") 38 assert.True(t, result.Facets["categoryCodes"].Items[0].Items[1].Selected, "Items[0].Items[1].Selected") 39 assert.False(t, result.Facets["categoryCodes"].Items[0].Items[1].Items[0].Active, "Items[0].Items[1].Items[0].Active") 40 }) 41 42 t.Run("Selected category level 3", func(t *testing.T) { 43 result, err := s.Search(context.Background(), searchDomain.NewKeyValueFilter("categoryCodes", []string{"headphone_accessories"})) 44 require.Nil(t, err) 45 assert.True(t, result.Facets["categoryCodes"].Items[0].Active, "Items[0].Active") 46 assert.True(t, result.Facets["categoryCodes"].Items[0].Items[1].Active, "Items[0].Items[1].Active") 47 assert.True(t, result.Facets["categoryCodes"].Items[0].Items[1].Items[0].Active, "Items[0].Items[1].Items[0].Active") 48 assert.True(t, result.Facets["categoryCodes"].Items[0].Items[1].Items[0].Selected, "Items[0].Items[1].Items[0].Selected") 49 }) 50 }) 51 } 52 53 func TestSearchService_SearchBy(t *testing.T) { 54 t.Parallel() 55 56 type fields struct { 57 liveSearchJSON string 58 } 59 60 type args struct { 61 attribute string 62 filters []searchDomain.Filter 63 } 64 65 tests := []struct { 66 name string 67 fields fields 68 args args 69 want *domain.SearchResult 70 wantErr assert.ErrorAssertionFunc 71 }{ 72 { 73 name: "get livesearch results from json file", 74 fields: fields{liveSearchJSON: filepath.Join("testdata", "livesearch.json")}, 75 args: args{ 76 attribute: "livesearch", 77 filters: []searchDomain.Filter{ 78 searchDomain.NewQueryFilter("camera"), 79 searchDomain.NewSortFilter("will-not-be-considered", searchDomain.SortDirectionAscending), 80 }, 81 }, 82 want: &domain.SearchResult{ 83 Result: searchDomain.Result{ 84 SearchMeta: searchDomain.SearchMeta{ 85 Query: "", 86 OriginalQuery: "", 87 Page: 1, 88 NumPages: 1, 89 NumResults: 0, 90 SelectedFacets: []searchDomain.Facet(nil), 91 SortOptions: []searchDomain.SortOption(nil), 92 }, 93 Hits: []searchDomain.Document{}, 94 Suggestion: []searchDomain.Suggestion{ 95 { 96 Type: "type", 97 Text: "text", 98 Highlight: "highlight", 99 AdditionalAttributes: map[string]string{"additional": "value"}, 100 }, 101 }, 102 Facets: searchDomain.FacetCollection(nil), 103 Promotions: []searchDomain.Promotion{ 104 { 105 Title: "Promotion title", 106 Content: "Promotion content", 107 URL: "https://www.omnevo.net", 108 Media: []searchDomain.Media{ 109 { 110 Type: "type", 111 MimeType: "mimetype", 112 Usage: "usage", 113 Title: "title", 114 Reference: "reference"}, 115 }, 116 AdditionalAttributes: map[string]interface{}{"additional": "value"}, 117 }, 118 }, 119 Actions: []searchDomain.Action{ 120 { 121 Type: "Redirect", 122 Content: "https://example.com", 123 AdditionalAttributes: map[string]interface{}{"additional": "value"}, 124 }, 125 }, 126 }, 127 Hits: []domain.BasicProduct{}, 128 }, 129 wantErr: assert.NoError, 130 }, 131 { 132 name: "get livesearch results from json file with sort", 133 fields: fields{liveSearchJSON: filepath.Join("testdata", "livesearch.json")}, 134 args: args{ 135 attribute: "not-livesearch", 136 filters: []searchDomain.Filter{ 137 searchDomain.NewSortFilter("camera", searchDomain.SortDirectionAscending), 138 searchDomain.NewQueryFilter("camera"), 139 searchDomain.NewSortFilter("size", searchDomain.SortDirectionDescending), 140 searchDomain.NewSortFilter("no-direction", ""), 141 }, 142 }, 143 want: &domain.SearchResult{ 144 Result: searchDomain.Result{ 145 SearchMeta: searchDomain.SearchMeta{ 146 Query: "", 147 OriginalQuery: "", 148 Page: 1, 149 NumPages: 10, 150 NumResults: 0, 151 SelectedFacets: []searchDomain.Facet{}, 152 SortOptions: []searchDomain.SortOption{ 153 {Field: "camera", Label: "camera", SelectedDesc: false, SelectedAsc: true}, 154 {Field: "size", Label: "size", SelectedDesc: true, SelectedAsc: false}, 155 {Field: "no-direction", Label: "no-direction", SelectedDesc: false, SelectedAsc: true}, 156 }, 157 }, 158 Hits: []searchDomain.Document{}, 159 Suggestion: []searchDomain.Suggestion{}, 160 Facets: searchDomain.FacetCollection{ 161 "brandCode": searchDomain.Facet{ 162 Type: searchDomain.ListFacet, 163 Name: "brandCode", 164 Label: "Brand", 165 Items: []*searchDomain.FacetItem{{ 166 Label: "Apple", 167 Value: "apple", 168 Active: false, 169 Selected: false, 170 Count: 2, 171 }}, 172 Position: 0, 173 }, 174 175 "retailerCode": searchDomain.Facet{ 176 Type: searchDomain.ListFacet, 177 Name: "retailerCode", 178 Label: "Retailer", 179 Items: []*searchDomain.FacetItem{{ 180 Label: "Test Retailer", 181 Value: "retailer", 182 Active: false, 183 Selected: false, 184 Count: 2, 185 }}, 186 Position: 0, 187 }, 188 189 "categoryCodes": searchDomain.Facet{ 190 Type: searchDomain.TreeFacet, 191 Name: "categoryCodes", 192 Label: "Category", 193 Items: []*searchDomain.FacetItem{ 194 { 195 Label: "Electronics", 196 Value: "electronics", 197 Active: false, 198 Selected: false, 199 Count: 0, 200 Items: []*searchDomain.FacetItem{{ 201 Label: "Flat Screens & TV", 202 Value: "flat-screen_tvs", 203 Active: false, 204 Selected: false, 205 Count: 0, 206 }, { 207 Label: "Headphones", 208 Value: "headphones", 209 Active: false, 210 Selected: false, 211 Count: 0, 212 Items: []*searchDomain.FacetItem{{ 213 Label: "Accessories", 214 Value: "headphone_accessories", 215 Active: false, 216 Selected: false, 217 Count: 0, 218 }}, 219 }, { 220 Label: "Tablets", 221 Value: "tablets", 222 Active: false, 223 Selected: false, 224 Count: 0, 225 }}, 226 }, 227 { 228 Label: "Clothes & Fashion", 229 Value: "clothing", 230 Active: false, 231 Selected: false, 232 Count: 0, 233 Items: []*searchDomain.FacetItem{{ 234 Label: "Jumpsuits", 235 Value: "jumpsuits", 236 Active: false, 237 Selected: false, 238 Count: 0, 239 }}, 240 }, 241 }, 242 Position: 0, 243 }, 244 }, 245 Promotions: nil, 246 Actions: nil, 247 }, 248 Hits: []domain.BasicProduct{}, 249 }, 250 wantErr: assert.NoError, 251 }, 252 } 253 254 for _, tt := range tests { 255 tt := tt 256 t.Run(tt.name, func(t *testing.T) { 257 t.Parallel() 258 s := new(fake.SearchService).Inject( 259 new(fake.ProductService), 260 &struct { 261 LiveSearchJSON string `inject:"config:commerce.product.fakeservice.jsonTestDataLiveSearch,optional"` 262 CategoryFacetItemsJSON string `inject:"config:commerce.product.fakeservice.jsonTestDataCategoryFacetItems,optional"` 263 }{ 264 LiveSearchJSON: tt.fields.liveSearchJSON, 265 }, 266 ) 267 got, err := s.SearchBy(context.Background(), tt.args.attribute, nil, tt.args.filters...) 268 if !tt.wantErr(t, err, fmt.Sprintf("SearchBy(%v, %v, %v, %v)", context.Background(), tt.args.attribute, nil, tt.args.filters)) { 269 return 270 } 271 assert.Equalf(t, tt.want, got, "SearchBy(%v, %v, %v, %v)", context.Background(), tt.args.attribute, nil, tt.args.filters) 272 }) 273 } 274 }