gpii-universal
Version:
Cross platform, core components of the GPII personalization infrastructure.
185 lines (157 loc) • 7.44 kB
JavaScript
/*!
GPII Cloud-based Flow Manager with OAuth2 Test Infrastructure
Copyright 2012 OCAD University
Copyright 2012 Antranig Basman
Copyright 2013 Raising the Floor
Copyright 2014 Lucendo Development Ltd.
Copyright 2015-2018 OCAD University
Licensed under the New BSD license. You may not use this file except in
compliance with this License.
You may obtain a copy of the License at
https://github.com/gpii/universal/LICENSE.txt
*/
;
var fluid = require("infusion"),
querystring = require("querystring"),
gpii = fluid.registerNamespace("gpii"),
jqUnit = fluid.registerNamespace("jqUnit");
fluid.registerNamespace("gpii.test.cloudBased.oauth2");
// Cache for storing access tokens
gpii.test.cloudBased.oauth2.accessTokenCache = [];
gpii.test.cloudBased.oauth2.addAccessTokenToCache = function (aToken) {
gpii.test.cloudBased.oauth2.accessTokenCache.push(aToken);
};
gpii.test.cloudBased.oauth2.clearAccessTokenCache = function () {
gpii.test.cloudBased.oauth2.accessTokenCache.length = 0;
};
gpii.test.stringifyFormBody = function (formBody) {
var encoded = fluid.transform(formBody, function (element) {
return typeof(element) === "string" ? element : JSON.stringify(element);
});
return querystring.stringify(encoded);
};
gpii.test.verifyJSONResponse = function (body, request) {
var response = request.nativeResponse;
jqUnit.assertEquals("Should have received a 200 response", 200, response.statusCode);
jqUnit.assertTrue("Should have received an JSON response type", response.headers["content-type"].indexOf("application/json") === 0);
return JSON.parse(body);
};
gpii.test.verifyStatusCodeResponse = function (body, request, statusCode) {
var response = request.nativeResponse;
jqUnit.assertEquals("Should have received a " + statusCode + " response", statusCode, response.statusCode);
};
gpii.test.cloudBased.oauth2.sendRequest = function (request, options, formBody, filterName) {
formBody = gpii.test.cloudBased.oauth2.filter(formBody, options, filterName);
request.send(gpii.test.stringifyFormBody(formBody));
};
gpii.test.cloudBased.oauth2.verifyFieldInResponse = function (response, request, funcName, fieldName) {
var fieldValue = fluid.get(response, fieldName);
fluid.log(funcName + " Got " + fieldName + ": ", fieldValue);
jqUnit.assertValue("Should have received " + fieldName, fieldValue);
fluid.set(request, fieldName, fieldValue);
};
gpii.test.cloudBased.oauth2.sendResourceOwnerGpiiKeyAccessTokenRequest = function (accessTokenRequest, options) {
var formBody = {
grant_type: "password",
client_id: options.client_id,
client_secret: options.client_secret,
username: options.username,
password: options.password
};
gpii.test.cloudBased.oauth2.sendRequest(accessTokenRequest, options, formBody, "accessTokenForm");
};
gpii.test.cloudBased.oauth2.verifyResourceOwnerGpiiKeyAccessTokenInResponse = function (body, accessTokenRequest) {
var response = gpii.test.verifyJSONResponse(body, accessTokenRequest);
gpii.test.cloudBased.oauth2.verifyFieldInResponse(response, accessTokenRequest, "oauth2.verifyResourceOwnerGpiiKeyAccessTokenInResponse", "access_token");
gpii.test.cloudBased.oauth2.verifyFieldInResponse(response, accessTokenRequest, "oauth2.verifyResourceOwnerGpiiKeyAccessTokenInResponse", "expiresIn");
if (accessTokenRequest.access_token) {
gpii.test.cloudBased.oauth2.addAccessTokenToCache(accessTokenRequest.access_token);
fluid.log("Cached access token ", accessTokenRequest.access_token);
}
return response;
};
gpii.test.cloudBased.oauth2.sendRequestWithAccessToken = function (request, accessToken, data) {
var securedHeader = {
headers: {
Authorization: "Bearer " + accessToken
}
};
request.send(data ? data : null, securedHeader);
};
fluid.defaults("gpii.test.cloudBased.oauth2.testCaseHolder", {
gradeNames: ["kettle.test.testCaseHolder"],
selectedPreferences: {
"": true
},
components: {
accessTokenRequest: {
type: "kettle.test.request.http",
options: {
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
path: "/access_token",
port: 8081,
method: "POST"
}
}
}
});
gpii.test.cloudBased.oauth2.buildTestFixtureCommon = function (testDef, commonRec, config, testCaseGrade) {
testDef = fluid.extend(true, {}, testDef, commonRec);
testDef.sequence = fluid.makeArray(testDef.sequence);
testDef.gradeNames = fluid.makeArray(testDef.gradeNames);
testDef.gradeNames.push("gpii.test.cloudBased.oauth2.testCaseHolder");
if (testCaseGrade) {
testDef.gradeNames.push(testCaseGrade);
}
testDef.config = config;
return testDef;
};
gpii.test.cloudBased.oauth2.buildDisruptedFixture = function (testDef, commonRec, disruption, config, testCaseGrade) {
var options = fluid.defaults(disruption.sequenceGrade);
testDef = gpii.test.cloudBased.oauth2.buildTestFixtureCommon(testDef, commonRec, config, testCaseGrade);
if (options.expect) {
testDef.expect = options.expect;
}
if (disruption.expected) {
testDef.expected = disruption.expected;
}
if (disruption.name) {
testDef.name += " - " + disruption.name;
}
testDef.gradeNames = testDef.gradeNames.concat(fluid.makeArray(options.testCaseGradeNames));
testDef.expectedStatusCode = disruption.expectedStatusCode || options.expectedStatusCode;
var changes = fluid.makeArray(options.changes).concat(fluid.makeArray(disruption.changes));
fluid.set(testDef, [options.recordName, "changes"], changes);
return testDef;
};
// Marker grade for "disruptions", whose unique variations are superimposed on a "common" test definition.
fluid.defaults("gpii.test.disruption", {
gradeNames: ["fluid.component"]
});
gpii.test.cloudBased.oauth2.filter = function (model, options, filterName) {
var changes = fluid.get(options, [filterName, "changes"]);
fluid.log("cloudBased.oauth2.filter fetched changes " + JSON.stringify(changes, null, 2) + " for filter name " + filterName);
return changes ? gpii.test.cloudBased.oauth2.filterModel(model, changes) : model;
};
gpii.test.cloudBased.oauth2.filterModel = function (model, changes) {
var holder = {
model: fluid.copy(model)
};
var applier = fluid.makeHolderChangeApplier(holder);
fluid.fireChanges(applier, changes);
fluid.log("cloudBased.oauth2.filterModel returning filtered model ", JSON.stringify(holder.model, null, 2));
return holder.model;
};
gpii.test.cloudBased.oauth2.runDisruptedTests = function (testDefsToDisrupt, config, testEnvironment, testCaseGrade) {
fluid.each(testDefsToDisrupt, function (testDefToDisrupt) {
fluid.each(testDefToDisrupt.disruptions, function (disruption) {
var disruptedTestDef = gpii.test.cloudBased.oauth2.buildDisruptedFixture(testDefToDisrupt.testDef, {}, disruption, config, testCaseGrade);
gpii.test.runTestDefs([disruptedTestDef], function (testDef) {
var gradedTestDef = gpii.test.testDefToEnvironment(testDef, testEnvironment, disruption.sequenceGrade);
return gradedTestDef;
});
});
});
};