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');
});
});
});
|