This commit is contained in:
Owen Brotherwood 2017-05-29 07:44:56 +00:00 committed by GitHub
commit 5789ece593
2 changed files with 217 additions and 0 deletions

View File

@ -0,0 +1,104 @@
'use strict';
var debug = require('debug')('AccessToken.test');
var inspect = require('util').inspect;
/*
* API:Middleware:loopback.token(options)
*/
var S = {
REQUIRE:{
FILE: {
TEST: {
LOOPBACK: {
TOKEN: './TEST-loopback-token-searchDefaultTokenKeys',
}
}
}
}
};
var api = {
loopback: {
token: {
optionsUndefined: require(S.REQUIRE.FILE.TEST.LOOPBACK.TOKEN).api.loopback.token.optionsUndefined,
options:{
searchDefaultTokenKeys: require(S.REQUIRE.FILE.TEST.LOOPBACK.TOKEN).api.loopback.token.options.searchDefaultTokenKeys
}
}
}
};
describe('API:Middleware:loopback.token(options)', function() {
describe('options = {}', function() {
var itTxt;
var expect = 200;
var header = 'authorization';
var testOptions = {
expect: expect,
header: header,
};
// describe('A normal use case, where a well-known header is used with no other options needed');
itTxt = 'Test header=' + header + ' and expect ' + expect;
it(itTxt, function(done) {
testOptions['done'] = done;
api.loopback.token.optionsUndefined(testOptions);
});
});
describe('options.searchDefaultTokenKeys: [true|false]', function() {
var itTxt;
var expect = 200;
var searchDefaultTokenKeys = false;
var header = 'authorization';
var testOptions = {
expect: expect,
header: header,
};
var headers = ['header'];
var tokenOptions = {
searchDefaultTokenKeys: searchDefaultTokenKeys,
headers: headers,
};
// describe('The normal use case for searchDefaultTokenKeys')
itTxt = 'Test header=' + header + ' searchDefaultTokenKeys=' + searchDefaultTokenKeys + ' and expect ' + expect;
it(itTxt, function(done) {
testOptions['done'] = done;
api.loopback.token.options.searchDefaultTokenKeys(testOptions, tokenOptions);
});
// describe('Specific enabelment of searchDefaultTokenKeys')
searchDefaultTokenKeys = true;
headers = [];
itTxt = 'Test header=' + header + ' searchDefaultTokenKeys=' + searchDefaultTokenKeys + ' and expect ' + expect;
it(itTxt, function(done) {
testOptions['done'] = done;
testOptions['headers'] = headers;
api.loopback.token.options.searchDefaultTokenKeys(testOptions, tokenOptions);
});
// describe('A test case for regression')
searchDefaultTokenKeys = undefined;
headers = [];
itTxt = 'Test header=' + header + ' searchDefaultTokenKeys=' + searchDefaultTokenKeys + ' and expect ' + expect;
it(itTxt, function(done) {
testOptions['searchDefaultTokenKeys'] = undefined; //FIXME: is this a good way
testOptions['headers'] = headers;
testOptions['done'] = done;
api.loopback.token.options.searchDefaultTokenKeys(testOptions, tokenOptions);
});
/*
FIXME: TEST appGet try/catch does not support this test
// describe('A non-normal use case to check that default token headers are not used')
searchDefaultTokenKeys = false; // any defaults ...
headers = []; // ... are not concated, and the empty array for token areas ...
expect = 401; // ... gives the expected result.
itTxt = 'Test header='+ header +' searchDefaultTokenKeys='+ searchDefaultTokenKeys +' no headers and expect '+ expect;
it(itTxt, function(done) {
testOptions['done'] = done;
testOptions['searchDefaultTokenKeys'] = searchDefaultTokenKeys;
testOptions['expect'] = expect;
testOptions['headers'] = headers;
api.loopback.token.searchDefaultTokenKeys(testOptions, tokenOptions);
});
*/
});
});

View File

@ -0,0 +1,113 @@
'use strict';
var debug = require('debug')('AccessToken.app');
var inspect = require('util').inspect;
/*
TEST:Middleware:loopback.token.searchDefaultTokenKeys
*/
module.exports = {
api : {
loopback: {
token: {
optionsUndefined: optionsUndefined,
options: {
searchDefaultTokenKeys: searchDefaultTokenKeys,
}
}
}
}
};
var loopback = require('../');
var tokenId; //FIXME: another way than this 'global'
function optionsUndefined(testOptions) {
debug('optionsUndefined testOptions:\n' + inspect(testOptions) + '\n');
var tokenOptions = {};
var app = createTokenStartApp(testOptions, tokenOptions);
}
function searchDefaultTokenKeys(testOptions, tokenOptions) {
debug('optionsUndefined searchDefaultTokenKeys:\n' + inspect(testOptions) + '\n');
var app = createTokenStartApp(testOptions, tokenOptions);
}
function sendRequest(app, testOptions) {
debug('sendRequest testOptions.tokenId:\n' + inspect(testOptions.tokenId) + '\n');
request(app)
.get(testOptions.get)
.set(testOptions.header, testOptions.tokenId)
.expect(testOptions.expect)
.end(testOptions.done);
}
function createTokenStartApp(testOptions, tokenOptions) {
var extend = require('util')._extend;
var Token = loopback.AccessToken.extend('MyToken');
var tokenDataSource = loopback.createDataSource({connector: loopback.Memory});
var tokenCreate = {userId: '123'};
var done = testOptions.done;
testOptions['get'] = '/';
Token.attachTo(tokenDataSource);
tokenOptions['model'] = Token;
tokenOptions['currentUserLiteral'] = 'me';
Token.create(tokenCreate, function(err, token) {
if (err) return done(err);
testOptions['tokenId'] = token.id;
var app = startApp(testOptions, tokenOptions);
sendRequest(app, testOptions);
});
}
function attachAndReturnModel() {
var ACL = loopback.ACL;
var acl = {
principalType: 'ROLE',
principalId: '$everyone',
accessType: ACL.ALL,
permission: ACL.DENY,
property: '*'
};
var modelOptions = {acls: [acl]};
var TestModel = loopback.PersistedModel.extend('test', {}, modelOptions);
TestModel.attachTo(loopback.memory());
return TestModel;
}
// FIXME: try/catch does not support searchDefaultTokenKeys = false and headers = []
function appGet(req, res) {
debug('appeget req:\n' + inspect(req) + '\n' );
debug('appeget res:\n' + inspect(res) + '\n' );
/*
debug('appGet req.headers:\n' + inspect(req.headers) + '\n');
debug('appGet req.accessToken:\n' + inspect(req.accessToken) + '\n');
debug('appGet tokenId:\n' + tokenId + '\n');
*/
var send = '200';
try {
assert(req.accessToken, 'req should have accessToken');
assert(req.accessToken.id === tokenId); //FIXME: another way than this 'global'
// FIXME: ok the req HAS accessToken.id but this is not a good test
} catch (error) {
debug('app.get error:\n' + error + '\n');
send = '401';
}
debug('app.get send:\n' + send + '\n');
res.send(send);
}
function startApp(testOptions, tokenOptions) {
var get = testOptions.get;
var app = loopback();
var TestModel = attachAndReturnModel();
app.model(TestModel);
app.use(loopback.token(tokenOptions)); // The subject of all this work
app.get(get, appGet);
app.use(loopback.rest());
app.enableAuth();
return app;
}