collab/mermaid/cypress/helpers/util.tsblame
View source
6dd74de1/* eslint-disable @typescript-eslint/no-explicit-any */
6dd74de2import { Buffer } from 'buffer';
6dd74de3import type { MermaidConfig } from '../../packages/mermaid/src/config.type.js';
6dd74de4
6dd74de5interface CypressConfig {
6dd74de6 listUrl?: boolean;
6dd74de7 listId?: string;
6dd74de8 name?: string;
6dd74de9 screenshot?: boolean;
6dd74de10}
6dd74de11type CypressMermaidConfig = MermaidConfig & CypressConfig;
6dd74de12
6dd74de13interface CodeObject {
6dd74de14 code: string | string[];
6dd74de15 mermaid: CypressMermaidConfig;
6dd74de16}
6dd74de17
6dd74de18export const utf8ToB64 = (str: string): string => {
6dd74de19 return Buffer.from(decodeURIComponent(encodeURIComponent(str))).toString('base64');
6dd74de20};
6dd74de21
6dd74de22const batchId: string =
6dd74de23 'mermaid-batch-' +
6dd74de24 (Cypress.env('useAppli')
6dd74de25 ? Date.now().toString()
6dd74de26 : (Cypress.env('CYPRESS_COMMIT') ?? Date.now().toString()));
6dd74de27
6dd74de28export const mermaidUrl = (
6dd74de29 graphStr: string | string[],
6dd74de30 options: CypressMermaidConfig,
6dd74de31 api: boolean
6dd74de32): string => {
6dd74de33 options.handDrawnSeed = 1;
6dd74de34 const codeObject: CodeObject = {
6dd74de35 code: graphStr,
6dd74de36 mermaid: options,
6dd74de37 };
6dd74de38 const objStr: string = JSON.stringify(codeObject);
6dd74de39 let url = `/e2e.html?graph=${utf8ToB64(objStr)}`;
6dd74de40 if (api && typeof graphStr === 'string') {
6dd74de41 url = `/xss.html?graph=${graphStr}`;
6dd74de42 }
6dd74de43
6dd74de44 if (options.listUrl) {
6dd74de45 cy.log(options.listId, ' ', url);
6dd74de46 }
6dd74de47
6dd74de48 return url;
6dd74de49};
6dd74de50
6dd74de51export const imgSnapshotTest = (
6dd74de52 graphStr: string,
6dd74de53 _options: CypressMermaidConfig = {},
6dd74de54 api = false,
6dd74de55 validation?: any
6dd74de56): void => {
6dd74de57 const options: CypressMermaidConfig = {
6dd74de58 ..._options,
6dd74de59 fontFamily: _options.fontFamily ?? 'courier',
6dd74de60 // @ts-ignore TODO: Fix type of fontSize
6dd74de61 fontSize: _options.fontSize ?? '16px',
6dd74de62 sequence: {
6dd74de63 ...(_options.sequence ?? {}),
6dd74de64 actorFontFamily: 'courier',
6dd74de65 noteFontFamily: _options.sequence?.noteFontFamily ?? 'courier',
6dd74de66 messageFontFamily: 'courier',
6dd74de67 },
6dd74de68 };
6dd74de69
6dd74de70 const url: string = mermaidUrl(graphStr, options, api);
6dd74de71 openURLAndVerifyRendering(url, options, validation);
6dd74de72};
6dd74de73
6dd74de74export const urlSnapshotTest = (
6dd74de75 url: string,
6dd74de76 options: CypressMermaidConfig = {},
6dd74de77 _api = false,
6dd74de78 validation?: any
6dd74de79): void => {
6dd74de80 openURLAndVerifyRendering(url, options, validation);
6dd74de81};
6dd74de82
6dd74de83export const renderGraph = (
6dd74de84 graphStr: string | string[],
6dd74de85 options: CypressMermaidConfig = {},
6dd74de86 api = false
6dd74de87): void => {
6dd74de88 const url: string = mermaidUrl(graphStr, options, api);
6dd74de89 openURLAndVerifyRendering(url, options);
6dd74de90};
6dd74de91
6dd74de92export const openURLAndVerifyRendering = (
6dd74de93 url: string,
6dd74de94 { screenshot = true, ...options }: CypressMermaidConfig,
6dd74de95 validation?: any
6dd74de96): void => {
6dd74de97 const name: string = (options.name ?? cy.state('runnable').fullTitle()).replace(/\s+/g, '-');
6dd74de98
6dd74de99 cy.visit(url);
6dd74de100 cy.window().should('have.property', 'rendered', true);
6dd74de101
6dd74de102 // Handle sandbox mode where SVG is inside an iframe
6dd74de103 if (options.securityLevel === 'sandbox') {
6dd74de104 cy.get('iframe').should('be.visible');
6dd74de105 if (validation) {
6dd74de106 cy.get('iframe').should(validation);
6dd74de107 }
6dd74de108 } else {
6dd74de109 cy.get('svg').should('be.visible');
6dd74de110 // cspell:ignore viewbox
6dd74de111 cy.get('svg').should('not.have.attr', 'viewbox');
6dd74de112
6dd74de113 if (validation) {
6dd74de114 cy.get('svg').should(validation);
6dd74de115 }
6dd74de116 }
6dd74de117
6dd74de118 if (screenshot) {
6dd74de119 verifyScreenshot(name);
6dd74de120 }
6dd74de121};
6dd74de122
6dd74de123export const verifyScreenshot = (name: string): void => {
6dd74de124 const useAppli: boolean = Cypress.env('useAppli');
6dd74de125 const useArgos: boolean = Cypress.env('useArgos');
6dd74de126
6dd74de127 if (useAppli) {
6dd74de128 cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`);
6dd74de129 cy.eyesOpen({
6dd74de130 appName: 'Mermaid',
6dd74de131 testName: name,
6dd74de132 batchName: Cypress.spec.name,
6dd74de133 batchId: batchId + Cypress.spec.name,
6dd74de134 });
6dd74de135 cy.log(`Check eyes ${Cypress.spec.name}`);
6dd74de136 cy.eyesCheckWindow('Click!');
6dd74de137 cy.log(`Closing eyes ${Cypress.spec.name}`);
6dd74de138 cy.eyesClose();
6dd74de139 } else if (useArgos) {
6dd74de140 cy.argosScreenshot(name, {
6dd74de141 threshold: 0.01,
6dd74de142 });
6dd74de143 } else {
6dd74de144 cy.matchImageSnapshot(name);
6dd74de145 }
6dd74de146};
6dd74de147
6dd74de148export const verifyNumber = (value: number, expected: number, deltaPercent = 10): void => {
6dd74de149 expect(value).to.be.within(
6dd74de150 expected * (1 - deltaPercent / 100),
6dd74de151 expected * (1 + deltaPercent / 100)
6dd74de152 );
6dd74de153};