Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add authenticator/authorizer blueprints #879

Merged
merged 1 commit into from
Feb 2, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ bower.json
ember-cli-build.js
Brocfile.js
testem.json
node-tests
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ install:
- bower install

script:
- ember try $EMBER_TRY_SCENARIO test
- ember try $EMBER_TRY_SCENARIO test && npm run nodetest

notifications:
email: false
Expand Down
7 changes: 7 additions & 0 deletions blueprints/.jshintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"predef": [
"console"
],
"strict": false,
"node": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<%= imports %>

export default <%= baseClass %>.extend({<%= body %>
});
54 changes: 54 additions & 0 deletions blueprints/authenticator/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
var EOL = require('os').EOL;
var SilentError = require('silent-error');
var isPackageMissing = require('ember-cli-is-package-missing');

module.exports = {
description: 'Generates an Ember Simple Auth authenticator',

availableOptions: [
{ name: 'base-class', type: String, values: ['oauth2', 'devise', 'torii', 'base'], default: 'base' }
],

locals: function(options) {
var name = options.entity.name;
var baseClass = options.baseClass || 'base';

if (baseClass === 'torii') {
return {
imports: 'import Ember from \'ember\';' + EOL + 'import Torii from \'ember-simple-auth/authenticators/torii\';',
baseClass: 'Torii',
body: EOL + ' torii: Ember.inject.service(\'torii\')'
};
} else if (baseClass === 'oauth2') {
return {
imports: 'import Ember from \'ember\';' + EOL + 'import OAuth2PasswordGrant from \'ember-simple-auth/authenticators/oauth2-password-grant\';',
baseClass: 'OAuth2PasswordGrant',
body: ''
};
} else if (baseClass === 'devise') {
return {
imports: 'import Ember from \'ember\';' + EOL + 'import Devise from \'ember-simple-auth/authenticators/devise\';',
baseClass: 'Devise',
body: ''
};
} else if (baseClass === 'base') {
return {
imports: 'import Ember from \'ember\';' + EOL + 'import Base from \'ember-simple-auth/authenticators/base\';',
baseClass: 'Base',
body: EOL + ' restore(data) {' + EOL + ' },' + EOL + EOL + ' authenticate(/*args*/) {' + EOL + ' },' + EOL + EOL + ' invalidate(data) {' + EOL + ' }'
};
} else if (name === baseClass) {
throw new SilentError('Authenticators cannot extend from themself. Remove the --base-class option or specify one of "oauth2", "torii" or "devise".');
} else {
throw new SilentError('The authenticator base class "' + baseClass + '" is unknown. Remove the --base-class option or specify one of "oauth2", "torii" or "devise".');
}
},

afterInstall: function(options) {
if (!options.dryRun && options.torii && isPackageMissing(this, 'torii')) {
return this.addPackagesToProject([
{ name: 'torii', target: '~0.6.1' }
]);
}
}
};
4 changes: 4 additions & 0 deletions blueprints/authorizer/files/__root__/authorizers/__name__.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<%= imports %>

export default <%= baseClass %>.extend({<%= body %>
});
39 changes: 39 additions & 0 deletions blueprints/authorizer/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
var EOL = require('os').EOL;
var SilentError = require('silent-error');

module.exports = {
description: 'Generates an Ember Simple Auth authorizer',

availableOptions: [
{ name: 'base-class', type: String, values: ['oauth2', 'devise', 'base'], default: 'base' }
],

locals: function(options) {
var name = options.entity.name;
var baseClass = options.baseClass || 'base';

if (baseClass === 'oauth2') {
return {
imports: 'import OAuth2Bearer from \'ember-simple-auth/authorizers/oauth2-bearer\';',
baseClass: 'OAuth2Bearer',
body: ''
};
} else if (baseClass === 'devise') {
return {
imports: 'import Devise from \'ember-simple-auth/authorizers/devise\';',
baseClass: 'Devise',
body: ''
};
} else if (baseClass === 'base') {
return {
imports: 'import Base from \'ember-simple-auth/authorizers/base\';',
baseClass: 'Base',
body: EOL + ' authorize(/*data, block*/) {' + EOL + ' }'
};
} else if (name === baseClass) {
throw new SilentError('Authorizers cannot extend from themself. Remove the --base-class option or specify one of "oauth2" or "devise".');
} else {
throw new SilentError('The authorizer base class "' + baseClass + '" is unknown. Remove the --base-class option or specify one of "oauth2" or "devise".');
}
}
};
93 changes: 93 additions & 0 deletions node-tests/blueprints/authenticator-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
'use strict';

