renderMap.test.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { assert, describe, expect, test } from 'vitest';
  2. import {
  3. addToRenderMap,
  4. BaseFragment,
  5. createRenderMap,
  6. mapRenderMapContent,
  7. mapRenderMapContentAsync,
  8. mergeRenderMaps,
  9. removeFromRenderMap,
  10. } from '../src';
  11. describe('createRenderMap', () => {
  12. test('it creates an empty render map', () => {
  13. expect(createRenderMap()).toStrictEqual(new Map());
  14. });
  15. test('it creates a render map from a path and a string', () => {
  16. expect(createRenderMap('some/path', 'Some content')).toStrictEqual(new Map([['some/path', 'Some content']]));
  17. });
  18. test('it creates a render map from a path and a fragment', () => {
  19. const fragment: BaseFragment = { content: 'Some fragment content' };
  20. expect(createRenderMap('some/fragment/path', fragment)).toStrictEqual(
  21. new Map([['some/fragment/path', 'Some fragment content']]),
  22. );
  23. });
  24. test('it creates a render map from a record of entries', () => {
  25. expect(
  26. createRenderMap({
  27. 'some/fragment/path': { content: 'Some fragment content' },
  28. 'some/path': 'Some content',
  29. }),
  30. ).toStrictEqual(
  31. new Map([
  32. ['some/fragment/path', 'Some fragment content'],
  33. ['some/path', 'Some content'],
  34. ]),
  35. );
  36. });
  37. test('it removes undefined entries from the provided record', () => {
  38. expect(
  39. createRenderMap({
  40. 'some/path': 'Some content',
  41. 'some/path/undefined': undefined,
  42. }),
  43. ).toStrictEqual(new Map([['some/path', 'Some content']]));
  44. });
  45. test('it freezes the returned render map', () => {
  46. assert.isFrozen(createRenderMap());
  47. assert.isFrozen(createRenderMap('some/path', 'Some content'));
  48. assert.isFrozen(createRenderMap({ 'some/path': 'Some content' }));
  49. });
  50. });
  51. describe('addToRenderMap', () => {
  52. test('it adds new entries to render map', () => {
  53. const renderMap = createRenderMap('some/path', 'Some content');
  54. expect(addToRenderMap(renderMap, 'some/new/path', 'Some new content')).toStrictEqual(
  55. new Map([
  56. ['some/path', 'Some content'],
  57. ['some/new/path', 'Some new content'],
  58. ]),
  59. );
  60. });
  61. test('it overwrites existing entries in the render map', () => {
  62. const renderMap = createRenderMap('some/path', 'Some content');
  63. expect(addToRenderMap(renderMap, 'some/path', 'Some new content')).toStrictEqual(
  64. new Map([['some/path', 'Some new content']]),
  65. );
  66. });
  67. test('it freezes the returned render map', () => {
  68. assert.isFrozen(addToRenderMap(createRenderMap(), 'some/new/path', 'Some new content'));
  69. });
  70. });
  71. describe('removeFromRenderMap', () => {
  72. test('it removes existing entries from a render map', () => {
  73. const renderMap = createRenderMap({ pathA: 'Content A', pathB: 'Content B' });
  74. expect(removeFromRenderMap(renderMap, 'pathA')).toStrictEqual(new Map([['pathB', 'Content B']]));
  75. });
  76. test('it can remove the last entry of a render map', () => {
  77. const renderMap = createRenderMap('pathA', 'Content A');
  78. expect(removeFromRenderMap(renderMap, 'pathA')).toStrictEqual(new Map());
  79. });
  80. test('it ignores missing paths', () => {
  81. const renderMap = createRenderMap();
  82. expect(removeFromRenderMap(renderMap, 'missingPaths')).toStrictEqual(new Map());
  83. });
  84. test('it freezes the returned render map', () => {
  85. assert.isFrozen(removeFromRenderMap(createRenderMap(), 'some/path'));
  86. });
  87. });
  88. describe('mergeRenderMaps', () => {
  89. test('it returns an empty render map when no maps are provided', () => {
  90. expect(mergeRenderMaps([])).toStrictEqual(new Map());
  91. });
  92. test('it returns the first render map as-is when only one map is provided', () => {
  93. const renderMap = createRenderMap('pathA', 'ContentA');
  94. expect(mergeRenderMaps([renderMap])).toBe(renderMap);
  95. });
  96. test('it merges the entries of two render maps', () => {
  97. expect(
  98. mergeRenderMaps([createRenderMap('pathA', 'ContentA'), createRenderMap('pathB', 'ContentB')]),
  99. ).toStrictEqual(
  100. new Map([
  101. ['pathA', 'ContentA'],
  102. ['pathB', 'ContentB'],
  103. ]),
  104. );
  105. });
  106. test('later entries overwrite earlier entries', () => {
  107. expect(
  108. mergeRenderMaps([createRenderMap('samePath', 'Old content'), createRenderMap('samePath', 'New content')]),
  109. ).toStrictEqual(new Map([['samePath', 'New content']]));
  110. });
  111. test('it merges the entries of two render maps', () => {
  112. expect(
  113. mergeRenderMaps([createRenderMap('pathA', 'ContentA'), createRenderMap('pathB', 'ContentB')]),
  114. ).toStrictEqual(
  115. new Map([
  116. ['pathA', 'ContentA'],
  117. ['pathB', 'ContentB'],
  118. ]),
  119. );
  120. });
  121. test('it freezes the returned render map', () => {
  122. assert.isFrozen(mergeRenderMaps([]));
  123. assert.isFrozen(mergeRenderMaps([createRenderMap('pathA', 'ContentA')]));
  124. assert.isFrozen(mergeRenderMaps([createRenderMap('pathA', 'ContentA'), createRenderMap('pathB', 'ContentB')]));
  125. });
  126. });
  127. describe('mapRenderMapContent', () => {
  128. test('it maps the content of all entries inside a render map', () => {
  129. expect(
  130. mapRenderMapContent(
  131. createRenderMap({
  132. pathA: 'ContentA',
  133. pathB: 'ContentB',
  134. }),
  135. content => `Mapped: ${content}`,
  136. ),
  137. ).toStrictEqual(
  138. new Map([
  139. ['pathA', 'Mapped: ContentA'],
  140. ['pathB', 'Mapped: ContentB'],
  141. ]),
  142. );
  143. });
  144. test('it freezes the returned render map', () => {
  145. assert.isFrozen(mapRenderMapContent(createRenderMap(), c => c));
  146. });
  147. });
  148. describe('mapRenderMapContentAsync', () => {
  149. test('it maps the content of all entries inside a render map', async () => {
  150. expect(
  151. await mapRenderMapContentAsync(
  152. createRenderMap({
  153. pathA: 'ContentA',
  154. pathB: 'ContentB',
  155. }),
  156. content => Promise.resolve(`Mapped: ${content}`),
  157. ),
  158. ).toStrictEqual(
  159. new Map([
  160. ['pathA', 'Mapped: ContentA'],
  161. ['pathB', 'Mapped: ContentB'],
  162. ]),
  163. );
  164. });
  165. test('it freezes the returned render map', async () => {
  166. assert.isFrozen(await mapRenderMapContentAsync(createRenderMap(), c => Promise.resolve(c)));
  167. });
  168. });