feat(client): make all sources available in tests (#44725)
* feat: make all sources available in tests The original contents of all files (index.html, script.js etc.) will be accessible in tests. For example __sources['index.html'] gets the original html file and nothing else. * feat: use __file to get user code
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							137edc2fb3
						
					
				
				
					commit
					cde1407f58
				
			@@ -26,6 +26,7 @@ export interface InitTestFrameArg {
 | 
			
		||||
  code: {
 | 
			
		||||
    contents?: string;
 | 
			
		||||
    editableContents?: string;
 | 
			
		||||
    original?: { [id: string]: string };
 | 
			
		||||
  };
 | 
			
		||||
  getUserInput?: (fileName: string) => string;
 | 
			
		||||
  loadEnzyme?: () => void;
 | 
			
		||||
@@ -33,6 +34,14 @@ export interface InitTestFrameArg {
 | 
			
		||||
 | 
			
		||||
async function initTestFrame(e: InitTestFrameArg = { code: {} }) {
 | 
			
		||||
  const code = (e.code.contents || '').slice();
 | 
			
		||||
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | 
			
		||||
  const __file = (id?: string) => {
 | 
			
		||||
    if (id && e.code.original) {
 | 
			
		||||
      return e.code.original[id];
 | 
			
		||||
    } else {
 | 
			
		||||
      return code;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  const editableContents = (e.code.editableContents || '').slice();
 | 
			
		||||
  // __testEditable allows test authors to run tests against a transitory dom
 | 
			
		||||
  // element built using only the code in the editable region.
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,7 @@ interface TestEvaluatorEvent extends MessageEvent {
 | 
			
		||||
    code: {
 | 
			
		||||
      contents: string;
 | 
			
		||||
      editableContents: string;
 | 
			
		||||
      original: { [id: string]: string };
 | 
			
		||||
    };
 | 
			
		||||
    removeComments: boolean;
 | 
			
		||||
    firstTest: unknown;
 | 
			
		||||
 
 | 
			
		||||
@@ -47,10 +47,12 @@ function buildSourceMap(challengeFiles) {
 | 
			
		||||
  const source = challengeFiles.reduce(
 | 
			
		||||
    (sources, challengeFile) => {
 | 
			
		||||
      sources.index += challengeFile.source || challengeFile.contents;
 | 
			
		||||
      sources.contents = sources.index;
 | 
			
		||||
      sources.original[challengeFile.history[0]] = challengeFile.source;
 | 
			
		||||
      sources.editableContents += challengeFile.editableContents || '';
 | 
			
		||||
      return sources;
 | 
			
		||||
    },
 | 
			
		||||
    { index: '', editableContents: '' }
 | 
			
		||||
    { index: '', editableContents: '', original: {} }
 | 
			
		||||
  );
 | 
			
		||||
  return source;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -111,15 +111,13 @@ const initTestFrame = frameReady => ctx => {
 | 
			
		||||
  waitForFrame(ctx)
 | 
			
		||||
    .then(async () => {
 | 
			
		||||
      const { sources, loadEnzyme } = ctx;
 | 
			
		||||
      // default for classic challenges
 | 
			
		||||
      // should not be used for modern
 | 
			
		||||
      const code = {
 | 
			
		||||
        contents: sources.index,
 | 
			
		||||
        editableContents: sources.editableContents
 | 
			
		||||
      };
 | 
			
		||||
      // provide the file name and get the original source
 | 
			
		||||
      const getUserInput = fileName => toString(sources[fileName]);
 | 
			
		||||
      await ctx.document.__initTestFrame({ code, getUserInput, loadEnzyme });
 | 
			
		||||
      await ctx.document.__initTestFrame({
 | 
			
		||||
        code: sources,
 | 
			
		||||
        getUserInput,
 | 
			
		||||
        loadEnzyme
 | 
			
		||||
      });
 | 
			
		||||
      frameReady();
 | 
			
		||||
    })
 | 
			
		||||
    .catch(handleDocumentNotFound);
 | 
			
		||||
 
 | 
			
		||||
@@ -675,7 +675,11 @@ async function initializeTestRunner(build, sources, code, loadEnzyme) {
 | 
			
		||||
  await page.evaluate(
 | 
			
		||||
    async (code, sources, loadEnzyme) => {
 | 
			
		||||
      const getUserInput = fileName => sources[fileName];
 | 
			
		||||
      await document.__initTestFrame({ code, getUserInput, loadEnzyme });
 | 
			
		||||
      await document.__initTestFrame({
 | 
			
		||||
        code: sources,
 | 
			
		||||
        getUserInput,
 | 
			
		||||
        loadEnzyme
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    code,
 | 
			
		||||
    sources,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user