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

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