2022-08-13 15:12:31 +05:30
// See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
// for documentation on this spec.
2023-01-13 00:05:48 +05:30
//
// NOTE: Unlike the backend markdown_snapshot_spec.rb which has a CE and EE version, there is only
// one version of this spec. This is because the frontend markdown rendering does not require EE-only
// backend features.
2023-03-17 16:20:25 +05:30
import jsYaml from 'js-yaml' ;
import { pick } from 'lodash' ;
import glfmExampleStatusYml from '../../../glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml' ;
import markdownYml from '../../../glfm_specification/output_example_snapshots/markdown.yml' ;
import htmlYml from '../../../glfm_specification/output_example_snapshots/html.yml' ;
import prosemirrorJsonYml from '../../../glfm_specification/output_example_snapshots/prosemirror_json.yml' ;
import {
IMPLEMENTATION _ERROR _MSG ,
renderHtmlAndJsonForAllExamples ,
} from './render_html_and_json_for_all_examples' ;
jest . mock ( '~/emoji' ) ;
const filterExamples = ( examples ) => {
const focusedMarkdownExamples = process . env . FOCUSED _MARKDOWN _EXAMPLES ? . split ( ',' ) || [ ] ;
if ( ! focusedMarkdownExamples . length ) {
return examples ;
}
return pick ( examples , focusedMarkdownExamples ) ;
} ;
const loadExamples = ( yaml ) => {
const examples = jsYaml . safeLoad ( yaml , { } ) ;
return filterExamples ( examples ) ;
} ;
describe ( 'markdown example snapshots in ContentEditor' , ( ) => {
let actualHtmlAndJsonExamples ;
let skipRunningSnapshotWysiwygHtmlTests ;
let skipRunningSnapshotProsemirrorJsonTests ;
const exampleStatuses = loadExamples ( glfmExampleStatusYml ) ;
const markdownExamples = loadExamples ( markdownYml ) ;
const expectedHtmlExamples = loadExamples ( htmlYml ) ;
const expectedProseMirrorJsonExamples = loadExamples ( prosemirrorJsonYml ) ;
const exampleNames = Object . keys ( markdownExamples ) ;
beforeAll ( async ( ) => {
return renderHtmlAndJsonForAllExamples ( markdownExamples ) . then ( ( examples ) => {
actualHtmlAndJsonExamples = examples ;
} ) ;
} ) ;
describe . each ( exampleNames ) ( '%s' , ( name ) => {
const exampleNamePrefix = 'verifies conversion of GLFM to' ;
skipRunningSnapshotWysiwygHtmlTests =
exampleStatuses [ name ] ? . skip _running _snapshot _wysiwyg _html _tests ;
skipRunningSnapshotProsemirrorJsonTests =
exampleStatuses [ name ] ? . skip _running _snapshot _prosemirror _json _tests ;
const markdown = markdownExamples [ name ] ;
if ( skipRunningSnapshotWysiwygHtmlTests ) {
it . todo ( ` ${ exampleNamePrefix } HTML: ${ skipRunningSnapshotWysiwygHtmlTests } ` ) ;
} else {
it ( ` ${ exampleNamePrefix } HTML ` , async ( ) => {
const expectedHtml = expectedHtmlExamples [ name ] . wysiwyg ;
const { html : actualHtml } = actualHtmlAndJsonExamples [ name ] ;
// noinspection JSUnresolvedFunction (required to avoid RubyMine type inspection warning, because custom matchers auto-imported via Jest test setup are not automatically resolved - see https://youtrack.jetbrains.com/issue/WEB-42350/matcher-for-jest-is-not-recognized-but-it-is-runable)
expect ( actualHtml ) . toMatchExpectedForMarkdown (
'HTML' ,
name ,
markdown ,
IMPLEMENTATION _ERROR _MSG ,
expectedHtml ,
) ;
} ) ;
}
if ( skipRunningSnapshotProsemirrorJsonTests ) {
it . todo ( ` ${ exampleNamePrefix } ProseMirror JSON: ${ skipRunningSnapshotProsemirrorJsonTests } ` ) ;
} else {
it ( ` ${ exampleNamePrefix } ProseMirror JSON ` , async ( ) => {
const expectedJson = expectedProseMirrorJsonExamples [ name ] ;
const { json : actualJson } = actualHtmlAndJsonExamples [ name ] ;
// noinspection JSUnresolvedFunction
expect ( actualJson ) . toMatchExpectedForMarkdown (
'JSON' ,
name ,
markdown ,
IMPLEMENTATION _ERROR _MSG ,
expectedJson ,
) ;
} ) ;
}
} ) ;
} ) ;