import helpers from 'yeoman-test'; import assert from 'yeoman-assert'; import path from 'path'; // these tests take around 45 seconds to run as it has to install create-react-app and all // so we are going to give each test up to 2 minutes before timing out jest.setTimeout(2 * 60000); describe('duffel app generator', () => { it('generates correct files for `react-ts` + `express-ts` combination', async () => { return new Promise((resolve, reject) => { helpers .run(path.join(__dirname, './generator.ts')) .withPrompts({ name: 'my-app', frontend: 'react-ts', backend: 'express-ts', accessToken: 'duffel_fake_token', }) .then(() => { assert.file([ 'my-app/client/package.json', 'my-app/client/src/App.tsx', 'my-app/client/src/components', 'my-app/client/src/examples', 'my-app/client/src/utils.ts', 'my-app/client/src/types.ts', 'my-app/server/src/routes/index.ts', 'my-app/server/src/duffel.ts', 'my-app/server/env/development.env', 'my-app/server/env/production.env', 'my-app/server/.gitignore', ]); // assert that the frontend is proxied to the right backend url in development assert.fileContent( 'my-app/client/package.json', `"proxy": "http://localhost:3001"` ); assert.fileContent('my-app/server/env/development.env', 'PORT=3001'); // assert that the frontend calls the right endpoint defined in the backend // - flight search endpoint assert.fileContent( 'my-app/client/src/examples/SearchCard.tsx', '/api/search' ); assert.fileContent( 'my-app/server/src/routes/index.ts', `post('/search'` ); // - booking endpoint assert.fileContent( 'my-app/client/src/examples/BookingCard.tsx', '/api/book' ); assert.fileContent( 'my-app/server/src/routes/index.ts', `post('/book'` ); // assert that the user-specified token got stored in the env files assert.fileContent( 'my-app/server/env/development.env', 'DUFFEL_ACCESS_TOKEN=duffel_fake_token' ); assert.fileContent( 'my-app/server/env/production.env', 'DUFFEL_ACCESS_TOKEN=duffel_fake_token' ); // ensure env file is being ignored assert.fileContent('my-app/server/.gitignore', '/env'); resolve(); }) .catch((err) => reject(err)); }); }); it('generates correct files for `react-js` + `express-js` combination', async () => { return new Promise((resolve, reject) => { helpers .run(path.join(__dirname, './generator.ts')) .withPrompts({ name: 'my-app', frontend: 'react-js', backend: 'express-js', accessToken: 'duffel_fake_token', }) .then(() => { assert.file([ 'my-app/client/package.json', 'my-app/client/src/App.js', 'my-app/client/src/index.css', 'my-app/client/src/components', 'my-app/client/src/examples', 'my-app/server/src/routes/index.js', 'my-app/server/src/duffel.js', 'my-app/server/env/development.env', 'my-app/server/env/production.env', 'my-app/server/.gitignore', ]); // assert that the frontend is proxied to the right backend url in development assert.fileContent( 'my-app/client/package.json', `"proxy": "http://localhost:3001"` ); assert.fileContent('my-app/server/env/development.env', /PORT=3001/); // assert that the frontend calls the right endpoint defined in the backend // - flight search endpoint assert.fileContent( 'my-app/client/src/examples/SearchCard.js', '/api/search' ); assert.fileContent( 'my-app/server/src/routes/index.js', `post('/search'` ); // - booking endpoint assert.fileContent( 'my-app/client/src/examples/BookingCard.js', '/api/book' ); assert.fileContent( 'my-app/server/src/routes/index.js', `post('/book'` ); // assert that the user-specified token got stored in the env files assert.fileContent( 'my-app/server/env/development.env', 'DUFFEL_ACCESS_TOKEN=duffel_fake_token' ); assert.fileContent( 'my-app/server/env/production.env', 'DUFFEL_ACCESS_TOKEN=duffel_fake_token' ); // ensure env file is being ignored assert.fileContent('my-app/server/.gitignore', '/env'); resolve(); }) .catch((err) => reject(err)); }); }); it('generates correct flask backend files', async () => { return new Promise((resolve, reject) => { helpers .run(path.join(__dirname, './generator.ts')) .withPrompts({ name: 'my-app', frontend: 'react-js', backend: 'flask', accessToken: 'duffel_fake_token', }) .then(() => { assert.file([ 'my-app/client/package.json', 'my-app/client/src/App.js', 'my-app/server/app.py', 'my-app/server/requirements.txt', 'my-app/server/bin/setup.sh', 'my-app/server/.gitignore', ]); // assert that the frontend is proxied to the right backend url in development assert.fileContent( 'my-app/client/package.json', `"proxy": "http://localhost:3001"` ); assert.fileContent('my-app/server/.flaskenv', 'PORT=3001'); // assert that the frontend calls the right endpoint defined in the backend // - flight search endpoint assert.fileContent( 'my-app/client/src/examples/SearchCard.js', '/api/search' ); assert.fileContent( 'my-app/server/app.py', '@app.route("/api/search", methods=["POST"])' ); // - book flight endpoint assert.fileContent( 'my-app/client/src/examples/BookingCard.js', '/api/book' ); assert.fileContent( 'my-app/server/app.py', '@app.route("/api/book", methods=["POST"])' ); // assert that the user-specified token got stored in the env files assert.fileContent( 'my-app/server/.flaskenv', 'DUFFEL_ACCESS_TOKEN=duffel_fake_token' ); // ensure env file is being ignored assert.fileContent('my-app/server/.gitignore', '.flaskenv'); resolve(); }) .catch((err) => reject(err)); }); }); });