mirror of https://github.com/grafana/grafana
Chore: Test `grafana/public/app/plugins/panel/text/TextPanel.tsx` (#52244)
* move sanitize test to its own test file * add a test for renderTextPanelMarkdown to always sanitize * setup TextPanel tests * add tests to always sanitize Text Panel contents and always convert correctly to html/markdownpull/51705/head
parent
13b23fd512
commit
bec500b69f
@ -0,0 +1,12 @@ |
|||||||
|
import { sanitizeTextPanelContent } from './sanitize'; |
||||||
|
|
||||||
|
describe('Sanitize wrapper', () => { |
||||||
|
it('should allow whitelisted styles in text panel', () => { |
||||||
|
const html = |
||||||
|
'<div style="display:flex; flex-direction: column; flex-wrap: wrap; justify-content: start; gap: 2px;"><div style="flex-basis: 50%"></div></div>'; |
||||||
|
const str = sanitizeTextPanelContent(html); |
||||||
|
expect(str).toBe( |
||||||
|
'<div style="display:flex; flex-direction:column; flex-wrap:wrap; justify-content:start; gap:2px;"><div style="flex-basis:50%;"></div></div>' |
||||||
|
); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,120 @@ |
|||||||
|
import { render, screen } from '@testing-library/react'; |
||||||
|
import React from 'react'; |
||||||
|
|
||||||
|
import { dateTime, LoadingState, EventBusSrv } from '@grafana/data'; |
||||||
|
|
||||||
|
import { Props, TextPanel } from './TextPanel'; |
||||||
|
import { TextMode } from './models.gen'; |
||||||
|
|
||||||
|
const replaceVariablesMock = jest.fn(); |
||||||
|
const defaultProps: Props = { |
||||||
|
id: 1, |
||||||
|
data: { |
||||||
|
state: LoadingState.Done, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
fields: [], |
||||||
|
length: 0, |
||||||
|
}, |
||||||
|
], |
||||||
|
timeRange: { |
||||||
|
from: dateTime('2022-01-01T15:55:00Z'), |
||||||
|
to: dateTime('2022-07-12T15:55:00Z'), |
||||||
|
raw: { |
||||||
|
from: 'now-15m', |
||||||
|
to: 'now', |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
timeRange: { |
||||||
|
from: dateTime('2022-07-11T15:55:00Z'), |
||||||
|
to: dateTime('2022-07-12T15:55:00Z'), |
||||||
|
raw: { |
||||||
|
from: 'now-15m', |
||||||
|
to: 'now', |
||||||
|
}, |
||||||
|
}, |
||||||
|
timeZone: 'utc', |
||||||
|
transparent: false, |
||||||
|
width: 120, |
||||||
|
height: 120, |
||||||
|
fieldConfig: { |
||||||
|
defaults: {}, |
||||||
|
overrides: [], |
||||||
|
}, |
||||||
|
renderCounter: 1, |
||||||
|
title: 'Test Text Panel', |
||||||
|
eventBus: new EventBusSrv(), |
||||||
|
options: { content: '', mode: TextMode.Markdown }, |
||||||
|
onOptionsChange: jest.fn(), |
||||||
|
onFieldConfigChange: jest.fn(), |
||||||
|
replaceVariables: replaceVariablesMock, |
||||||
|
onChangeTimeRange: jest.fn(), |
||||||
|
}; |
||||||
|
|
||||||
|
const setup = (props: Props = defaultProps) => { |
||||||
|
render(<TextPanel {...props} />); |
||||||
|
}; |
||||||
|
|
||||||
|
describe('TextPanel', () => { |
||||||
|
it('should render panel without content', () => { |
||||||
|
expect(() => setup()).not.toThrow(); |
||||||
|
}); |
||||||
|
|
||||||
|
it('sanitizes content in html mode', () => { |
||||||
|
const contentTest = '<form><p>Form tags are sanitized.</p></form>\n<script>Script tags are sanitized.</script>'; |
||||||
|
replaceVariablesMock.mockReturnValueOnce(contentTest); |
||||||
|
const props = Object.assign({}, defaultProps, { |
||||||
|
options: { content: contentTest, mode: TextMode.HTML }, |
||||||
|
}); |
||||||
|
|
||||||
|
setup(props); |
||||||
|
|
||||||
|
expect(screen.getByTestId('TextPanel-converted-content').innerHTML).toEqual( |
||||||
|
'<form><p>Form tags are sanitized.</p></form>\n<script>Script tags are sanitized.</script>' |
||||||
|
); |
||||||
|
}); |
||||||
|
|
||||||
|
it('sanitizes content in markdown mode', () => { |
||||||
|
const contentTest = '<form><p>Form tags are sanitized.</p></form>\n<script>Script tags are sanitized.</script>'; |
||||||
|
replaceVariablesMock.mockReturnValueOnce(contentTest); |
||||||
|
|
||||||
|
const props = Object.assign({}, defaultProps, { |
||||||
|
options: { content: contentTest, mode: TextMode.Markdown }, |
||||||
|
}); |
||||||
|
|
||||||
|
setup(props); |
||||||
|
|
||||||
|
expect(screen.getByTestId('TextPanel-converted-content').innerHTML).toEqual( |
||||||
|
'<form><p>Form tags are sanitized.</p></form>\n<script>Script tags are sanitized.</script>' |
||||||
|
); |
||||||
|
}); |
||||||
|
|
||||||
|
it('converts content to markdown when in markdown mode', async () => { |
||||||
|
const contentTest = 'We begin by a simple sentence.\n```code block```'; |
||||||
|
replaceVariablesMock.mockReturnValueOnce(contentTest); |
||||||
|
|
||||||
|
const props = Object.assign({}, defaultProps, { |
||||||
|
options: { content: contentTest, mode: TextMode.Markdown }, |
||||||
|
}); |
||||||
|
|
||||||
|
setup(props); |
||||||
|
|
||||||
|
const waited = await screen.getByTestId('TextPanel-converted-content'); |
||||||
|
expect(waited.innerHTML).toEqual('<p>We begin by a simple sentence.\n<code>code block</code></p>\n'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('converts content to html when in html mode', () => { |
||||||
|
const contentTest = 'We begin by a simple sentence.\n```This is a code block\n```'; |
||||||
|
replaceVariablesMock.mockReturnValueOnce(contentTest); |
||||||
|
const props = Object.assign({}, defaultProps, { |
||||||
|
options: { content: contentTest, mode: TextMode.HTML }, |
||||||
|
}); |
||||||
|
|
||||||
|
setup(props); |
||||||
|
|
||||||
|
expect(screen.getByTestId('TextPanel-converted-content').innerHTML).toEqual( |
||||||
|
'We begin by a simple sentence.\n```This is a code block\n```' |
||||||
|
); |
||||||
|
}); |
||||||
|
}); |
Loading…
Reference in new issue