entity-hydrator.e2e-spec.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* tslint:disable:no-non-null-assertion */
  2. import { mergeConfig, Product } from '@vendure/core';
  3. import { createTestEnvironment } from '@vendure/testing';
  4. import gql from 'graphql-tag';
  5. import path from 'path';
  6. import { initialData } from '../../../e2e-common/e2e-initial-data';
  7. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  8. import { HydrationTestPlugin } from './fixtures/test-plugins/hydration-test-plugin';
  9. describe('Entity hydration', () => {
  10. const { server, adminClient } = createTestEnvironment(
  11. mergeConfig(testConfig, {
  12. plugins: [HydrationTestPlugin],
  13. }),
  14. );
  15. beforeAll(async () => {
  16. await server.init({
  17. initialData,
  18. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  19. customerCount: 1,
  20. });
  21. await adminClient.asSuperAdmin();
  22. }, TEST_SETUP_TIMEOUT_MS);
  23. afterAll(async () => {
  24. await server.destroy();
  25. });
  26. it('includes existing relations', async () => {
  27. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  28. id: 'T_1',
  29. });
  30. expect(hydrateProduct.facetValues).toBeDefined();
  31. expect(hydrateProduct.facetValues.length).toBe(2);
  32. });
  33. it('hydrates top-level single relation', async () => {
  34. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  35. id: 'T_1',
  36. });
  37. expect(hydrateProduct.featuredAsset.name).toBe('derick-david-409858-unsplash.jpg');
  38. });
  39. it('hydrates top-level array relation', async () => {
  40. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  41. id: 'T_1',
  42. });
  43. expect(hydrateProduct.assets.length).toBe(1);
  44. expect(hydrateProduct.assets[0].asset.name).toBe('derick-david-409858-unsplash.jpg');
  45. });
  46. it('hydrates nested single relation', async () => {
  47. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  48. id: 'T_1',
  49. });
  50. expect(hydrateProduct.variants[0].product.id).toBe('T_1');
  51. });
  52. it('hydrates nested array relation', async () => {
  53. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  54. id: 'T_1',
  55. });
  56. expect(hydrateProduct.variants[0].options.length).toBe(2);
  57. });
  58. it('translates top-level translatable', async () => {
  59. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  60. id: 'T_1',
  61. });
  62. expect(hydrateProduct.variants.map(v => v.name).sort()).toEqual([
  63. 'Laptop 13 inch 16GB',
  64. 'Laptop 13 inch 8GB',
  65. 'Laptop 15 inch 16GB',
  66. 'Laptop 15 inch 8GB',
  67. ]);
  68. });
  69. it('translates nested translatable', async () => {
  70. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  71. id: 'T_1',
  72. });
  73. expect(
  74. getVariantWithName(hydrateProduct, 'Laptop 13 inch 8GB')
  75. .options.map(o => o.name)
  76. .sort(),
  77. ).toEqual(['13 inch', '8GB']);
  78. });
  79. it('translates nested translatable 2', async () => {
  80. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  81. id: 'T_1',
  82. });
  83. expect(hydrateProduct.assets[0].product.name).toBe('Laptop');
  84. });
  85. it('populates ProductVariant price data', async () => {
  86. const { hydrateProduct } = await adminClient.query<HydrateProductQuery>(GET_HYDRATED_PRODUCT, {
  87. id: 'T_1',
  88. });
  89. expect(getVariantWithName(hydrateProduct, 'Laptop 13 inch 8GB').price).toBe(129900);
  90. expect(getVariantWithName(hydrateProduct, 'Laptop 13 inch 8GB').priceWithTax).toBe(155880);
  91. expect(getVariantWithName(hydrateProduct, 'Laptop 13 inch 16GB').price).toBe(219900);
  92. expect(getVariantWithName(hydrateProduct, 'Laptop 13 inch 16GB').priceWithTax).toBe(263880);
  93. expect(getVariantWithName(hydrateProduct, 'Laptop 15 inch 8GB').price).toBe(139900);
  94. expect(getVariantWithName(hydrateProduct, 'Laptop 15 inch 8GB').priceWithTax).toBe(167880);
  95. expect(getVariantWithName(hydrateProduct, 'Laptop 15 inch 16GB').price).toBe(229900);
  96. expect(getVariantWithName(hydrateProduct, 'Laptop 15 inch 16GB').priceWithTax).toBe(275880);
  97. });
  98. });
  99. function getVariantWithName(product: Product, name: string) {
  100. return product.variants.find(v => v.name === name)!;
  101. }
  102. type HydrateProductQuery = { hydrateProduct: Product };
  103. const GET_HYDRATED_PRODUCT = gql`
  104. query GetHydratedProduct($id: ID!) {
  105. hydrateProduct(id: $id)
  106. }
  107. `;