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

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