var EOL = require('os').EOL;
var setupTestHooks = require('ember-cli-blueprint-test-helpers/lib/helpers/setup');
var BlueprintHelpers = require('ember-cli-blueprint-test-helpers/lib/helpers/blueprint-helper');
var generateAndDestroy = BlueprintHelpers.generateAndDestroy;

describe('Acceptance: ember generate and destroy authenticator', function() {
setupTestHooks(this);

it('generates a torii authenticator', function() {
return generateAndDestroy(['authenticator', 'application', '--base-class=torii'], {
files: [
{ file: 'app/authenticators/application.js', contains: ['\
import Ember from \'ember\';' + EOL + '\
import Torii from \'ember-simple-auth/authenticators/torii\';' + EOL + '\
' + EOL + '\
export default Torii.extend({' + EOL + '\
torii: Ember.inject.service(\'torii\')' + EOL + '\
});' + EOL + '\
']}
]
});
});

it('generates an OAuth 2.0 authenticator', function() {
return generateAndDestroy(['authenticator', 'application', '--base-class=oauth2'], {
files: [
{ file: 'app/authenticators/application.js', contains: ['\
import Ember from \'ember\';' + EOL + '\
import OAuth2PasswordGrant from \'ember-simple-auth/authenticators/oauth2-password-grant\';' + EOL + '\
' + EOL + '\
export default OAuth2PasswordGrant.extend({' + EOL + '\
});' + EOL + '\
']}
]
});
});

it('generates a devise authenticator', function() {
return generateAndDestroy(['authenticator', 'application', '--base-class=devise'], {
files: [
{ file: 'app/authenticators/application.js', contains: ['\
import Ember from \'ember\';' + EOL + '\
import Devise from \'ember-simple-auth/authenticators/devise\';' + EOL + '\
' + EOL + '\
export default Devise.extend({' + EOL + '\
});' + EOL + '\
']}
]
});
});

it('generates a generic authenticator', function() {
return generateAndDestroy(['authenticator', 'application'], {
files: [
{ file: 'app/authenticators/application.js', contains: ['\
import Ember from \'ember\';' + EOL + '\
import Base from \'ember-simple-auth/authenticators/base\';' + EOL + '\
' + EOL + '\
export default Base.extend({' + EOL + '\
restore(data) {' + EOL + '\
},' + EOL + '\
' + EOL + '\
authenticate(/*args*/) {' + EOL + '\
},' + EOL + '\
' + EOL + '\
invalidate(data) {' + EOL + '\
}' + EOL + '\
});' + EOL + '\
']}
]
});
});

it('throws when the authenticator is specified as its own base class', function() {
return generateAndDestroy(['authenticator', 'application', '--base-class=application'], {
throws: {
message: 'Authenticators cannot extend from themself. Remove the --base-class option or specify one of "oauth2", "torii" or "devise".',
type: 'SilentError'
}
});
});

it('throws when an unknown base class is specified', function() {
return generateAndDestroy(['authenticator', 'application', '--base-class=unknown'], {
throws: {
message: 'The authenticator base class "unknown" is unknown. Remove the --base-class option or specify one of "oauth2", "torii" or "devise".',
type: 'SilentError'
}
});
});
});
69 changes: 69 additions & 0 deletions node-tests/blueprints/authorizer-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
'use strict';

var EOL = require('os').EOL;
var setupTestHooks = require('ember-cli-blueprint-test-helpers/lib/helpers/setup');
var BlueprintHelpers = require('ember-cli-blueprint-test-helpers/lib/helpers/blueprint-helper');
var generateAndDestroy = BlueprintHelpers.generateAndDestroy;

