diff --git a/app/index.js b/app/index.js index 3f9e710cf..b79d8bdba 100644 --- a/app/index.js +++ b/app/index.js @@ -10,16 +10,11 @@ var chalk = require('chalk'); var Generator = module.exports = function Generator(args, options) { yeoman.generators.Base.apply(this, arguments); - this.argument('appname', { type: String, required: false }); - this.appname = this.appname || path.basename(process.cwd()); - this.appname = this._.camelize(this._.slugify(this._.humanize(this.appname))); - this.option('app-suffix', { desc: 'Allow a custom suffix to be added to the module name', type: String }); this.env.options['app-suffix'] = this.options['app-suffix']; - this.scriptAppName = this.appname + angularUtils.appName(this); args = ['main']; @@ -71,18 +66,6 @@ var Generator = module.exports = function Generator(args, options) { this.env.options.typescript = this.options.typescript; } - this.hookFor('angular:common', { - args: args - }); - - this.hookFor('angular:main', { - args: args - }); - - this.hookFor('angular:controller', { - args: args - }); - this.on('end', function () { var jsExt = this.options.coffee ? 'coffee' : 'js'; @@ -95,7 +78,7 @@ var Generator = module.exports = function Generator(args, options) { bowerComments.push('endbower'); } - this.invoke('karma:app', { + this.composeWith('karma:app', { options: { 'skip-install': this.options['skip-install'], 'base-path': '../', @@ -118,7 +101,7 @@ var Generator = module.exports = function Generator(args, options) { }); if (this.env.options.ngRoute) { - this.invoke('angular:route', { + this.composeWith('angular:route', { args: ['about'] }); } @@ -130,6 +113,13 @@ var Generator = module.exports = function Generator(args, options) { util.inherits(Generator, yeoman.generators.Base); +Generator.prototype.initializing = function initializing() { + this.argument('appname', { type: String, required: false }); + this.appname = this.appname || path.basename(process.cwd()); + this.appname = this._.camelize(this._.slugify(this._.humanize(this.appname))); + this.scriptAppName = this.appname + angularUtils.appName(this); +} + Generator.prototype.welcome = function welcome() { if (!this.options['skip-welcome-message']) { this.log(yosay()); @@ -377,3 +367,10 @@ Generator.prototype._injectDependencies = function _injectDependencies() { this.spawnCommand(taskRunner, ['wiredep']); } }; + +Generator.prototype.install = function install() { + var args = ['main']; + this.composeWith('angular:common', {args: args}); + this.composeWith('angular:main', {args: args}); + this.composeWith('angular:controller', {args: args}); +}; diff --git a/package.json b/package.json index 57d2dd5a0..ab8af7ea9 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "dependencies": { "chalk": "^1.0.0", "wiredep": "^2.2.0", - "yeoman-generator": "^0.16.0", + "yeoman-generator": "^0.18.0", "yosay": "^1.0.2" }, "peerDependencies": { @@ -52,7 +52,9 @@ "grunt-conventional-github-releaser": "^0.5.0", "load-grunt-tasks": "^3.1.0", "mocha": "*", - "underscore.string": "^3.0.3" + "underscore.string": "^3.0.3", + "yeoman-assert": "^2.1.1", + "yeoman-test": "^1.0.0" }, "engines": { "node": ">=0.10.0" diff --git a/readme.md b/readme.md index 6dcee086c..102204250 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# AngularJS generator [![Build Status](https://secure.travis-ci.org/yeoman/generator-angular.svg?branch=master)](http://travis-ci.org/yeoman/generator-angular) +# AngularJS generator [![Build Status](https://secure.travis-ci.org/yeoman/generator-angular.svg?branch=master)](http://travis-ci.org/yeoman/generator-angular) [![Gitter](https://img.shields.io/badge/Gitter-Join_the_Yeoman_chat_%E2%86%92-00d06f.svg)](https://gitter.im/yeoman/yeoman) > Yeoman generator for AngularJS - lets you quickly set up a project with sensible defaults and best practices. @@ -234,11 +234,6 @@ angular.module('demoApp') .controller('UserCtrl', demoApp.UserCtrl); ``` - -A project can mix TypeScript, CoffeScript, and JavaScript files. - -To output JavaScript files, even if CoffeeScript (or TypeScript) files exist (the default is to output CoffeeScript files if the generator finds any in the project), use `--coffee=false` and/or `--typescript=false`. - ### Minification Safe **tl;dr**: You don't need to write annotated code as the build step will diff --git a/route/index.js b/route/index.js index 70ed11ff7..c3c2a60c5 100644 --- a/route/index.js +++ b/route/index.js @@ -29,9 +29,6 @@ var Generator = module.exports = function Generator() { ) { this.foundWhenForRoute = true; } - - this.hookFor('angular:controller'); - this.hookFor('angular:view'); }; util.inherits(Generator, ScriptBase); @@ -78,3 +75,9 @@ Generator.prototype.rewriteAppJs = function () { angularUtils.rewriteFile(config); }; + +Generator.prototype.install = function install() { + var args = [this.name]; + this.composeWith('angular:controller', {args: args}); + this.composeWith('angular:view', {args: args}); +}; diff --git a/script-base.js b/script-base.js index de4ff1c3f..e161e380c 100644 --- a/script-base.js +++ b/script-base.js @@ -121,7 +121,7 @@ Generator.prototype.addScriptToIndex = function (script) { Generator.prototype.generateSourceAndTest = function (appTemplate, testTemplate, targetDirectory, skipAdd) { // Services use classified names - if (this.generatorName.toLowerCase() === 'service') { + if (this.rootGeneratorName().toLowerCase() === 'service') { this.cameledName = this.classedName; } diff --git a/test/app.js b/test/app.js new file mode 100644 index 000000000..5e2116cf2 --- /dev/null +++ b/test/app.js @@ -0,0 +1,144 @@ +'use strict'; + +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +var getDefaultFilesForAppPath = function (appPath) { + return [ + appPath + '/404.html', + appPath + '/favicon.ico', + appPath + '/robots.txt', + appPath + '/styles/main.scss', + appPath + '/views/main.html', + appPath + '/index.html', + '.bowerrc', + '.editorconfig', + '.gitignore', + '.jshintrc', + 'Gruntfile.js', + 'package.json', + 'bower.json' + ]; +}; + +describe('angular:app', function () { + var appPath = 'customAppPath'; + + beforeEach(function () { + this.angular = helpers + .run(require.resolve('../app')) + .withGenerators([ + require.resolve('../common'), + require.resolve('../controller'), + require.resolve('../main'), + [helpers.createDummyGenerator(), 'karma:app'] + ]) + .withOptions({ + 'skip-welcome-message': true, + 'skip-message': true + }) + .withArguments(['upperCaseBug']) + .withPrompts({ + compass: true, + bootstrap: true, + compassBootstrap: true, + modules: [] + }); + }); + + describe('default settings', function () { + beforeEach(function (done) { + this.angular.on('end', done); + }); + + it('generates base files', function () { + assert.file(getDefaultFilesForAppPath('app')); + assert.file([ + '.jscsrc', + 'app/index.html', + 'app/scripts/app.js', + 'app/scripts/controllers/main.js', + 'test/spec/controllers/main.js' + ]); + }); + }); + + describe('--coffee', function () { + beforeEach(function (done) { + this.angular.withOptions({ + coffee: true + }).on('end', done); + }); + + it('generates CoffeeScript files', function () { + assert.file([].concat(getDefaultFilesForAppPath('app'), [ + 'app/scripts/app.coffee', + 'app/scripts/controllers/main.coffee', + 'test/spec/controllers/main.coffee' + ])); + }); + }); + + describe('--typescript', function () { + beforeEach(function (done) { + this.angular.withOptions({ + typescript: true + }).on('end', done); + }); + + it('generates CoffeeScript files', function () { + assert.file([].concat(getDefaultFilesForAppPath('app'), [ + 'app/scripts/app.ts', + 'app/scripts/controllers/main.ts', + 'test/spec/controllers/main.ts' + ])); + }); + }); + + describe('--appPath', function () { + beforeEach(function (done) { + this.angular.withOptions({ + appPath: 'alternative' + }).on('end', done); + }); + + it('generates base files inside the appPath', function () { + assert.file(getDefaultFilesForAppPath('alternative')); + assert.file([ + '.jscsrc', + 'alternative/scripts/app.js', + 'alternative/scripts/controllers/main.js', + 'test/spec/controllers/main.js' + ]); + }); + }); + + describe('--appName', function () { + beforeEach(function (done) { + this.angular + .withArguments(['upperCaseBug']) + .on('end', done); + }); + + it('generates the same appName in every file', function () { + assert.fileContent( + 'app/scripts/app.js', + /module\('upperCaseBugApp'/ + ); + assert.fileContent( + 'app/scripts/controllers/main.js', + /module\('upperCaseBugApp'/ + ); + assert.fileContent( + 'test/spec/controllers/main.js', + /module\('upperCaseBugApp'/ + ); + + assert.fileContent( + 'app/index.html', + /ng-app="upperCaseBugApp"/ + ); + }); + }); +}); diff --git a/test/constant.js b/test/constant.js new file mode 100644 index 000000000..5ece658f2 --- /dev/null +++ b/test/constant.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:constant', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../constant')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new constant', function () { + assert.file('test/spec/services/foo.js'); + assert.fileContent( + path.join('app/scripts/services/foo.js'), + /constant\('foo'/ + ); + }); +}); diff --git a/test/controller.js b/test/controller.js new file mode 100644 index 000000000..91932126e --- /dev/null +++ b/test/controller.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:controller', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../controller')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new controller', function () { + assert.file('test/spec/controllers/foo.js'); + assert.fileContent( + path.join('app/scripts/controllers/foo.js'), + /controller\('FooCtrl'/ + ); + }); +}); diff --git a/test/directive.js b/test/directive.js new file mode 100644 index 000000000..094e1365b --- /dev/null +++ b/test/directive.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:directive', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../directive')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new directive', function () { + assert.file('test/spec/directives/foo.js'); + assert.fileContent( + path.join('app/scripts/directives/foo.js'), + /directive\('foo'/ + ); + }); +}); diff --git a/test/factory.js b/test/factory.js new file mode 100644 index 000000000..56a131fdd --- /dev/null +++ b/test/factory.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:factory', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../factory')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new factory', function () { + assert.file('test/spec/services/foo.js'); + assert.fileContent( + path.join('app/scripts/services/foo.js'), + /factory\('foo'/ + ); + }); +}); diff --git a/test/filter.js b/test/filter.js new file mode 100644 index 000000000..86973fb6e --- /dev/null +++ b/test/filter.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:filter', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../filter')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new filter', function () { + assert.file('test/spec/filters/foo.js'); + assert.fileContent( + path.join('app/scripts/filters/foo.js'), + /filter\('foo'/ + ); + }); +}); diff --git a/test/provider.js b/test/provider.js new file mode 100644 index 000000000..0b8f66033 --- /dev/null +++ b/test/provider.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:provider', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../provider')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new provider', function () { + assert.file('test/spec/services/foo.js'); + assert.fileContent( + path.join('app/scripts/services/foo.js'), + /provider\('foo'/ + ); + }); +}); diff --git a/test/route.js b/test/route.js new file mode 100644 index 000000000..76609328a --- /dev/null +++ b/test/route.js @@ -0,0 +1,65 @@ +'use strict'; + +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); +var generateFullProject = require('./utils').generateFullProject; + +describe('angular:route', function () { + beforeEach(function (done) { + generateFullProject() + .withPrompts({ + modules: ['routeModule'] + }) + .on('end', function () { + this.angularRoute = helpers.run(require.resolve('../route')) + .withGenerators([ + require.resolve('../controller'), + require.resolve('../view') + ]) + .withOptions({ + appPath: 'app' + }) + .withArguments(['simpleroute']); + + // Hack to not clear the directory + this.angularRoute.inDirSet = true; + + done(); + }.bind(this)); + }); + + it('generates default route items', function (done) { + this.angularRoute.on('end', function () { + assert.file([ + 'app/scripts/controllers/simpleroute.js', + 'test/spec/controllers/simpleroute.js', + 'app/views/simpleroute.html' + ]); + assert.fileContent( + 'app/scripts/app.js', + /when\('\/simpleroute'/ + ); + done(); + }); + }); + + it('generates route items with the route uri given', function (done) { + this.angularRoute + .withOptions({ + uri: 'segment1/segment2/:parameter' + }) + .on('end', function () { + assert.file([ + 'app/scripts/controllers/simpleroute.js', + 'test/spec/controllers/simpleroute.js', + 'app/views/simpleroute.html' + ]); + assert.fileContent( + 'app/scripts/app.js', + /when\('\/segment1\/segment2\/\:parameter'/ + ); + done(); + }); + }); +}); diff --git a/test/service.js b/test/service.js new file mode 100644 index 000000000..71cafed0e --- /dev/null +++ b/test/service.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:service', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../service')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new service', function () { + assert.file('test/spec/services/foo.js'); + assert.fileContent( + path.join('app/scripts/services/foo.js'), + /service\('foo'/ + ); + }); +}); diff --git a/test/test-appname-substitution.js b/test/test-appname-substitution.js deleted file mode 100644 index 3a5820ece..000000000 --- a/test/test-appname-substitution.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -var path = require('path'); -var helpers = require('yeoman-generator').test; - -describe('Angular generator template', function () { - var angular; - var appName = 'upperCaseBug'; - - beforeEach(function (done) { - var deps = [ - '../../../app', - '../../../common', - '../../../controller', - '../../../main', - [ helpers.createDummyGenerator(), 'karma:app' ] - ]; - helpers.testDirectory(path.join(__dirname, 'tmp', appName), function (err) { - if (err) { - done(err); - } - - angular = helpers.createGenerator('angular:app', deps, [appName], { - 'appPath': 'app', - 'skip-welcome-message': true, - 'skip-install': true, - 'skip-message': true - }); - - helpers.mockPrompt(angular, { - compass: true, - bootstrap: true, - compassBootstrap: true, - modules: [] - }); - - done(); - }); - }); - - it('should generate the same appName in every file', function (done) { - angular.run({}, function () { - helpers.assertFile([ - 'app/scripts/app.js', - 'app/scripts/controllers/main.js', - 'app/index.html', - 'test/spec/controllers/main.js' - ]); - - helpers.assertFileContent( - 'app/scripts/app.js', - new RegExp('module\\(\'' + appName + 'App\'') - ); - helpers.assertFileContent( - 'app/scripts/controllers/main.js', - new RegExp('module\\(\'' + appName + 'App\'') - ); - helpers.assertFileContent( - 'test/spec/controllers/main.js', - new RegExp('module\\(\'' + appName + 'App\'') - ); - - helpers.assertFileContent( - 'app/index.html', - new RegExp('ng-app=\"' + appName + 'App\"') - ); - done(); - }); - }); -}); diff --git a/test/test-apppath.js b/test/test-apppath.js deleted file mode 100644 index e71e9dc6a..000000000 --- a/test/test-apppath.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict'; - -var path = require('path'); -var helpers = require('yeoman-generator').test; -var _ = require('underscore.string'); - -describe('Angular generator appPath option', function () { - var angular; - var appPath = 'customAppPath'; - var expected = [ - appPath + '/404.html', - appPath + '/favicon.ico', - appPath + '/robots.txt', - appPath + '/styles/main.scss', - appPath + '/views/main.html', - appPath + '/index.html', - '.bowerrc', - '.editorconfig', - '.gitignore', - '.jshintrc', - 'Gruntfile.js', - 'package.json', - 'bower.json' - ]; - var mockPrompts = { - compass: true, - bootstrap: true, - compassBootstrap: true, - modules: [] - }; - var genOptions = { - 'appPath': appPath, - 'skip-install': true, - 'skip-welcome-message': true, - 'skip-message': true - }; - - beforeEach(function (done) { - helpers.testDirectory(path.join(__dirname, 'tmp', 'app'), function (err) { - if (err) { - done(err); - } - - angular = helpers.createGenerator( - 'angular:app', - [ - '../../../app', - '../../../common', - '../../../controller', - '../../../main', - [ helpers.createDummyGenerator(), 'karma:app' ] - ], - false, - genOptions - ); - helpers.mockPrompt(angular, mockPrompts); - - done(); - }); - }); - - describe('App files', function () { - it('should generate dotfiles for apppath', function (done) { - angular.run({}, function () { - helpers.assertFile(expected); - done(); - }); - }); - - it('creates expected JS files', function (done) { - angular.run({}, function() { - helpers.assertFile([].concat(expected, [ - '.jscsrc', - appPath + '/scripts/app.js', - appPath + '/scripts/controllers/main.js', - 'test/spec/controllers/main.js' - ])); - done(); - }); - }); - - it('creates CoffeeScript files', function (done) { - angular.env.options.coffee = true; - angular.run([], function () { - helpers.assertFile([].concat(expected, [ - appPath + '/scripts/app.coffee', - appPath + '/scripts/controllers/main.coffee', - 'test/spec/controllers/main.coffee' - ])); - done(); - }); - }); - }); - - describe('Service Subgenerators', function () { - var generatorTest = function (generatorType, specType, targetDirectory, scriptNameFn, specNameFn, suffix, done) { - var angularGenerator; - var name = 'foo'; - var deps = [path.join('../../..', generatorType)]; - angularGenerator = helpers.createGenerator('angular:' + generatorType, deps, [name], genOptions); - - angular.run([], function () { - angularGenerator.run([], function () { - helpers.assertFileContent([ - [ - path.join(appPath + '/scripts', targetDirectory, name + '.js'), - new RegExp( - generatorType + '\\(\'' + scriptNameFn(name) + suffix + '\'', - 'g' - ) - ] - ]); - done(); - }); - }); - }; - - it('should generate a new controller', function (done) { - generatorTest('controller', 'controller', 'controllers', _.classify, _.classify, 'Ctrl', done); - }); - - it('should generate a new directive', function (done) { - generatorTest('directive', 'directive', 'directives', _.camelize, _.camelize, '', done); - }); - - it('should generate a new filter', function (done) { - generatorTest('filter', 'filter', 'filters', _.camelize, _.camelize, '', done); - }); - - ['constant', 'factory', 'provider', 'value'].forEach(function(t) { - it('should generate a new ' + t, function (done) { - generatorTest(t, 'service', 'services', _.camelize, _.camelize, '', done); - }); - }); - - it('should generate a new service', function (done) { - generatorTest('service', 'service', 'services', _.capitalize, _.capitalize, '', done); - }); - }); - - describe('View', function () { - it('should generate a new view', function (done) { - var angularView; - var deps = [ '../../../view' ]; - angularView = helpers.createGenerator('angular:view', deps, ['foo'], genOptions); - - helpers.mockPrompt(angular, mockPrompts); - angular.run([], function () { - angularView.run([], function () { - helpers.assertFile([appPath + '/views/foo.html']); - done(); - }); - }); - }); - - it('should generate a new view in subdirectories', function (done) { - var angularView; - var deps = [ '../../../view' ]; - angularView = helpers.createGenerator('angular:view', deps, ['foo/bar'], genOptions); - - helpers.mockPrompt(angular, mockPrompts); - angular.run([], function () { - angularView.run([], function () { - helpers.assertFile([appPath + '/views/foo/bar.html']); - done(); - }); - }); - }); - }); -}); diff --git a/test/test-file-creation.js b/test/test-file-creation.js deleted file mode 100644 index 2a6e9e8ea..000000000 --- a/test/test-file-creation.js +++ /dev/null @@ -1,200 +0,0 @@ -'use strict'; - -var path = require('path'); -var helpers = require('yeoman-generator').test; -var _ = require('underscore.string'); - -describe('Angular generator file creation', function () { - var angular; - var expected = [ - 'app/404.html', - 'app/favicon.ico', - 'app/robots.txt', - 'app/styles/main.scss', - 'app/views/main.html', - 'app/index.html', - '.bowerrc', - '.editorconfig', - '.gitignore', - '.jshintrc', - 'Gruntfile.js', - 'package.json', - 'bower.json' - ]; - var mockPrompts = { - compass: true, - bootstrap: true, - compassBootstrap: true, - modules: [] - }; - var genOptions = { - 'appPath': 'app', - 'skip-install': true, - 'skip-welcome-message': true, - 'skip-message': true - }; - - beforeEach(function (done) { - helpers.testDirectory(path.join(__dirname, 'tmp', 'file'), function (err) { - if (err) { - done(err); - } - angular = helpers.createGenerator( - 'angular:app', - [ - '../../../app', - '../../../common', - '../../../controller', - '../../../main', - [ helpers.createDummyGenerator(), 'karma:app' ] - ], - false, - genOptions - ); - helpers.mockPrompt(angular, mockPrompts); - - done(); - }); - }); - - describe('App files', function () { - it('should generate dotfiles', function (done) { - angular.run({}, function () { - helpers.assertFile(expected); - done(); - }); - }); - - it('creates expected JS files', function (done) { - angular.run({}, function() { - helpers.assertFile([].concat(expected, [ - '.jscsrc', - 'app/scripts/app.js', - 'app/scripts/controllers/main.js', - 'test/spec/controllers/main.js' - ])); - done(); - }); - }); - - it('creates CoffeeScript files', function (done) { - angular.env.options.coffee = true; - angular.run([], function () { - helpers.assertFile([].concat(expected, [ - 'app/scripts/app.coffee', - 'app/scripts/controllers/main.coffee', - 'test/spec/controllers/main.coffee' - ])); - done(); - }); - }); - }); - - describe('Service Subgenerators', function () { - var generatorTest = function (generatorType, specType, targetDirectory, scriptNameFn, specNameFn, suffix, done) { - var name = 'foo'; - var deps = [path.join('../../..', generatorType)]; - var genTester = helpers.createGenerator('angular:' + generatorType, deps, [name], genOptions); - - angular.run([], function () { - genTester.run([], function () { - helpers.assertFileContent([ - [ - path.join('app/scripts', targetDirectory, name + '.js'), - new RegExp( - generatorType + '\\(\'' + scriptNameFn(name) + suffix + '\'', - 'g' - ) - ], - [ - path.join('test/spec', targetDirectory, name + '.js'), - new RegExp( - 'describe\\(\'' + _.classify(specType) + ': ' + specNameFn(name) + suffix + '\'', - 'g' - ) - ] - ]); - done(); - }); - }); - }; - - it('should generate a new controller', function (done) { - generatorTest('controller', 'controller', 'controllers', _.classify, _.classify, 'Ctrl', done); - }); - - it('should generate a new directive', function (done) { - generatorTest('directive', 'directive', 'directives', _.camelize, _.camelize, '', done); - }); - - it('should generate a new filter', function (done) { - generatorTest('filter', 'filter', 'filters', _.camelize, _.camelize, '', done); - }); - - ['constant', 'factory', 'provider', 'value'].forEach(function(t) { - it('should generate a new ' + t, function (done) { - generatorTest(t, 'service', 'services', _.camelize, _.camelize, '', done); - }); - }); - - it('should generate a new service', function (done) { - generatorTest('service', 'service', 'services', _.capitalize, _.capitalize, '', done); - }); - - it('creates typescript files', function (done) { - var expected = [ - 'app/404.html', - 'app/favicon.ico', - 'app/robots.txt', - 'app/styles/main.scss', - 'app/views/main.html', - '.bowerrc', - 'Gruntfile.js', - 'package.json', - 'bower.json', - 'app/scripts/app.ts', - 'app/index.html', - 'app/scripts/controllers/main.ts', - 'test/spec/controllers/main.ts' - ]; - helpers.mockPrompt(angular, { - compass: true, - bootstrap: true, - compassBootstrap: true, - modules: [] - }); - - angular.env.options.typescript = true; - angular.run([], function () { - helpers.assertFiles(expected); - done(); - }); - }); - }); - - describe('View', function () { - it('should generate a new view', function (done) { - var angularView; - var deps = [ '../../../view' ]; - angularView = helpers.createGenerator('angular:view', deps, ['foo'], genOptions); - - helpers.mockPrompt(angularView, mockPrompts); - angularView.run([], function () { - helpers.assertFile(['app/views/foo.html']); - done(); - }); - }); - - it('should generate a new view in subdirectories', function (done) { - var angularView; - var deps = [ '../../../view' ]; - angularView = helpers.createGenerator('angular:view', deps, ['foo/bar'], genOptions); - - helpers.mockPrompt(angularView, mockPrompts); - angularView.run([], function () { - helpers.assertFile(['app/views/foo/bar.html']); - done(); - }); - }); - }); -}); diff --git a/test/test-load.js b/test/test-load.js deleted file mode 100644 index 22dd67ad1..000000000 --- a/test/test-load.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -var assert = require('yeoman-generator').assert; - -describe('Angular-Module generator load test', function () { - it('can be imported without blowing up', function () { - assert(require('../app') !== undefined); - assert(require('../common') !== undefined); - assert(require('../constant') !== undefined); - assert(require('../controller') !== undefined); - assert(require('../decorator') !== undefined); - assert(require('../directive') !== undefined); - assert(require('../factory') !== undefined); - assert(require('../filter') !== undefined); - assert(require('../main') !== undefined); - assert(require('../provider') !== undefined); - assert(require('../route') !== undefined); - assert(require('../service') !== undefined); - assert(require('../value') !== undefined); - assert(require('../view') !== undefined); - }); -}); diff --git a/test/test-route-creation.js b/test/test-route-creation.js deleted file mode 100644 index 74b87bba3..000000000 --- a/test/test-route-creation.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -var path = require('path'); -var helpers = require('yeoman-generator').test; - -describe('Angular generator route', function () { - var angular; - var route = 'simpleroute'; - var expected = [ - 'app/scripts/controllers/' + route + '.js', - 'test/spec/controllers/' + route + '.js', - 'app/views/' + route + '.html' - ]; - var genOptions = { - 'appPath': 'app', - 'skip-install': true, - 'skip-welcome-message': true, - 'skip-message': true - }; - var mockPrompts = { - compass: true, - bootstrap: true, - compassBootstrap: true, - modules: ['routeModule'] - }; - - beforeEach(function (done) { - helpers.testDirectory(path.join(__dirname, 'tmp', route), function (err) { - if (err) { - done(err); - } - angular = helpers.createGenerator( - 'angular:app', - [ - '../../../app', - '../../../common', - '../../../controller', - '../../../main', - '../../../route', - '../../../view', - [ helpers.createDummyGenerator(), 'karma:app'] - ], - false, - genOptions - ); - helpers.mockPrompt(angular, mockPrompts); - angular.run({}, function () { - angular = helpers.createGenerator( - 'angular:route', - [ - '../../../controller', - '../../../route', - '../../../view' - ], - [route], - genOptions - ); - helpers.mockPrompt(angular, mockPrompts); - done(); - }); - }); - }); - - describe('create routes', function () { - it('should generate default route items', function(done){ - angular.run({}, function(e) { - helpers.assertFile(expected); - helpers.assertFileContent( - 'app/scripts/app.js', - new RegExp('when\\(\'/' + route + '\'') - ); - - done(); - }); - }); - - // Test with URI specified explicitly - it('should generate route items with the route uri given', function(done){ - var uri = 'segment1/segment2/:parameter'; - - angular.options.uri = uri; - angular.run({}, function() { - helpers.assertFile(expected); - helpers.assertFileContent( - 'app/scripts/app.js', - new RegExp('when\\(\'/' + uri + '\'') - ); - - done(); - }); - }); - }); -}); diff --git a/test/utils.js b/test/utils.js new file mode 100644 index 000000000..6c8d1e361 --- /dev/null +++ b/test/utils.js @@ -0,0 +1,25 @@ +'use strict'; +var helpers = require('yeoman-test'); + +exports.generateFullProject = function (cb) { + return helpers.run(require.resolve('../app')) + .withGenerators([ + require.resolve('../common'), + require.resolve('../controller'), + require.resolve('../main'), + require.resolve('../route'), + require.resolve('../view'), + [helpers.createDummyGenerator(), 'karma:app'] + ]) + .withOptions({ + 'appPath': 'app', + 'skip-welcome-message': true, + 'skip-message': true + }) + .withPrompts({ + compass: true, + bootstrap: true, + compassBootstrap: true, + modules: [] + }); +} diff --git a/test/value.js b/test/value.js new file mode 100644 index 000000000..2d4b6d760 --- /dev/null +++ b/test/value.js @@ -0,0 +1,22 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:value', function () { + beforeEach(function (done) { + helpers + .run(require.resolve('../value')) + .withArguments('foo') + .on('end', done); + }); + + it('generates a new value', function () { + assert.file('test/spec/services/foo.js'); + assert.fileContent( + path.join('app/scripts/services/foo.js'), + /value\('foo'/ + ); + }); +}); diff --git a/test/view.js b/test/view.js new file mode 100644 index 000000000..1f0c1434d --- /dev/null +++ b/test/view.js @@ -0,0 +1,37 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); +var helpers = require('yeoman-test'); +var assert = require('yeoman-assert'); + +describe('angular:constant', function () { + beforeEach(function () { + this.angularView = helpers + .run(require.resolve('../view')) + .withArguments('foo/bar'); + }); + + describe('default settings', function () { + beforeEach(function (done) { + this.angularView.on('end', done); + }); + + it('generates a new view', function () { + assert.file('app/views/foo/bar.html'); + }); + }); + + describe('--appPath', function () { + beforeEach(function (done) { + this.angularView + .withOptions({ + appPath: 'alternative' + }) + .on('end', done); + }); + + it('generates a new view', function () { + assert.file('alternative/views/foo/bar.html'); + }); + }); +});