UNPKG

generate-react-code

Version:

An automated React code generation tool for React web, React-Native, and/or Redux in the ducks modular pattern.

589 lines (521 loc) 24.9 kB
'use strict'; const path = require('path'); const fs = require('fs'); const shell = require('shelljs'); const prettier = require('prettier'); const resolvePath = require.resolve('commander'); const { getRootPath, getAllDirectories, getAllPlaceholderNames, createTemplate } = require('../generator-utilities'); const ROOT_PATH = getRootPath(); describe('Generator Utilities - Unit Test', () => { describe('createTemplate', () => { it('should create template with comments', done => { const name = 'some-directory-create-template'; const templatePath = path.join(ROOT_PATH, 'templates', 'web', 'react'); const directory = path.join(ROOT_PATH, name); if (!fs.existsSync(directory)) { shell.mkdir('-p', path.join(directory)); } const testTemplate = { template: path.join(templatePath, 'template.view.js'), generated: path.join(directory, `${name}.view.js`) }; const testPlaceHolder = getAllPlaceholderNames(name); function assert() { expect(fs.existsSync(directory)).toBeTruthy(); expect(fs.existsSync(testTemplate.generated)).toBeTruthy(); expect(fs.readFileSync(testTemplate.generated, 'utf8')).toContain( 'Import all external modules here.' ); done(); } createTemplate(testTemplate, testPlaceHolder, false, assert); }); it('should create template without comments', done => { const name = 'some-directory-create-template-without-comments'; const templatePath = path.join(ROOT_PATH, 'templates', 'web', 'react'); const directory = path.join(ROOT_PATH, name); if (!fs.existsSync(directory)) { shell.mkdir('-p', path.join(directory)); } const testTemplate = { template: path.join(templatePath, 'template.view.js'), generated: path.join(directory, `${name}.view.js`) }; const testPlaceHolder = getAllPlaceholderNames(name); function assert() { expect(fs.existsSync(directory)).toBeTruthy(); expect(fs.existsSync(testTemplate.generated)).toBeTruthy(); expect(fs.readFileSync(testTemplate.generated, 'utf8')).not.toContain( 'Import all external modules here.' ); done(); } createTemplate(testTemplate, testPlaceHolder, true, assert); }); it('should format javascript code using prettier after it has been generated', done => { const name = 'some-directory-create-template'; const templatePath = path.join(ROOT_PATH, 'templates', 'web', 'react'); const directory = path.join(ROOT_PATH, name); if (!fs.existsSync(directory)) { shell.mkdir('-p', path.join(directory)); } const testTemplate = { template: path.join(templatePath, 'template.view.js'), generated: path.join(directory, `${name}.view.js`) }; const testPlaceHolder = getAllPlaceholderNames(name); const prettierSpy = jest.spyOn(prettier, 'format'); function assert() { expect(prettierSpy).toHaveBeenCalled(); prettierSpy.mockRestore(); done(); } createTemplate(testTemplate, testPlaceHolder, false, assert); }); it('should format sass code using prettier after it has been generated', done => { const name = 'some-directory-create-template'; const templatePath = path.join(ROOT_PATH, 'templates', 'web', 'react'); const directory = path.join(ROOT_PATH, name); if (!fs.existsSync(directory)) { shell.mkdir('-p', path.join(directory)); } const testTemplate = { template: path.join(templatePath, '_template.styles.scss'), generated: path.join(directory, `${name}.styles.scss`) }; const testPlaceHolder = getAllPlaceholderNames(name); const prettierSpy = jest.spyOn(prettier, 'format'); function assert() { expect(prettierSpy).toHaveBeenCalled(); prettierSpy.mockRestore(); done(); } createTemplate(testTemplate, testPlaceHolder, false, assert); }); }); describe('getAllDirectories', () => { describe('getReactComponentDirs', () => { describe('for web', () => { describe('NOT redux', () => { it('should return all templates with directories set name and create folder name, with test', () => { const name = 'some-name'; const directory = 'some-directory'; const actual = getAllDirectories(name, directory); const templates = path.join(ROOT_PATH, 'templates', 'web', 'react'); const folderName = name; const expected = { view: { template: path.join(templates, 'template.view.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.view.js` ) }, viewTest: { template: path.join(templates, 'test', 'template.view.spec.js'), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.view.spec.js` ) }, stylesheet: { template: path.join(templates, '_template.styles.scss'), generated: path.join( ROOT_PATH, directory, folderName, `_${name}.styles.scss` ) } }; expect(actual).toEqual(expected); expect( fs.existsSync(path.join(ROOT_PATH, directory, folderName)) ).toBeTruthy(); }); }); describe('WITH redux', () => { it('should return all templates with directories set name and create folder name, with test', () => { const name = 'some-name-redux'; const directory = 'some-directory-redux'; const actual = getAllDirectories(name, directory, false, true); const templates = path.join(ROOT_PATH, 'templates', 'web', 'react-redux'); const folderName = name; const expected = { view: { template: path.join(templates, 'template.view.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.view.js` ) }, viewTest: { template: path.join(templates, 'test', 'template.view.spec.js'), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.view.spec.js` ) }, stylesheet: { template: path.join(templates, '_template.styles.scss'), generated: path.join( ROOT_PATH, directory, folderName, `_${name}.styles.scss` ) }, container: { template: path.join(templates, 'template.container.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.container.js` ) }, containerTest: { template: path.join( templates, 'test', 'template.container.spec.js' ), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.container.spec.js` ) }, reducer: { template: path.join(templates, 'template.reducer.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.reducer.js` ) }, reducerTest: { template: path.join(templates, 'test', 'template.reducer.spec.js'), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.reducer.spec.js` ) } }; expect(actual).toEqual(expected); expect( fs.existsSync(path.join(ROOT_PATH, directory, folderName)) ).toBeTruthy(); }); }); }); describe('for native', () => { describe('NOT redux', () => { it('should return all templates with directories set name and create folder name, with test', () => { const name = 'some-name-native'; const directory = 'some-directory-native'; const actual = getAllDirectories(name, directory, true); const templates = path.join(ROOT_PATH, 'templates', 'native', 'react'); const folderName = name; const expected = { view: { template: path.join(templates, 'template.view.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.view.js` ) }, viewTest: { template: path.join(templates, 'test', 'template.view.spec.js'), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.view.spec.js` ) } }; expect(actual).toEqual(expected); expect( fs.existsSync(path.join(ROOT_PATH, directory, folderName)) ).toBeTruthy(); }); }); describe('WITH redux', () => { it('should return all templates with directories set name and create folder name, with test', () => { const name = 'some-name-redux'; const directory = 'some-directory-redux'; const actual = getAllDirectories(name, directory, true, true); const templates = path.join( ROOT_PATH, 'templates', 'native', 'react-redux' ); const folderName = name; const expected = { view: { template: path.join(templates, 'template.view.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.view.js` ) }, viewTest: { template: path.join(templates, 'test', 'template.view.spec.js'), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.view.spec.js` ) }, container: { template: path.join(templates, 'template.container.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.container.js` ) }, containerTest: { template: path.join( templates, 'test', 'template.container.spec.js' ), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.container.spec.js` ) }, reducer: { template: path.join(templates, 'template.reducer.js'), generated: path.join( ROOT_PATH, directory, folderName, `${name}.reducer.js` ) }, reducerTest: { template: path.join(templates, 'test', 'template.reducer.spec.js'), generated: path.join( ROOT_PATH, directory, folderName, 'test', `${name}.reducer.spec.js` ) } }; expect(actual).toEqual(expected); expect( fs.existsSync(path.join(ROOT_PATH, directory, folderName)) ).toBeTruthy(); }); }); }); }); describe('getReduxCoreDirs', () => { it('should return all templates with directories, set with name and create folders for redux core', () => { const directory = 'some-directory-redux-core'; let actual = getAllDirectories(null, null, null, null, true, directory); const templates = path.join(ROOT_PATH, 'templates', 'redux-core'); const expected = { store: { template: path.join(templates, 'store.js'), generated: path.join(ROOT_PATH, directory, 'store.js') }, rootReducer: { template: path.join(templates, 'root-reducer.js'), generated: path.join(ROOT_PATH, directory, 'root-reducer.js') }, createAction: { template: path.join(templates, 'action-utilities', 'action-creator.js'), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'action-creator.js' ) }, createActionType: { template: path.join( templates, 'action-utilities', 'action-type-creator.js' ), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'action-type-creator.js' ) }, createActionTest: { template: path.join( templates, 'action-utilities', 'test', 'action-creator.spec.js' ), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'test', 'action-creator.spec.js' ) }, createActionTypeTest: { template: path.join( templates, 'action-utilities', 'test', 'action-type-creator.spec.js' ), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'test', 'action-type-creator.spec.js' ) } }; expect(actual).toEqual(expected); expect(fs.existsSync(path.join(ROOT_PATH, directory))).toBeTruthy(); }); it('should return all templates with directories, set with name and create folders for redux core even if the directory already exists', () => { const directory = 'some-directory-redux-core'; let actual = getAllDirectories(null, null, null, null, true, directory); actual = getAllDirectories(null, null, null, null, true, directory); const templates = path.join(ROOT_PATH, 'templates', 'redux-core'); const expected = { store: { template: path.join(templates, 'store.js'), generated: path.join(ROOT_PATH, directory, 'store.js') }, rootReducer: { template: path.join(templates, 'root-reducer.js'), generated: path.join(ROOT_PATH, directory, 'root-reducer.js') }, createAction: { template: path.join(templates, 'action-utilities', 'action-creator.js'), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'action-creator.js' ) }, createActionType: { template: path.join( templates, 'action-utilities', 'action-type-creator.js' ), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'action-type-creator.js' ) }, createActionTest: { template: path.join( templates, 'action-utilities', 'test', 'action-creator.spec.js' ), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'test', 'action-creator.spec.js' ) }, createActionTypeTest: { template: path.join( templates, 'action-utilities', 'test', 'action-type-creator.spec.js' ), generated: path.join( ROOT_PATH, directory, 'action-utilities', 'test', 'action-type-creator.spec.js' ) } }; expect(actual).toEqual(expected); expect(fs.existsSync(path.join(ROOT_PATH, directory))).toBeTruthy(); }); }); }); describe('getAllPlaceholderNames', () => { it('should return kebab case name', () => { const name = 'some-kebab-case-name'; const actual = getAllPlaceholderNames(name); const expected = { kebab: name, lowerCamel: 'someKebabCaseName', upperCamel: 'SomeKebabCaseName' }; expect(actual).toEqual(expected); }); }); describe('getRootPath', () => { it('should return root path', () => { console.log('resolvePath:', resolvePath.slice(0, resolvePath.indexOf('node_modules'))); const actual = getRootPath(); const expected = resolvePath.slice(0, resolvePath.indexOf('node_modules')); expect(actual).toEqual(expected); }); }); afterAll(() => { shell.rm('-rf', path.join(ROOT_PATH, 'some-directory')); shell.rm('-rf', path.join(ROOT_PATH, 'some-directory-native')); shell.rm('-rf', path.join(ROOT_PATH, 'some-directory-redux')); shell.rm('-rf', path.join(ROOT_PATH, 'some-directory-redux-core')); shell.rm('-rf', path.join(ROOT_PATH, 'some-directory-create-template')); shell.rm('-rf', path.join(ROOT_PATH, 'some-directory-create-template-without-comments')); }); });