Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 39 additions & 1 deletion karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,49 @@ const runChrome = typeof argv.chrome !== 'undefined';

const rootPath = __dirname;

const failedTestsReporter = function (baseReporterDecorator) {
baseReporterDecorator(this);

const failedTests = [];

const RED = '\x1b[31m';
const RESET = '\x1b[0m';
const BOLD = '\x1b[1m';
const GREEN = '\x1b[32m';

this.onSpecComplete = function (browser, result) {
if (!result.success) {
failedTests.push({
description: result.description,
suite: result.suite.join(' > '),
log: result.log,
});
}
};

this.onRunComplete = function () {
if (failedTests.length > 0) {
console.log(`\n\n${RED}${BOLD}=== ❌ Failed Tests Summary ===${RESET}\n`);
failedTests.forEach((test, index) => {
console.log(`${index + 1}. ${test.suite} > ${test.description}`);
test.log.forEach(log => console.log(` ${log}`));
console.log('');
});
} else {
console.log(`${GREEN}✅ All tests passed successfully${RESET}`);
}
};
};

failedTestsReporter.$inject = ['baseReporterDecorator'];

module.exports = function (config) {
const plugins = [
'karma-webpack',
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-sourcemap-loader',
{ 'reporter:failed-summary': ['type', failedTestsReporter] },
];
const launcher = [];

Expand Down Expand Up @@ -113,10 +150,11 @@ module.exports = function (config) {
// Concurrency level
// how many browser should be started simultaneous
concurrency: Infinity,
reporters: ['failed-summary'],
};

if (runCoverage) {
settings.reporters = ['coverage-istanbul'];
settings.reporters = ['coverage-istanbul', 'failed-summary'];
settings.coverageIstanbulReporter = {
reports: ['html', 'lcovonly', 'text-summary'],
dir: './dist/deploy/coverage',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as createDomToModelContext from 'roosterjs-content-model-dom/lib/domToM
import * as createPasteEntityProcessor from '../../../lib/override/pasteEntityProcessor';
import * as createPasteGeneralProcessor from '../../../lib/override/pasteGeneralProcessor';
import { containerSizeFormatParser } from '../../../lib/override/containerSizeFormatParser';
import { createDefaultDomToModelContext } from '../../testUtils';
import { createDomToModelContextForSanitizing } from '../../../lib/command/createModelFromHtml/createDomToModelContextForSanitizing';
import { DomToModelOptionForSanitizing } from 'roosterjs-content-model-types';
import { pasteBlockEntityParser } from '../../../lib/override/pasteCopyBlockEntityParser';
Expand All @@ -13,15 +14,7 @@ describe('createDomToModelContextForSanitizing', () => {
const mockedPasteGeneralProcessor = 'GENERALPROCESSOR' as any;
const mockedPasteEntityProcessor = 'ENTITYPROCESSOR' as any;
const mockedResult = 'CONTEXT' as any;
const defaultOptions: DomToModelOptionForSanitizing = {
processorOverride: {},
formatParserOverride: {},
additionalFormatParsers: {},
additionalAllowedTags: [],
additionalDisallowedTags: [],
styleSanitizers: {},
attributeSanitizers: {},
};
const defaultOptions: DomToModelOptionForSanitizing = createDefaultDomToModelContext();
let createDomToModelContextSpy: jasmine.Spy;

let createPasteGeneralProcessorSpy: jasmine.Spy;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { createDefaultDomToModelContext } from '../../testUtils';
import { generatePasteOptionFromPlugins } from '../../../lib/command/paste/generatePasteOptionFromPlugins';
import { IEditor } from 'roosterjs-content-model-types';

Expand Down Expand Up @@ -66,15 +67,7 @@ describe('generatePasteOptionFromPlugins', () => {
htmlAfter: htmlAfter,
htmlAttributes: mockedMetadata,
pasteType: 'normal',
domToModelOption: {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
},
domToModelOption: createDefaultDomToModelContext(),
containsBlockElements: false,
});
expect(triggerPluginEventSpy).toHaveBeenCalledWith(
Expand Down Expand Up @@ -205,15 +198,7 @@ describe('generatePasteOptionFromPlugins', () => {
htmlAfter: '',
htmlAttributes: mockedMetadata,
pasteType: 'mergeFormat',
domToModelOption: {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
},
domToModelOption: createDefaultDomToModelContext(),
containsBlockElements: false,
});
});
Expand Down
13 changes: 13 additions & 0 deletions packages/roosterjs-content-model-core/test/testUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { DomToModelOptionForSanitizing } from 'roosterjs-content-model-types';

export const createDefaultDomToModelContext = (): DomToModelOptionForSanitizing => {
return {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
};
};
14 changes: 14 additions & 0 deletions packages/roosterjs-content-model-dom/test/testUtils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { DomToModelOptionForSanitizing } from 'roosterjs-content-model-types';

export function expectHtml(actualHtml: string, expectedHtml: string | string[]) {
expectedHtml = Array.isArray(expectedHtml) ? expectedHtml : [expectedHtml];
expect(expectedHtml.indexOf(actualHtml)).toBeGreaterThanOrEqual(0, actualHtml);
Expand Down Expand Up @@ -29,3 +31,15 @@ export function itChromeOnly(
const func = __karma__.config.browser == 'Chrome' ? it : xit;
return func(expectation, assertion, timeout);
}

export const createDefaultDomToModelContext = (): DomToModelOptionForSanitizing => {
return {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
};
};
15 changes: 14 additions & 1 deletion packages/roosterjs-content-model-plugins/test/TestHelper.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Editor } from 'roosterjs-content-model-core';
import {
ContentModelDocument,
CoreApiMap,
DomToModelOptionForSanitizing,
EditorPlugin,
IEditor,
} from 'roosterjs-content-model-types';
import { Editor } from 'roosterjs-content-model-core';

export function initEditor(
id: string,
Expand Down Expand Up @@ -39,3 +40,15 @@ export function removeElement(id: string) {
node.parentNode.removeChild(node);
}
}

export const createDefaultDomToModelContext = (): DomToModelOptionForSanitizing => {
return {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
};
};
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { createDefaultDomToModelContext } from '../TestHelper';
import type { BeforePasteEvent, ClipboardData } from 'roosterjs-content-model-types';

export function createBeforePasteEventMock(
Expand All @@ -12,14 +13,6 @@ export function createBeforePasteEventMock(
htmlAfter: '',
htmlAttributes: {},
pasteType: 'normal',
domToModelOption: {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
attributeSanitizers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
},
domToModelOption: createDefaultDomToModelContext(),
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import * as PowerPointFile from '../../../lib/paste/PowerPoint/processPastedCont
import * as setProcessor from '../../../lib/paste/utils/setProcessor';
import * as WacFile from '../../../lib/paste/WacComponents/processPastedContentWacComponents';
import { BeforePasteEvent, DOMCreator, IEditor } from 'roosterjs-content-model-types';
import { createDefaultDomToModelContext } from '../../TestHelper';
import { PastePlugin } from '../../../lib/paste/PastePlugin';
import { PastePropertyNames } from '../../../lib/paste/pasteSourceValidations/constants';

Expand Down Expand Up @@ -47,15 +48,7 @@ describe('Content Model Paste Plugin Test', () => {
htmlAfter: '',
htmlAttributes: {},
pasteType: 'normal',
domToModelOption: {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
} as any,
domToModelOption: createDefaultDomToModelContext(),
};
});

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as moveChildNodes from 'roosterjs-content-model-dom/lib/domUtils/moveChildNodes';
import { createDefaultDomToModelContext } from '../../TestHelper';
import { processPastedContentFromPowerPoint } from '../../../lib/paste/PowerPoint/processPastedContentFromPowerPoint';
import type { BeforePasteEvent, ClipboardData, DOMCreator } from 'roosterjs-content-model-types';

Expand All @@ -11,15 +12,7 @@ const getPasteEvent = (): BeforePasteEvent => {
htmlAfter: '',
htmlAttributes: {},
pasteType: 'normal',
domToModelOption: {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
},
domToModelOption: createDefaultDomToModelContext(),
};
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as selectionConvert from '../../../lib/editor/utils/selectionConverter';
import { createDefaultDomToModelContext } from '../../testUtils';
import { newEventToOldEvent, oldEventToNewEvent } from '../../../lib/editor/utils/eventConverter';
import {
EntityOperation,
Expand Down Expand Up @@ -105,15 +106,7 @@ describe('oldEventToNewEvent', () => {
eventType: 'beforePaste',
clipboardData: mockedClipboardData,
customizedMerge: undefined,
domToModelOption: {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
},
domToModelOption: createDefaultDomToModelContext(),
eventDataCache: mockedDataCache,
fragment: mockedFragment,
htmlAfter: mockedHtmlAfter,
Expand Down
13 changes: 13 additions & 0 deletions packages/roosterjs-editor-adapter/test/testUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { DomToModelOptionForSanitizing } from 'roosterjs-content-model-types';

export const createDefaultDomToModelContext = (): DomToModelOptionForSanitizing => {
return {
additionalAllowedTags: [],
additionalDisallowedTags: [],
additionalFormatParsers: {},
formatParserOverride: {},
processorOverride: {},
styleSanitizers: {},
attributeSanitizers: {},
};
};
Loading