mirror of
				https://github.com/strapi/strapi.git
				synced 2025-10-31 09:56:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const spawn = require('child_process').spawn;
 | |
| const fs = require('fs');
 | |
| const path = require('path');
 | |
| const shell = require('shelljs');
 | |
| const cypress = require('cypress')
 | |
| const { deleteApp } = require('./helpers/deleteFolder');
 | |
| 
 | |
| const strapiBin = path.resolve('./packages/strapi/bin/strapi.js');
 | |
| const appName = 'testApp';
 | |
| let testExitCode = 0;
 | |
| let appStart;
 | |
| 
 | |
| const databases = {
 | |
|   mongo: `--dbclient=mongo --dbhost=127.0.0.1 --dbport=27017 --dbname=strapi-test-${new Date().getTime()} --dbusername= --dbpassword=`,
 | |
|   postgres: '--dbclient=postgres --dbhost=127.0.0.1 --dbport=5432 --dbname=strapi-test --dbusername= --dbpassword=',
 | |
|   mysql: '--dbclient=mysql --dbhost=127.0.0.1 --dbport=3306 --dbname=strapi-test --dbusername=root --dbpassword=root'
 | |
| };
 | |
| 
 | |
| const {runCLI: jest} = require('jest-cli/build/cli');
 | |
| 
 | |
| const main = async () => {
 | |
|   const clean = () => {
 | |
|     return new Promise(async (resolve) => {
 | |
|       try {
 | |
|         fs.accessSync(appName);
 | |
|         await deleteApp(path.resolve(appName));
 | |
|       } catch(err) {
 | |
|         // Silent
 | |
|       }
 | |
|       resolve();
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   const generate = (database) => {
 | |
|     return new Promise((resolve, reject) => {
 | |
|       const appCreation = spawn('node', `${strapiBin} new ${appName} --dev ${database}`.split(' '), { detached: true });
 | |
| 
 | |
|       appCreation.stdout.on('data', data => {
 | |
|         console.log(data.toString().trim());
 | |
| 
 | |
|         if (data.includes('is ready at')) {
 | |
|           process.kill(appCreation.pid);
 | |
|           return resolve();
 | |
|         }
 | |
| 
 | |
|         if (data.includes('Database connection has failed')) {
 | |
|           process.kill(appCreation.pid);
 | |
|           return reject(new Error('Database connection has failed'));
 | |
|         }
 | |
|       });
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   const start = () => {
 | |
|     return new Promise((resolve, reject) => {
 | |
|       try {
 | |
|         shell.cd('./testApp');
 | |
|         appStart = shell.exec(`strapi start`, { async: true, silent: true });
 | |
|         appStart.stdout.on('data', (data) => {
 | |
|           if (data.includes('To shut down your server')) {
 | |
|             shell.cd('..');
 | |
|             return resolve();
 | |
|           } else {
 | |
|             console.log(data.trim());
 | |
|           }
 | |
|         });
 | |
| 
 | |
|       } catch (e) {
 | |
|         console.log(e)
 | |
|         if (typeof appStart !== 'undefined') {
 | |
|           process.kill(appStart.pid);
 | |
|         }
 | |
|         return reject(e);
 | |
|       }
 | |
|     });
 | |
|   };
 | |
| 
 | |
| 
 | |
|   const test = () => {
 | |
|     return new Promise(async (resolve) => {
 | |
|       // Run setup tests to generate the app.
 | |
|       await jest({
 | |
|         passWithNoTests: true,
 | |
|         testURL: 'http://localhost/'
 | |
|       }, [process.cwd()]);
 | |
| 
 | |
|       const packagesPath = path.resolve(process.cwd(), 'packages');
 | |
| 
 | |
|       const packages = fs.readdirSync(packagesPath)
 | |
|         .filter(file => file.indexOf('strapi') !== -1);
 | |
| 
 | |
|       // Run tests in every packages.
 | |
|       for (let i in packages) {
 | |
|         await jest({
 | |
|           passWithNoTests: true,
 | |
|           testURL: 'http://localhost/'
 | |
|         }, [path.resolve(packagesPath, packages[i])]);
 | |
|       }
 | |
| 
 | |
|       resolve();
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   const cypressTest = () => {
 | |
|     const config = Object.assign({ spec: './packages/**/test/front/integration/*' }, process.env.npm_config_browser === 'true' ? { browser: 'chrome' } : {});
 | |
|     
 | |
|     return cypress
 | |
|       .run(config);
 | |
|   }
 | |
| 
 | |
|   const testProcess = async (database) => {
 | |
|     try {
 | |
|       await clean();
 | |
|       await generate(database);
 | |
|       await start();
 | |
|       await cypressTest();
 | |
|       // await test();
 | |
|       process.kill(appStart.pid);
 | |
|     } catch (e) {
 | |
|       console.error(e.message);
 | |
|       testExitCode = 1;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   await testProcess(databases.mongo);
 | |
|   // await testProcess(databases.postgres);
 | |
|   // await testProcess(databases.mysql);
 | |
|   // process.exit(testExitCode);
 | |
| };
 | |
| 
 | |
| main();
 | 
