Welcome to mirror list, hosted at ThFree Co, Russian Federation.

asset_resolver_spec.js « services « content_editor « frontend « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 292eec6db77bfd9108312326ec89a0c4da5b3030 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import AssetResolver from '~/content_editor/services/asset_resolver';
import {
  RESOLVED_ISSUE_HTML,
  RESOLVED_MERGE_REQUEST_HTML,
  RESOLVED_EPIC_HTML,
} from '../test_constants';

describe('content_editor/services/asset_resolver', () => {
  let renderMarkdown;
  let assetResolver;

  beforeEach(() => {
    renderMarkdown = jest.fn();
    assetResolver = new AssetResolver({ renderMarkdown });
  });

  describe('resolveUrl', () => {
    it('resolves a canonical url to an absolute url', async () => {
      renderMarkdown.mockResolvedValue(
        '<p><a href="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png">link</a></p>',
      );

      expect(await assetResolver.resolveUrl('test-file.png')).toBe(
        '/group1/project1/-/wikis/test-file.png',
      );
    });
  });

  describe('resolveReference', () => {
    const resolvedEpic = {
      expandedText: 'Approvals in merge request list (&1)',
      fullyExpandedText: 'Approvals in merge request list (&1)',
      href: '/groups/gitlab-org/-/epics/1',
      text: '&1',
    };

    const resolvedIssue = {
      expandedText: '500 error on MR approvers edit page (#1 - closed)',
      fullyExpandedText: '500 error on MR approvers edit page (#1 - closed) • Unassigned',
      href: '/gitlab-org/gitlab/-/issues/1',
      text: '#1 (closed)',
    };

    const resolvedMergeRequest = {
      expandedText: 'Enhance the LDAP group synchronization (!1 - merged)',
      fullyExpandedText: 'Enhance the LDAP group synchronization (!1 - merged) • John Doe',
      href: '/gitlab-org/gitlab/-/merge_requests/1',
      text: '!1 (merged)',
    };

    describe.each`
      referenceType      | referenceId | sentMarkdown     | returnedHtml                   | resolvedReference
      ${'issue'}         | ${'#1'}     | ${'#1 #1+ #1+s'} | ${RESOLVED_ISSUE_HTML}         | ${resolvedIssue}
      ${'merge_request'} | ${'!1'}     | ${'!1 !1+ !1+s'} | ${RESOLVED_MERGE_REQUEST_HTML} | ${resolvedMergeRequest}
      ${'epic'}          | ${'&1'}     | ${'&1 &1+ &1+s'} | ${RESOLVED_EPIC_HTML}          | ${resolvedEpic}
    `(
      'for reference type $referenceType',
      ({ referenceType, referenceId, sentMarkdown, returnedHtml, resolvedReference }) => {
        it(`resolves ${referenceType} reference to href, text, title and summary`, async () => {
          renderMarkdown.mockResolvedValue(returnedHtml);

          expect(await assetResolver.resolveReference(referenceId)).toEqual(resolvedReference);
        });

        it.each`
          suffix
          ${''}
          ${'+'}
          ${'+s'}
        `('strips suffix ("$suffix") before resolving', ({ suffix }) => {
          assetResolver.resolveReference(referenceId + suffix);
          expect(renderMarkdown).toHaveBeenCalledWith(sentMarkdown);
        });
      },
    );

    it.each`
      case                              | sentMarkdown        | returnedHtml
      ${'no html is returned'}          | ${''}               | ${''}
      ${'html contains no anchor tags'} | ${'no anchor tags'} | ${'<p>no anchor tags</p>'}
    `('returns an empty object if $case', async ({ sentMarkdown, returnedHtml }) => {
      renderMarkdown.mockResolvedValue(returnedHtml);

      expect(await assetResolver.resolveReference(sentMarkdown)).toEqual({});
    });
  });

  describe('renderDiagram', () => {
    it('resolves a diagram code to a url containing the diagram image', async () => {
      renderMarkdown.mockResolvedValue(
        '<p><img data-diagram="nomnoml" src="url/to/some/diagram"></p>',
      );

      expect(await assetResolver.renderDiagram('test')).toBe('url/to/some/diagram');
    });
  });
});