Skip to content

Commit

Permalink
Add blueprints for authorizers and authenticators
Browse files Browse the repository at this point in the history
  • Loading branch information
quaertym authored and marcoow committed Feb 2, 2016
1 parent dc47894 commit 89cb397
Show file tree
Hide file tree
Showing 11 changed files with 352 additions and 3 deletions.
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

0 comments on commit 89cb397

Please sign in to comment.