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(),
 | |
| };
 |