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

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