UNPKG

ember-cli-ajh

Version:

Command line tool for developing ambitious ember.js apps

825 lines (775 loc) 27.6 kB
/*jshint quotmark: false*/ 'use strict'; var Promise = require('../../lib/ext/promise'); var assertFile = require('../helpers/assert-file'); var assertFileEquals = require('../helpers/assert-file-equals'); var assertFileToNotExist = require('../helpers/assert-file-to-not-exist'); var conf = require('../helpers/conf'); var ember = require('../helpers/ember'); var fs = require('fs-extra'); var path = require('path'); var remove = Promise.denodeify(fs.remove); var root = process.cwd(); var tmp = require('tmp-sync'); var tmproot = path.join(root, 'tmp'); var EOL = require('os').EOL; var BlueprintNpmTask = require('../helpers/disable-npm-on-blueprint'); var expect = require('chai').expect; describe('Acceptance: ember generate in-repo-addon', function() { this.timeout(20000); var tmpdir; before(function() { BlueprintNpmTask.disableNPM(); conf.setup(); }); after(function() { BlueprintNpmTask.restoreNPM(); conf.restore(); }); beforeEach(function() { tmpdir = tmp.in(tmproot); process.chdir(tmpdir); }); afterEach(function() { process.chdir(root); return remove(tmproot); }); function initApp() { return ember([ 'init', '--name=my-app', '--skip-npm', '--skip-bower' ]); } function initInRepoAddon() { return initApp().then(function() { return ember([ 'generate', 'in-repo-addon', 'my-addon' ]); }); } function generateInRepoAddon(args) { var generateArgs = ['generate'].concat(args); return initInRepoAddon().then(function() { return ember(generateArgs); }); } it('in-repo-addon controller foo', function() { return generateInRepoAddon(['controller', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/controllers/foo.js', { contains: [ "import Ember from 'ember';", "export default Ember.Controller.extend({" + EOL + "});" ] }); assertFile('lib/my-addon/app/controllers/foo.js', { contains: [ "export { default } from 'my-addon/controllers/foo';" ] }); assertFile('tests/unit/controllers/foo-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('controller:foo'" ] }); }); }); it('in-repo-addon controller foo/bar', function() { return generateInRepoAddon(['controller', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/controllers/foo/bar.js', { contains: [ "import Ember from 'ember';", "export default Ember.Controller.extend({" + EOL + "});" ] }); assertFile('lib/my-addon/app/controllers/foo/bar.js', { contains: [ "export { default } from 'my-addon/controllers/foo/bar';" ] }); assertFile('tests/unit/controllers/foo/bar-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('controller:foo/bar'" ] }); }); }); it('in-repo-addon component x-foo', function() { return generateInRepoAddon(['component', 'x-foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/components/x-foo.js', { contains: [ "import Ember from 'ember';", "import layout from '../templates/components/x-foo';", "export default Ember.Component.extend({", "layout: layout", "});" ] }); assertFile('lib/my-addon/addon/templates/components/x-foo.hbs', { contains: "{{yield}}" }); assertFile('lib/my-addon/app/components/x-foo.js', { contains: [ "export { default } from 'my-addon/components/x-foo';" ] }); assertFile('tests/integration/components/x-foo-test.js', { contains: [ "import { moduleForComponent, test } from 'ember-qunit';", "import hbs from 'htmlbars-inline-precompile';", "moduleForComponent('x-foo'", "integration: true", "{{x-foo}}", "{{#x-foo}}" ] }); }); }); it('in-repo-addon component-test x-foo', function() { return generateInRepoAddon(['component-test', 'x-foo', '--in-repo-addon=my-addon']).then(function() { assertFile('tests/integration/components/x-foo-test.js', { contains: [ "import { moduleForComponent, test } from 'ember-qunit';", "import hbs from 'htmlbars-inline-precompile';", "moduleForComponent('x-foo'", "integration: true", "{{x-foo}}", "{{#x-foo}}" ] }); }); }); it('in-repo-addon component-test x-foo --unit', function() { return generateInRepoAddon(['component-test', 'x-foo', '--in-repo-addon=my-addon', '--unit']).then(function() { assertFile('tests/unit/components/x-foo-test.js', { contains: [ "import { moduleForComponent, test } from 'ember-qunit';", "moduleForComponent('x-foo'", "unit: true" ] }); }); }); it('in-repo-addon component nested/x-foo', function() { return generateInRepoAddon(['component', 'nested/x-foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/components/nested/x-foo.js', { contains: [ "import Ember from 'ember';", "import layout from '../../templates/components/nested/x-foo';", "export default Ember.Component.extend({", "layout: layout", "});" ] }); assertFile('lib/my-addon/addon/templates/components/nested/x-foo.hbs', { contains: "{{yield}}" }); assertFile('lib/my-addon/app/components/nested/x-foo.js', { contains: [ "export { default } from 'my-addon/components/nested/x-foo';" ] }); assertFile('tests/integration/components/nested/x-foo-test.js', { contains: [ "import { moduleForComponent, test } from 'ember-qunit';", "import hbs from 'htmlbars-inline-precompile';", "moduleForComponent('nested/x-foo'", "integration: true" ] }); }); }); it('in-repo-addon helper foo-bar', function() { return generateInRepoAddon(['helper', 'foo-bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/helpers/foo-bar.js', { contains: "import Ember from 'ember';" + EOL + EOL + "export function fooBar(params/*, hash*/) {" + EOL + " return params;" + EOL + "}" + EOL + EOL + "export default Ember.Helper.helper(fooBar);" }); assertFile('lib/my-addon/app/helpers/foo-bar.js', { contains: [ "export { default, fooBar } from 'my-addon/helpers/foo-bar';" ] }); assertFile('tests/unit/helpers/foo-bar-test.js', { contains: "import { fooBar } from '../../../helpers/foo-bar';" }); }); }); it('in-repo-addon helper foo/bar-baz', function() { return generateInRepoAddon(['helper', 'foo/bar-baz', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/helpers/foo/bar-baz.js', { contains: "import Ember from 'ember';" + EOL + EOL + "export function fooBarBaz(params/*, hash*/) {" + EOL + " return params;" + EOL + "}" + EOL + EOL + "export default Ember.Helper.helper(fooBarBaz);" }); assertFile('lib/my-addon/app/helpers/foo/bar-baz.js', { contains: [ "export { default, fooBarBaz } from 'my-addon/helpers/foo/bar-baz';" ] }); assertFile('tests/unit/helpers/foo/bar-baz-test.js', { contains: "import { fooBarBaz } from '../../../../helpers/foo/bar-baz';" }); }); }); it('in-repo-addon model foo', function() { return generateInRepoAddon(['model', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/models/foo.js', { contains: [ "import DS from 'ember-data';", "export default DS.Model.extend" ] }); assertFile('lib/my-addon/app/models/foo.js', { contains: [ "export { default } from 'my-addon/models/foo';" ] }); assertFile('tests/unit/models/foo-test.js', { contains: [ "import { moduleForModel, test } from 'ember-qunit';", "moduleForModel('foo'" ] }); }); }); it('in-repo-addon model foo with attributes', function() { return generateInRepoAddon([ 'model', 'foo', 'noType', 'firstName:string', 'created_at:date', 'is-published:boolean', 'rating:number', 'bars:has-many', 'baz:belongs-to', 'echo:hasMany', 'bravo:belongs_to', 'foo-names:has-many', 'barName:has-many', 'bazName:belongs-to', 'test-name:belongs-to', 'echoName:hasMany', 'bravoName:belongs_to', '--in-repo-addon=my-addon' ]).then(function() { assertFile('lib/my-addon/addon/models/foo.js', { contains: [ "noType: DS.attr()", "firstName: DS.attr('string')", "createdAt: DS.attr('date')", "isPublished: DS.attr('boolean')", "rating: DS.attr('number')", "bars: DS.hasMany('bar')", "baz: DS.belongsTo('baz')", "echos: DS.hasMany('echo')", "bravo: DS.belongsTo('bravo')", "fooNames: DS.hasMany('foo-name')", "barNames: DS.hasMany('bar-name')", "bazName: DS.belongsTo('baz-name')", "testName: DS.belongsTo('test-name')", "echoNames: DS.hasMany('echo-name')", "bravoName: DS.belongsTo('bravo-name')" ] }); assertFile('lib/my-addon/app/models/foo.js', { contains: [ "export { default } from 'my-addon/models/foo';" ] }); assertFile('tests/unit/models/foo-test.js', { contains: [ "needs: [", "'model:bar',", "'model:baz',", "'model:echo',", "'model:bravo',", "'model:foo-name',", "'model:bar-name',", "'model:baz-name',", "'model:echo-name',", "'model:test-name',", "'model:bravo-name'", "]" ] }); }); }); it('in-repo-addon model foo/bar', function() { return generateInRepoAddon(['model', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/models/foo/bar.js', { contains: [ "import DS from 'ember-data';", "export default DS.Model.extend" ] }); assertFile('lib/my-addon/app/models/foo/bar.js', { contains: [ "export { default } from 'my-addon/models/foo/bar';" ] }); assertFile('tests/unit/models/foo/bar-test.js', { contains: [ "import { moduleForModel, test } from 'ember-qunit';", "moduleForModel('foo/bar'" ] }); }); }); it('in-repo-addon route foo', function() { return generateInRepoAddon(['route', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/routes/foo.js', { contains: [ "import Ember from 'ember';", "export default Ember.Route.extend({" + EOL + "});" ] }); assertFile('lib/my-addon/app/routes/foo.js', { contains: "export { default } from 'my-addon/routes/foo';" }); assertFile('lib/my-addon/addon/templates/foo.hbs', { contains: '{{outlet}}' }); assertFile('lib/my-addon/app/templates/foo.js', { contains: "export { default } from 'my-addon/templates/foo';" }); assertFile('tests/unit/routes/foo-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('route:foo'" ] }); }); }); it('in-repo-addon route foo/bar', function() { return generateInRepoAddon(['route', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/routes/foo/bar.js', { contains: [ "import Ember from 'ember';", "export default Ember.Route.extend({" + EOL + "});" ] }); assertFile('lib/my-addon/app/routes/foo/bar.js', { contains: "export { default } from 'my-addon/routes/foo/bar';" }); assertFile('lib/my-addon/addon/templates/foo/bar.hbs', { contains: '{{outlet}}' }); assertFile('lib/my-addon/app/templates/foo/bar.js', { contains: "export { default } from 'my-addon/templates/foo/bar';" }); assertFile('tests/unit/routes/foo/bar-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('route:foo/bar'" ] }); }); }); it('in-repo-addon template foo', function() { return generateInRepoAddon(['template', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/templates/foo.hbs'); }); }); it('in-repo-addon template foo/bar', function() { return generateInRepoAddon(['template', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/templates/foo/bar.hbs'); }); }); it('in-repo-addon view foo', function() { return generateInRepoAddon(['view', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/views/foo.js', { contains: [ "import Ember from 'ember';", "export default Ember.View.extend({" + EOL + "})" ] }); assertFile('lib/my-addon/app/views/foo.js', { contains: [ "export { default } from 'my-addon/views/foo';" ] }); assertFile('tests/unit/views/foo-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('view:foo'" ] }); }); }); it('in-repo-addon view foo/bar', function() { return generateInRepoAddon(['view', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/views/foo/bar.js', { contains: [ "import Ember from 'ember';", "export default Ember.View.extend({" + EOL + "})" ] }); assertFile('lib/my-addon/app/views/foo/bar.js', { contains: [ "export { default } from 'my-addon/views/foo/bar';" ] }); assertFile('tests/unit/views/foo/bar-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('view:foo/bar'" ] }); }); }); it('in-repo-addon resource foos', function() { return generateInRepoAddon(['resource', 'foos', '--in-repo-addon=my-addon']).catch(function(error) { expect(error.message).to.include('blueprint does not support ' + 'generating inside addons.'); }); }); it('in-repo-addon initializer foo', function() { return generateInRepoAddon(['initializer', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/initializers/foo.js', { contains: "export function initialize(/* application */) {" + EOL + " // application.inject('route', 'foo', 'service:foo');" + EOL + "}" + EOL + "" + EOL+ "export default {" + EOL + " name: 'foo'," + EOL + " initialize" + EOL + "};" }); assertFile('lib/my-addon/app/initializers/foo.js', { contains: [ "export { default, initialize } from 'my-addon/initializers/foo';" ] }); assertFile('tests/unit/initializers/foo-test.js'); }); }); it('in-repo-addon initializer foo/bar', function() { return generateInRepoAddon(['initializer', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/initializers/foo/bar.js', { contains: "export function initialize(/* application */) {" + EOL + " // application.inject('route', 'foo', 'service:foo');" + EOL + "}" + EOL + "" + EOL+ "export default {" + EOL + " name: 'foo/bar'," + EOL + " initialize" + EOL + "};" }); assertFile('lib/my-addon/app/initializers/foo/bar.js', { contains: [ "export { default, initialize } from 'my-addon/initializers/foo/bar';" ] }); assertFile('tests/unit/initializers/foo/bar-test.js'); }); }); it('in-repo-addon mixin foo', function() { return generateInRepoAddon(['mixin', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/mixins/foo.js', { contains: [ "import Ember from 'ember';", 'export default Ember.Mixin.create({' + EOL + '});' ] }); assertFile('tests/unit/mixins/foo-test.js', { contains: [ "import FooMixin from '../../../mixins/foo';" ] }); }); }); it('in-repo-addon mixin foo/bar', function() { return generateInRepoAddon(['mixin', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/mixins/foo/bar.js', { contains: [ "import Ember from 'ember';", 'export default Ember.Mixin.create({' + EOL + '});' ] }); assertFile('tests/unit/mixins/foo/bar-test.js', { contains: [ "import FooBarMixin from '../../../mixins/foo/bar';" ] }); }); }); it('in-repo-addon mixin foo/bar/baz', function() { return generateInRepoAddon(['mixin', 'foo/bar/baz', '--in-repo-addon=my-addon']).then(function() { assertFile('tests/unit/mixins/foo/bar/baz-test.js', { contains: [ "import FooBarBazMixin from '../../../mixins/foo/bar/baz';" ] }); }); }); it('in-repo-addon adapter application', function() { return generateInRepoAddon(['adapter', 'application', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/adapters/application.js', { contains: [ "import DS from \'ember-data\';", "export default DS.RESTAdapter.extend({" + EOL + "});" ] }); assertFile('lib/my-addon/app/adapters/application.js', { contains: [ "export { default } from 'my-addon/adapters/application';" ] }); assertFile('tests/unit/adapters/application-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('adapter:application'" ] }); }); }); it('in-repo-addon adapter foo', function() { return generateInRepoAddon(['adapter', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/adapters/foo.js', { contains: [ "import DS from \'ember-data\';", "export default DS.RESTAdapter.extend({" + EOL + "});" ] }); assertFile('lib/my-addon/app/adapters/foo.js', { contains: [ "export { default } from 'my-addon/adapters/foo';" ] }); assertFile('tests/unit/adapters/foo-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('adapter:foo'" ] }); }); }); it('in-repo-addon adapter foo/bar (with base class foo)', function() { return generateInRepoAddon(['adapter', 'foo/bar', '--in-repo-addon=my-addon', '--base-class=foo']).then(function() { assertFile('lib/my-addon/addon/adapters/foo/bar.js', { contains: [ "import FooAdapter from \'../foo\';", "export default FooAdapter.extend({" + EOL + "});" ] }); assertFile('lib/my-addon/app/adapters/foo/bar.js', { contains: [ "export { default } from 'my-addon/adapters/foo/bar';" ] }); assertFile('tests/unit/adapters/foo/bar-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('adapter:foo/bar'" ] }); }); }); it('in-repo-addon serializer foo', function() { return generateInRepoAddon(['serializer', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/serializers/foo.js', { contains: [ "import DS from 'ember-data';", 'export default DS.RESTSerializer.extend({' + EOL + '});' ] }); assertFile('lib/my-addon/app/serializers/foo.js', { contains: [ "export { default } from 'my-addon/serializers/foo';" ] }); assertFile('tests/unit/serializers/foo-test.js', { contains: [ "import { moduleForModel, test } from 'ember-qunit';", ] }); }); }); it('in-repo-addon serializer foo/bar', function() { return generateInRepoAddon(['serializer', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/serializers/foo/bar.js', { contains: [ "import DS from 'ember-data';", 'export default DS.RESTSerializer.extend({' + EOL + '});' ] }); assertFile('lib/my-addon/app/serializers/foo/bar.js', { contains: [ "export { default } from 'my-addon/serializers/foo/bar';" ] }); assertFile('tests/unit/serializers/foo/bar-test.js', { contains: [ "import { moduleForModel, test } from 'ember-qunit';", "moduleForModel('foo/bar'" ] }); }); }); it('in-repo-addon transform foo', function() { return generateInRepoAddon(['transform', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/transforms/foo.js', { contains: [ "import DS from 'ember-data';", 'export default DS.Transform.extend({' + EOL + ' deserialize(serialized) {' + EOL + ' return serialized;' + EOL + ' },' + EOL + EOL + ' serialize(deserialized) {' + EOL + ' return deserialized;' + EOL + ' }' + EOL + '});' ] }); assertFile('lib/my-addon/app/transforms/foo.js', { contains: [ "export { default } from 'my-addon/transforms/foo';" ] }); assertFile('tests/unit/transforms/foo-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('transform:foo'" ] }); }); }); it('in-repo-addon transform foo/bar', function() { return generateInRepoAddon(['transform', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/transforms/foo/bar.js', { contains: [ "import DS from 'ember-data';", 'export default DS.Transform.extend({' + EOL + ' deserialize(serialized) {' + EOL + ' return serialized;' + EOL + ' },' + EOL + '' + EOL + ' serialize(deserialized) {' + EOL + ' return deserialized;' + EOL + ' }' + EOL + '});' ] }); assertFile('lib/my-addon/app/transforms/foo/bar.js', { contains: [ "export { default } from 'my-addon/transforms/foo/bar';" ] }); assertFile('tests/unit/transforms/foo/bar-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('transform:foo/bar'" ] }); }); }); it('in-repo-addon util foo-bar', function() { return generateInRepoAddon(['util', 'foo-bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/utils/foo-bar.js', { contains: 'export default function fooBar() {' + EOL + ' return true;' + EOL + '}' }); assertFile('lib/my-addon/app/utils/foo-bar.js', { contains: [ "export { default } from 'my-addon/utils/foo-bar';" ] }); assertFile('tests/unit/utils/foo-bar-test.js', { contains: [ "import fooBar from '../../../utils/foo-bar';" ] }); }); }); it('in-repo-addon util foo-bar/baz', function() { return generateInRepoAddon(['util', 'foo/bar-baz', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/utils/foo/bar-baz.js', { contains: 'export default function fooBarBaz() {' + EOL + ' return true;' + EOL + '}' }); assertFile('lib/my-addon/app/utils/foo/bar-baz.js', { contains: [ "export { default } from 'my-addon/utils/foo/bar-baz';" ] }); assertFile('tests/unit/utils/foo/bar-baz-test.js', { contains: [ "import fooBarBaz from '../../../utils/foo/bar-baz';" ] }); }); }); it('in-repo-addon service foo', function() { return generateInRepoAddon(['service', 'foo', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/services/foo.js', { contains: [ "import Ember from 'ember';", 'export default Ember.Service.extend({' + EOL + '});' ] }); assertFile('lib/my-addon/app/services/foo.js', { contains: [ "export { default } from 'my-addon/services/foo';" ] }); assertFile('tests/unit/services/foo-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('service:foo'" ] }); }); }); it('in-repo-addon service foo/bar', function() { return generateInRepoAddon(['service', 'foo/bar', '--in-repo-addon=my-addon']).then(function() { assertFile('lib/my-addon/addon/services/foo/bar.js', { contains: [ "import Ember from 'ember';", 'export default Ember.Service.extend({' + EOL + '});' ] }); assertFile('lib/my-addon/app/services/foo/bar.js', { contains: [ "export { default } from 'my-addon/services/foo/bar';" ] }); assertFile('tests/unit/services/foo/bar-test.js', { contains: [ "import { moduleFor, test } from 'ember-qunit';", "moduleFor('service:foo/bar'" ] }); }); }); it('in-repo-addon acceptance-test foo', function() { return generateInRepoAddon(['acceptance-test', 'foo', '--in-repo-addon=my-addon']).then(function() { var expected = path.join(__dirname, '../fixtures/generate/acceptance-test-expected.js'); assertFileEquals('tests/acceptance/foo-test.js', expected); assertFileToNotExist('app/acceptance-tests/foo.js'); }); }); it('in-repo-addon adds path to lib', function() { return initInRepoAddon().then(function() { assertFile('package.json', { contains: [ 'lib/my-addon' ] }); }); }); });