describe('Acceptance: ember generate and destroy authorizer', function() {
setupTestHooks(this);

it('generates an OAuth 2.0 authorizer', function() {
return generateAndDestroy(['authorizer', 'application', '--base-class=oauth2'], {
files: [
{ file: 'app/authorizers/application.js', contains: ['\
import OAuth2Bearer from \'ember-simple-auth/authorizers/oauth2-bearer\';' + EOL + '\
' + EOL + '\
export default OAuth2Bearer.extend({' + EOL + '\
});' + EOL + '\
']}
]
});
});

it('generates a devise authorizer', function() {
return generateAndDestroy(['authorizer', 'application', '--base-class=devise'], {
files: [
{ file: 'app/authorizers/application.js', contains: ['\
import Devise from \'ember-simple-auth/authorizers/devise\';' + EOL + '\
' + EOL + '\
export default Devise.extend({' + EOL + '\
});' + EOL + '\
']}
]
});
});

it('generates a generic authorizer', function() {
return generateAndDestroy(['authorizer', 'application'], {
files: [
{ file: 'app/authorizers/application.js', contains: ['\
import Base from \'ember-simple-auth/authorizers/base\';' + EOL + '\
' + EOL + '\
export default Base.extend({' + EOL + '\
authorize(/*data, block*/) {' + EOL + '\
}' + EOL + '\
});' + EOL + '\
']}
]
});
});

it('throws when the authorizer is specified as its own base class', function() {
return generateAndDestroy(['authorizer', 'application', '--base-class=application'], {
throws: {
message: 'Authorizers cannot extend from themself. Remove the --base-class option or specify one of "oauth2" or "devise".',
type: 'SilentError'
}
});
});

it('throws when an unknown base class is specified', function() {
return generateAndDestroy(['authorizer', 'application', '--base-class=unknown'], {
throws: {
message: 'The authorizer base class "unknown" is unknown. Remove the --base-class option or specify one of "oauth2" or "devise".',
type: 'SilentError'
}
});
});
});
70 changes: 70 additions & 0 deletions node-tests/nodetest-runner.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
'use strict';

var glob = require('glob');
var Mocha = require('mocha');
var Promise = require('ember-cli/lib/ext/promise');
var rimraf = require('rimraf');
var mochaOnlyDetector = require('mocha-only-detector');

if (process.env.EOLNEWLINE) {
require('os').EOL = '\n';
}

rimraf.sync('.node_modules-tmp');
rimraf.sync('.bower_components-tmp');

var root = 'node-tests/{blueprints,acceptance,unit}';
var _checkOnlyInTests = Promise.denodeify(mochaOnlyDetector.checkFolder.bind(null, root + '/**/*{-test}.js'));
var optionOrFile = process.argv[2];
var mocha = new Mocha({
timeout: 5000,
reporter: 'spec'
});
var testFiles = glob.sync(root + '/**/*-test.js');

if (optionOrFile === 'all') {
addFiles(mocha, testFiles);
addFiles(mocha, 'node-tests/**/*-test.js');
addFiles(mocha, '/**/*-test-slow.js');
} else if (process.argv.length > 2) {
addFiles(mocha, process.argv.slice(2));
} else {
addFiles(mocha, testFiles);
}

function addFiles(mocha, files) {
files = (typeof files === 'string') ? glob.sync(root + files) : files;
files.forEach(mocha.addFile.bind(mocha));
}

function checkOnlyInTests() {
console.log('Verifing `.only` in tests');
return _checkOnlyInTests().then(function() {
console.log('No `.only` found');
});
}

function runMocha() {
mocha.run(function(failures) {
process.on('exit', function() {
process.exit(failures);
});
});
}

function ciVerificationStep() {
if (process.env.CI === 'true') {
return checkOnlyInTests();
} else {
return Promise.resolve();
}
}

ciVerificationStep()
.then(function() {
runMocha();
})
.catch(function(error) {
console.error(error);
process.exit(1);
});
Loading