default-search-plugin-uuids.e2e-spec.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /* tslint:disable:no-non-null-assertion */
  2. import { DefaultJobQueuePlugin, DefaultSearchPlugin, mergeConfig, UuidIdStrategy } from '@vendure/core';
  3. import { createTestEnvironment, registerInitializer, SqljsInitializer } from '@vendure/testing';
  4. import path from 'path';
  5. import { initialData } from '../../../e2e-common/e2e-initial-data';
  6. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  7. import {
  8. FacetValueFragment,
  9. GetFacetListQuery,
  10. GetFacetListQueryVariables,
  11. } from './graphql/generated-e2e-admin-types';
  12. import {
  13. SearchProductsShopQuery,
  14. SearchProductsShopQueryVariables,
  15. SortOrder,
  16. } from './graphql/generated-e2e-shop-types';
  17. import { GET_FACET_LIST } from './graphql/shared-definitions';
  18. import { SEARCH_PRODUCTS_SHOP } from './graphql/shop-definitions';
  19. import { awaitRunningJobs } from './utils/await-running-jobs';
  20. registerInitializer('sqljs', new SqljsInitializer(path.join(__dirname, '__data__'), 1000));
  21. describe('Default search plugin with UUIDs', () => {
  22. const { server, adminClient, shopClient } = createTestEnvironment(
  23. mergeConfig(testConfig(), {
  24. plugins: [DefaultSearchPlugin.init({ indexStockStatus: true }), DefaultJobQueuePlugin],
  25. entityOptions: {
  26. entityIdStrategy: new UuidIdStrategy(),
  27. },
  28. }),
  29. );
  30. let plantsFacetValue: FacetValueFragment;
  31. let furnitureFacetValue: FacetValueFragment;
  32. let photoFacetValue: FacetValueFragment;
  33. let electronicsFacetValue: FacetValueFragment;
  34. beforeAll(async () => {
  35. await server.init({
  36. initialData,
  37. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-default-search.csv'),
  38. customerCount: 1,
  39. });
  40. await adminClient.asSuperAdmin();
  41. // A precaution against a race condition in which the index
  42. // rebuild is not completed in time for the first test.
  43. await new Promise(resolve => setTimeout(resolve, 5000));
  44. const { facets } = await adminClient.query<GetFacetListQuery, GetFacetListQueryVariables>(
  45. GET_FACET_LIST,
  46. {
  47. options: {
  48. sort: {
  49. name: SortOrder.ASC,
  50. },
  51. },
  52. },
  53. );
  54. plantsFacetValue = facets.items[0].values.find(v => v.code === 'plants')!;
  55. furnitureFacetValue = facets.items[0].values.find(v => v.code === 'furniture')!;
  56. photoFacetValue = facets.items[0].values.find(v => v.code === 'photo')!;
  57. electronicsFacetValue = facets.items[0].values.find(v => v.code === 'electronics')!;
  58. }, TEST_SETUP_TIMEOUT_MS);
  59. afterAll(async () => {
  60. await awaitRunningJobs(adminClient);
  61. await server.destroy();
  62. });
  63. it('can filter by facetValueIds', async () => {
  64. const result = await shopClient.query<SearchProductsShopQuery, SearchProductsShopQueryVariables>(
  65. SEARCH_PRODUCTS_SHOP,
  66. {
  67. input: {
  68. facetValueIds: [plantsFacetValue.id],
  69. groupByProduct: true,
  70. sort: { name: SortOrder.ASC },
  71. },
  72. },
  73. );
  74. expect(result.search.items.map(i => i.productName)).toEqual([
  75. 'Bonsai Tree',
  76. 'Orchid',
  77. 'Spiky Cactus',
  78. ]);
  79. });
  80. it('can filter by facetValueFilters', async () => {
  81. const { facets } = await adminClient.query<GetFacetListQuery, GetFacetListQueryVariables>(
  82. GET_FACET_LIST,
  83. );
  84. const result = await shopClient.query<SearchProductsShopQuery, SearchProductsShopQueryVariables>(
  85. SEARCH_PRODUCTS_SHOP,
  86. {
  87. input: {
  88. facetValueFilters: [
  89. { and: electronicsFacetValue.id },
  90. { or: [plantsFacetValue.id, photoFacetValue.id] },
  91. ],
  92. sort: { name: SortOrder.ASC },
  93. groupByProduct: true,
  94. },
  95. },
  96. );
  97. expect(result.search.items.map(i => i.productName)).toEqual([
  98. 'Camera Lens',
  99. 'Instant Camera',
  100. 'Slr Camera',
  101. 'Tripod',
  102. ]);
  103. });
  104. });