89 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {sync as deleteEmpty} from 'delete-empty';
 | 
						|
import {existsSync, unlinkSync} from 'fs';
 | 
						|
import {join} from 'path';
 | 
						|
import {AIO_DOWNLOADS_DIR} from '../common/constants';
 | 
						|
import {computeShortSha} from '../common/utils';
 | 
						|
import {SHA} from './constants';
 | 
						|
import {helper} from './helper';
 | 
						|
 | 
						|
function checkFile(filePath: string, remove: boolean): boolean {
 | 
						|
  const exists = existsSync(filePath);
 | 
						|
  if (exists && remove) {
 | 
						|
    // if we expected the file to exist then we remove it to prevent leftover file errors
 | 
						|
    unlinkSync(filePath);
 | 
						|
  }
 | 
						|
  return exists;
 | 
						|
}
 | 
						|
 | 
						|
function getArtifactPath(prNum: number, sha: string = SHA): string {
 | 
						|
  return `${AIO_DOWNLOADS_DIR}/${prNum}-${computeShortSha(sha)}-aio-snapshot.tgz`;
 | 
						|
}
 | 
						|
 | 
						|
function checkFiles(prNum: number, isPublic: boolean, sha: string, isLegacy: boolean, remove: boolean) {
 | 
						|
  const files = ['/index.html', '/foo/bar.js'];
 | 
						|
  const prPath = helper.getPrDir(prNum, isPublic);
 | 
						|
  const shaPath = helper.getShaDir(prPath, sha, isLegacy);
 | 
						|
 | 
						|
  const existingFiles: string[] = [];
 | 
						|
  const missingFiles: string[] = [];
 | 
						|
  files
 | 
						|
    .map(file => join(shaPath, file))
 | 
						|
    .forEach(file => (checkFile(file, remove) ? existingFiles : missingFiles).push(file));
 | 
						|
 | 
						|
  deleteEmpty(prPath);
 | 
						|
 | 
						|
  return { existingFiles, missingFiles };
 | 
						|
}
 | 
						|
 | 
						|
class ToExistAsAFile implements jasmine.CustomMatcher {
 | 
						|
  public compare(actual: string, remove = true): jasmine.CustomMatcherResult {
 | 
						|
    const pass = checkFile(actual, remove);
 | 
						|
    return {
 | 
						|
      message: `Expected file at "${actual}" ${pass ? 'not' : ''} to exist`,
 | 
						|
      pass,
 | 
						|
    };
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class ToExistAsAnArtifact implements jasmine.CustomMatcher {
 | 
						|
  public compare(actual: {prNum: number, sha?: string}, remove = true): jasmine.CustomMatcherResult {
 | 
						|
    const { prNum, sha = SHA } = actual;
 | 
						|
    const filePath = getArtifactPath(prNum, sha);
 | 
						|
    const pass = checkFile(filePath, remove);
 | 
						|
    return {
 | 
						|
      message: `Expected artifact "PR:${prNum}, SHA:${sha}, FILE:${filePath}" ${pass ? 'not' : '\b'} to exist`,
 | 
						|
      pass,
 | 
						|
    };
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class ToExistAsABuild implements jasmine.CustomMatcher {
 | 
						|
  public compare(actual: {prNum: number, isPublic?: boolean, sha?: string, isLegacy?: boolean}, remove = true):
 | 
						|
      jasmine.CustomMatcherResult  {
 | 
						|
    const {prNum, isPublic = true, sha = SHA, isLegacy = false} = actual;
 | 
						|
    const {missingFiles} = checkFiles(prNum, isPublic, sha, isLegacy, remove);
 | 
						|
    return {
 | 
						|
      message: `Expected files for build "PR:${prNum}, SHA:${sha}" to exist:\n` +
 | 
						|
                missingFiles.map(file => ` - ${file}`).join('\n'),
 | 
						|
      pass: missingFiles.length === 0,
 | 
						|
    };
 | 
						|
  }
 | 
						|
  public negativeCompare(actual: {prNum: number, isPublic?: boolean, sha?: string, isLegacy?: boolean}):
 | 
						|
      jasmine.CustomMatcherResult  {
 | 
						|
    const {prNum, isPublic = true, sha = SHA, isLegacy = false} = actual;
 | 
						|
    const { existingFiles } = checkFiles(prNum, isPublic, sha, isLegacy, false);
 | 
						|
    return {
 | 
						|
      message: `Expected files for build "PR:${prNum}, SHA:${sha}" not to exist:\n` +
 | 
						|
                existingFiles.map(file => ` - ${file}`).join('\n'),
 | 
						|
      pass: existingFiles.length === 0,
 | 
						|
    };
 | 
						|
  }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export const customMatchers = {
 | 
						|
  toExistAsABuild: () => new ToExistAsABuild(),
 | 
						|
  toExistAsAFile: () => new ToExistAsAFile(),
 | 
						|
  toExistAsAnArtifact: () => new ToExistAsAnArtifact(),
 | 
						|
};
 |