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  }