1
0
mirror of https://github.com/ansible/awx.git synced 2024-11-02 01:21:21 +03:00

Merge pull request #6672 from jlmitch5/multiCredServiceAndTests

move shared multi credential code to service and add unit tests
This commit is contained in:
jlmitch5 2017-06-22 12:33:09 -04:00 committed by GitHub
commit adb9f05fbd
8 changed files with 633 additions and 305 deletions

View File

@ -9,13 +9,13 @@
'$stateParams', 'JobTemplateForm', 'GenerateForm', 'Rest', 'Alert', '$stateParams', 'JobTemplateForm', 'GenerateForm', 'Rest', 'Alert',
'ProcessErrors', 'ClearScope', 'GetBasePath', 'md5Setup', 'ParseTypeChange', 'Wait', 'ProcessErrors', 'ClearScope', 'GetBasePath', 'md5Setup', 'ParseTypeChange', 'Wait',
'Empty', 'ToJSON', 'CallbackHelpInit', 'GetChoices', '$state', 'Empty', 'ToJSON', 'CallbackHelpInit', 'GetChoices', '$state',
'CreateSelect2', '$q', 'i18n', 'Inventory', 'Project', 'InstanceGroupsService', 'CreateSelect2', '$q', 'i18n', 'Inventory', 'Project', 'InstanceGroupsService', 'MultiCredentialService',
function( function(
$filter, $scope, $filter, $scope,
$stateParams, JobTemplateForm, GenerateForm, Rest, Alert, $stateParams, JobTemplateForm, GenerateForm, Rest, Alert,
ProcessErrors, ClearScope, GetBasePath, md5Setup, ParseTypeChange, Wait, ProcessErrors, ClearScope, GetBasePath, md5Setup, ParseTypeChange, Wait,
Empty, ToJSON, CallbackHelpInit, GetChoices, Empty, ToJSON, CallbackHelpInit, GetChoices,
$state, CreateSelect2, $q, i18n, Inventory, Project, InstanceGroupsService $state, CreateSelect2, $q, i18n, Inventory, Project, InstanceGroupsService, MultiCredentialService
) { ) {
Rest.setUrl(GetBasePath('job_templates')); Rest.setUrl(GetBasePath('job_templates'));
@ -262,30 +262,12 @@
null, true); null, true);
} }
$scope.selectedCredentials.extra.map(cred => cred.id) MultiCredentialService
.forEach(function(cred_id) { .saveExtraCredentials({
creds: $scope.selectedCredentials.extra,
Rest.setUrl(data.related.extra_credentials); url: data.related.extra_credentials
Rest.post({'id': cred_id})
.success(function () {
})
.error(function (data,
status) {
ProcessErrors(
$scope,
data,
status,
form,
{
hdr: 'Error!',
msg: 'Failed to add extra credential. Post returned ' +
'status: ' +
status
});
});
}); });
var orgDefer = $q.defer(); var orgDefer = $q.defer();
var associationDefer = $q.defer(); var associationDefer = $q.defer();
Rest.setUrl(data.related.labels); Rest.setUrl(data.related.labels);

View File

@ -17,14 +17,14 @@ export default
'ParseTypeChange', 'Wait', 'ParseTypeChange', 'Wait',
'Empty', 'Prompt', 'ToJSON', 'GetChoices', 'CallbackHelpInit', 'Empty', 'Prompt', 'ToJSON', 'GetChoices', 'CallbackHelpInit',
'InitiatePlaybookRun' , 'initSurvey', '$state', 'CreateSelect2', 'InitiatePlaybookRun' , 'initSurvey', '$state', 'CreateSelect2',
'ToggleNotification','$q', 'InstanceGroupsService', 'InstanceGroupsData', 'ToggleNotification','$q', 'InstanceGroupsService', 'InstanceGroupsData', 'MultiCredentialService',
function( function(
$filter, $scope, $rootScope, $filter, $scope, $rootScope,
$location, $stateParams, JobTemplateForm, GenerateForm, Rest, Alert, $location, $stateParams, JobTemplateForm, GenerateForm, Rest, Alert,
ProcessErrors, ClearScope, GetBasePath, md5Setup, ProcessErrors, ClearScope, GetBasePath, md5Setup,
ParseTypeChange, Wait, ParseTypeChange, Wait,
Empty, Prompt, ToJSON, GetChoices, CallbackHelpInit, InitiatePlaybookRun, SurveyControllerInit, $state, Empty, Prompt, ToJSON, GetChoices, CallbackHelpInit, InitiatePlaybookRun, SurveyControllerInit, $state,
CreateSelect2, ToggleNotification, $q, InstanceGroupsService, InstanceGroupsData CreateSelect2, ToggleNotification, $q, InstanceGroupsService, InstanceGroupsData, MultiCredentialService
) { ) {
ClearScope(); ClearScope();
@ -396,71 +396,10 @@ export default
null, true); null, true);
} }
let extraCredUrl = data.related.extra_credentials; MultiCredentialService
.findChangedExtraCredentials({
Rest.setUrl(extraCredUrl); creds: $scope.selectedCredentials.extra,
Rest.get() url: data.related.extra_credentials
.then(({data}) => {
let existingCreds = data.results
.map(cred => cred.id);
let newCreds = $scope.selectedCredentials.extra
.map(cred => cred.id);
let toAdd, toRemove;
[toAdd, toRemove] = _.partition(_.xor(existingCreds, newCreds), cred => (newCreds.indexOf(cred) > -1));
let destroyResolve = [];
toRemove.forEach((cred_id) => {
Rest.setUrl(extraCredUrl);
destroyResolve.push(
Rest.post({'id': cred_id, 'disassociate': true})
.catch(({data, status}) => {
ProcessErrors(
$scope,
data,
status,
form,
{
hdr: 'Error!',
msg: 'Failed to remove extra credential. Post returned ' +
'status: ' +
status
});
}));
});
$q.all(destroyResolve)
.then(() => {
toAdd.forEach((cred_id) => {
Rest.setUrl(extraCredUrl);
Rest.post({'id': cred_id})
.catch(({data, status}) => {
ProcessErrors(
$scope,
data,
status,
form,
{
hdr: 'Error!',
msg: 'Failed to add extra credential. Post returned ' +
'status: ' +
status
});
});
});
});
})
.catch(({data, status}) => {
ProcessErrors($scope, data, status, form, {
hdr: 'Error!',
msg: 'Failed to get existing extra credentials. GET returned ' +
'status: ' + status
});
}); });
InstanceGroupsService.editInstanceGroups(instance_group_url, $scope.instance_groups) InstanceGroupsService.editInstanceGroups(instance_group_url, $scope.instance_groups)

View File

@ -1,6 +1,6 @@
export default export default
function CallbackHelpInit($q, $location, GetBasePath, Rest, JobTemplateForm, GenerateForm, $stateParams, ProcessErrors, function CallbackHelpInit($q, $location, GetBasePath, Rest, JobTemplateForm, GenerateForm, $stateParams, ProcessErrors,
ParseVariableString, Empty, Wait) { ParseVariableString, Empty, Wait, MultiCredentialService) {
return function(params) { return function(params) {
var scope = params.scope, var scope = params.scope,
defaultUrl = GetBasePath('job_templates'), defaultUrl = GetBasePath('job_templates'),
@ -134,114 +134,15 @@ export default
scope.can_edit = data.summary_fields.user_capabilities.edit; scope.can_edit = data.summary_fields.user_capabilities.edit;
scope.selectedCredentials = { MultiCredentialService.loadCredentials(data)
machine: null, .then(([selectedCredentials, credTypes, credTypeOptions,
extra: [] credTags]) => {
}; scope.selectedCredentials = selectedCredentials;
scope.credential_types = credTypes;
var credDefers = []; scope.credentialTypeOptions = credTypeOptions;
scope.credentialsToPost = credTags;
if (data.related.credential) { scope.$emit('jobTemplateLoaded', master);
Rest.setUrl(data.related.credential);
credDefers.push(Rest.get()
.then(({data}) => {
scope.selectedCredentials.machine = data;
})
.catch(({data, status}) => {
ProcessErrors(
scope,
data,
status,
null,
{
hdr: 'Error!',
msg: 'Failed to get machine credential. ' +
'Get returned status: ' +
status
});
}));
}
if (data.related.extra_credentials) {
Rest.setUrl(data.related.extra_credentials);
credDefers.push(Rest.get()
.then(({data}) => {
scope.selectedCredentials.extra = data.results;
})
.catch(({data, status}) => {
ProcessErrors(
scope,
data,
status,
null,
{
hdr: 'Error!',
msg: 'Failed to get extra credentials. ' +
'Get returned status: ' +
status
});
}));
}
Rest.setUrl(GetBasePath('credential_types'));
credDefers.push(Rest.get()
.then(({data}) => {
scope.credentialTypeOptions = [];
data.results.forEach((credentialType => {
if(credentialType.kind.match(/^(machine|cloud|network|ssh)$/)) {
scope.credentialTypeOptions.push({
name: credentialType.name,
value: credentialType.id
});
}
}));
})
.catch(({data, status}) => {
ProcessErrors(
scope,
data,
status,
null,
{
hdr: 'Error!',
msg: 'Failed to get credential types. Get returned ' +
'status: ' +
status
});
}));
$q.all(credDefers)
.then(() => {
let machineCred = [];
let extraCreds = [];
if (scope.selectedCredentials && scope.selectedCredentials.machine) {
let mach = scope.selectedCredentials.machine;
mach.postType = "machine";
machineCred = [scope.selectedCredentials.machine];
}
if (scope.selectedCredentials && scope.selectedCredentials.extra) {
extraCreds = scope.selectedCredentials.extra;
}
extraCreds = extraCreds.map(function(cred) {
cred.postType = "extra";
return cred;
}); });
let credTags = machineCred.concat(extraCreds);
scope.credentialsToPost = credTags.map(cred => ({
name: cred.name,
id: cred.id,
postType: cred.postType,
kind: scope.credentialTypeOptions
.filter(type => parseInt(cred.credential_type) === type.value)[0].name + ":"
}));
scope.$emit('jobTemplateLoaded', master);
});
}) })
.error(function (data, status) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, { ProcessErrors(scope, data, status, form, {
@ -256,5 +157,5 @@ export default
CallbackHelpInit.$inject = CallbackHelpInit.$inject =
[ '$q', '$location', 'GetBasePath', 'Rest', 'JobTemplateForm', 'GenerateForm', [ '$q', '$location', 'GetBasePath', 'Rest', 'JobTemplateForm', 'GenerateForm',
'$stateParams', 'ProcessErrors', 'ParseVariableString', '$stateParams', 'ProcessErrors', 'ParseVariableString',
'Empty', 'Wait' 'Empty', 'Wait', 'MultiCredentialService'
]; ];

View File

@ -1,7 +1,9 @@
import multiCredential from './multi-credential.directive'; import multiCredential from './multi-credential.directive';
import multiCredentialModal from './multi-credential-modal.directive'; import multiCredentialModal from './multi-credential-modal.directive';
import multiCredentialService from './multi-credential.service';
export default export default
angular.module('multiCredential', []) angular.module('multiCredential', [])
.directive('multiCredential', multiCredential) .directive('multiCredential', multiCredential)
.directive('multiCredentialModal', multiCredentialModal); .directive('multiCredentialModal', multiCredentialModal)
.service('MultiCredentialService', multiCredentialService);

View File

@ -1,5 +1,5 @@
export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile', 'CreateSelect2', 'i18n', export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile', 'CreateSelect2', 'i18n', 'MultiCredentialService',
function(templateUrl, Rest, GetBasePath, GenerateList, $compile, CreateSelect2, i18n) { function(templateUrl, Rest, GetBasePath, GenerateList, $compile, CreateSelect2, i18n, MultiCredentialService) {
return { return {
restrict: 'E', restrict: 'E',
scope: { scope: {
@ -12,17 +12,6 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile'
link: function(scope, element) { link: function(scope, element) {
scope.credentialKind = "1"; scope.credentialKind = "1";
$('#multi-credential-modal').on('hidden.bs.modal', function () {
$('#multi-credential-modal').off('hidden.bs.modal');
$(element).remove();
});
CreateSelect2({
element: `#multi-credential-kind-select`,
multiple: false,
placeholder: i18n._('Select a credential')
});
scope.showModal = function() { scope.showModal = function() {
$('#multi-credential-modal').modal('show'); $('#multi-credential-modal').modal('show');
}; };
@ -42,23 +31,21 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile'
.append($compile(html)(scope)); .append($compile(html)(scope));
}; };
// Go out and get the credential types $('#multi-credential-modal').on('hidden.bs.modal', function () {
Rest.setUrl(GetBasePath('credential_types')); $('#multi-credential-modal').off('hidden.bs.modal');
Rest.get() $(element).remove();
.success(function (credentialTypeData) { });
let credential_types = {};
scope.credentialTypeOptions = []; CreateSelect2({
credentialTypeData.results.forEach((credentialType => { element: `#multi-credential-kind-select`,
credential_types[credentialType.id] = credentialType; multiple: false,
if(credentialType.kind placeholder: i18n._('Select a credential')
.match(/^(machine|cloud|net|ssh)$/)) { });
scope.credentialTypeOptions.push({
name: credentialType.name, MultiCredentialService.getCredentialTypes()
value: credentialType.id .then(({credential_types, credentialTypeOptions}) => {
});
}
}));
scope.credential_types = credential_types; scope.credential_types = credential_types;
scope.credentialTypeOptions = credentialTypeOptions;
scope.$emit('multiCredentialModalLinked'); scope.$emit('multiCredentialModalLinked');
}); });
}, },
@ -66,42 +53,6 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile'
controller: ['$scope', 'CredentialList', 'i18n', 'QuerySet', controller: ['$scope', 'CredentialList', 'i18n', 'QuerySet',
'GetBasePath', function($scope, CredentialList, i18n, qs, 'GetBasePath', function($scope, CredentialList, i18n, qs,
GetBasePath) { GetBasePath) {
let updateCredentialTags = function() {
let machineCred = [];
let extraCreds = [];
if ($scope.selectedCredentials &&
$scope.selectedCredentials.machine) {
let mach = $scope.selectedCredentials.machine;
mach.postType = "machine";
machineCred = [$scope.selectedCredentials.machine];
}
if ($scope.selectedCredentials &&
$scope.selectedCredentials.extra) {
extraCreds = $scope.selectedCredentials.extra;
}
extraCreds = extraCreds.map(function(cred) {
cred.postType = "extra";
return cred;
});
let credTags = machineCred.concat(extraCreds);
$scope.credTags = credTags.map(cred => ({
name: cred.name,
id: cred.id,
postType: cred.postType,
kind: $scope.credentialTypeOptions
.filter(type => {
return parseInt(cred.credential_type) === type.value;
})[0].name + ":"
}));
};
let updateExtraCredentialsList = function() { let updateExtraCredentialsList = function() {
let extraCredIds = $scope.selectedCredentials.extra let extraCredIds = $scope.selectedCredentials.extra
.map(cred => cred.id); .map(cred => cred.id);
@ -111,7 +62,10 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile'
.indexOf(cred.id) > - 1) ? 1 : 0; .indexOf(cred.id) > - 1) ? 1 : 0;
} }
}); });
updateCredentialTags();
$scope.credTags = MultiCredentialService
.updateCredentialTags($scope.selectedCredentials,
$scope.credentialTypeOptions);
}; };
let updateMachineCredentialList = function() { let updateMachineCredentialList = function() {
@ -123,14 +77,20 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile'
.machine.id) ? 1 : 0; .machine.id) ? 1 : 0;
} }
}); });
updateCredentialTags();
$scope.credTags = MultiCredentialService
.updateCredentialTags($scope.selectedCredentials,
$scope.credentialTypeOptions);
}; };
let uncheckAllCredentials = function() { let uncheckAllCredentials = function() {
$scope.credentials.forEach(cred => { $scope.credentials.forEach(cred => {
cred.checked = 0; cred.checked = 0;
}); });
updateCredentialTags();
$scope.credTags = MultiCredentialService
.updateCredentialTags($scope.selectedCredentials,
$scope.credentialTypeOptions);
}; };
let init = function() { let init = function() {
@ -180,7 +140,7 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile'
$scope.selectedCredentials.extra.length > 0 && $scope.selectedCredentials.extra.length > 0 &&
parseInt($scope.credentialKind) !== 1) { parseInt($scope.credentialKind) !== 1) {
updateExtraCredentialsList(); updateExtraCredentialsList();
} else { } else if (parseInt($scope.credentialKind) !== 1) {
uncheckAllCredentials(); uncheckAllCredentials();
} }
} }
@ -264,22 +224,10 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile'
}; };
$scope.removeCredential = function(credToRemove) { $scope.removeCredential = function(credToRemove) {
$scope.credTags [$scope.selectedCredentials,
.forEach(function(cred) { $scope.credTags] = MultiCredentialService
if (credToRemove === cred.id) { .removeCredential(credToRemove,
if (cred.postType === 'machine') { $scope.selectedCredentials, $scope.credTags);
$scope.selectedCredentials[cred.postType] = null;
} else {
$scope.selectedCredentials[cred.postType] = $scope
.selectedCredentials[cred.postType]
.filter(cred => cred
.id !== credToRemove);
}
}
});
$scope.credTags = $scope.credTags
.filter(cred => cred.id !== credToRemove);
if ($scope.credentials if ($scope.credentials
.filter(cred => cred.id === credToRemove).length) { .filter(cred => cred.id === credToRemove).length) {

View File

@ -16,8 +16,8 @@ export default ['templateUrl', '$compile',
}, },
restrict: 'E', restrict: 'E',
templateUrl: templateUrl('templates/job_templates/multi-credential/multi-credential'), templateUrl: templateUrl('templates/job_templates/multi-credential/multi-credential'),
controller: ['$scope', controller: ['$scope', 'MultiCredentialService',
function($scope) { function($scope, MultiCredentialService) {
if (!$scope.selectedCredentials) { if (!$scope.selectedCredentials) {
$scope.selectedCredentials = { $scope.selectedCredentials = {
machine: null, machine: null,
@ -43,23 +43,11 @@ export default ['templateUrl', '$compile',
}); });
$scope.removeCredential = function(credToRemove) { $scope.removeCredential = function(credToRemove) {
$scope.credentialsToPost = $scope.credentialsToPost [$scope.selectedCredentials,
.filter(function(cred) { $scope.credentialsToPost] = MultiCredentialService
if (cred.id === credToRemove) { .removeCredential(credToRemove, $scope.
if (cred.postType === 'machine') { selectedCredentials,
$scope.selectedCredentials.machine = null; $scope.credentialsToPost);
} else {
$scope.selectedCredentials
.extra = $scope.selectedCredentials
.extra
.filter(selectedCred => {
return selectedCred
.id !== credToRemove;
});
}
}
return cred.id !== credToRemove;
});
}; };
} }
], ],

View File

@ -0,0 +1,226 @@
export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, ProcessErrors, $q, GetBasePath) {
let val = {};
// given an array of creds, POST them to url and return an array
// of promises
val.saveExtraCredentials = ({creds, url, disassociate = false,
msg = "Failed to add extra credential. POST returned status:"}) => {
if (creds && creds[0] && typeof creds[0] !== 'number') {
creds = creds.map(cred => cred.id);
}
return creds.map((cred_id) => {
let payload = {'id': cred_id};
if (disassociate) {
payload.disassociate = true;
}
Rest.setUrl(url);
return Rest.post(payload)
.catch(({data, status}) => {
ProcessErrors(
null, data, status, null,
{
hdr: 'Error!',
msg: `${msg} ${status}`
});
});
});
};
// removes credentials no longer a part of the jt, and adds
// new ones
val.findChangedExtraCredentials = ({creds, url}) => {
Rest.setUrl(url);
Rest.get()
.then(({data}) => {
let existingCreds = data.results
.map(cred => cred.id);
let newCreds = creds
.map(cred => cred.id);
let [toAdd, toRemove] = _.partition(_.xor(existingCreds,
newCreds), cred => (newCreds.indexOf(cred) > -1));
let destroyResolve = [];
destroyResolve = val.saveExtraCredentials({
creds: toRemove,
url: url,
disassociate: true,
msg: `Failed to disassociate existing credential.
POST returned status:`
});
$q.all(destroyResolve).then(() => {
val.saveExtraCredentials({
creds: toAdd,
url: url
});
});
})
.catch(({data, status}) => {
ProcessErrors(null, data, status, null, {
hdr: 'Error!',
msg: 'Failed to get existing extra credentials. GET ' +
'returned status: ' + status
});
});
};
// calls credential types and returns the data needed to set up the
// credential type selector
val.getCredentialTypes = () => {
Rest.setUrl(GetBasePath('credential_types'));
return Rest.get()
.then(({data}) => {
let credential_types = {}, credentialTypeOptions = [];
data.results.forEach((credentialType => {
credential_types[credentialType.id] = credentialType;
if(credentialType.kind
.match(/^(machine|cloud|net|ssh)$/)) {
credentialTypeOptions.push({
name: credentialType.name,
value: credentialType.id
});
}
}));
return {
credential_types,
credentialTypeOptions
};
})
.catch(({data, status}) => {
ProcessErrors(null, data, status, null, {
hdr: 'Error!',
msg: 'Failed to get credential types. GET returned ' +
'status: ' + status
});
});
};
// converts structured selected credential data into array for tag-based
// view
val.updateCredentialTags = (creds, typeOpts) => {
let machineCred = [];
let extraCreds = [];
if (creds.machine) {
let mach = creds.machine;
mach.postType = "machine";
machineCred = [mach];
}
if (creds.extra) {
extraCreds = creds.extra
.map((cred) => {
cred.postType = "extra";
return cred;
});
}
return machineCred.concat(extraCreds).map(cred => ({
name: cred.name,
id: cred.id,
postType: cred.postType,
kind: typeOpts
.filter(type => {
return parseInt(cred.credential_type) === type.value;
})[0].name + ":"
}));
};
// remove credential from structured selected credential data and tag-view
// array
val.removeCredential = (credToRemove, structuredObj, tagArr) => {
tagArr.forEach((cred) => {
if (credToRemove === cred.id) {
if (cred.postType === 'machine') {
structuredObj[cred.postType] = null;
} else {
structuredObj[cred.postType] = structuredObj[cred.postType]
.filter(cred => cred
.id !== credToRemove);
}
}
});
tagArr = tagArr
.filter(cred => cred.id !== credToRemove);
return [structuredObj, tagArr];
};
// load all relevant credential data to populate job template edit form
val.loadCredentials = (data) => {
let selectedCredentials = {
machine: null,
extra: []
}, credTypes, credTypeOptions, credTags;
let credDefers = [];
// get machine credential
if (data.related.credential) {
Rest.setUrl(data.related.credential);
credDefers.push(Rest.get()
.then(({data}) => {
selectedCredentials.machine = data;
})
.catch(({data, status}) => {
ProcessErrors(
null, data, status, null,
{
hdr: 'Error!',
msg: 'Failed to get machine credential. ' +
'Get returned status: ' +
status
});
}));
}
// get extra credentials
if (data.related.extra_credentials) {
Rest.setUrl(data.related.extra_credentials);
credDefers.push(Rest.get()
.then(({data}) => {
selectedCredentials.extra = data.results;
})
.catch(({data, status}) => {
ProcessErrors(null, data, status, null,
{
hdr: 'Error!',
msg: 'Failed to get extra credentials. ' +
'Get returned status: ' +
status
});
}));
}
// get credential types
credDefers.push(val.getCredentialTypes()
.then(({credential_types, credentialTypeOptions}) => {
credTypes = credential_types;
credTypeOptions = credentialTypeOptions;
}));
return $q.all(credDefers).then(() => {
// get credential tags
credTags = val
.updateCredentialTags(selectedCredentials, credTypeOptions);
return [selectedCredentials, credTypes, credTypeOptions,
credTags];
});
};
return val;
}];

View File

@ -0,0 +1,342 @@
'use strict'
describe('MultiCredentialService', () => {
let MultiCredentialService;
beforeEach(angular.mock.module('multiCredential',
($provide) => {
['Rest', 'ProcessErrors', '$q', 'GetBasePath']
.forEach(item => $provide.value(item, {}));
}));
beforeEach(angular.mock.inject((_MultiCredentialService_) => {
MultiCredentialService = _MultiCredentialService_;
}));
describe('saveExtraCredentials', () => {
xit('should handle creds as array of objects and array of ids', () => {
expect(false).toBe(true);
});
xit('should post creds with add payload', () => {
expect(false).toBe(true);
});
xit('should post creds with disassociate payload', () => {
expect(false).toBe(true);
});
xit('should call ProcessErrors when post fails', () => {
expect(false).toBe(true);
});
});
describe('findChangedExtraCredentials', () => {
xit('should find which creds to add and post them', () => {
expect(false).toBe(true);
});
xit('should find which creds to remove and disassociate them', () => {
expect(false).toBe(true);
});
xit('should not post/disassociate non-changed creds', () => {
expect(false).toBe(true);
});
xit('should call ProcessErrors when any get/post fails', () => {
expect(false).toBe(true);
});
});
describe('getCredentialTypes', () => {
xit('should get cred types and return them directly, as well ' +
'as options for building credential type select box', () => {
expect(false).toBe(true);
});
xit('should call ProcessErrors when getting cred types fails', () => {
expect(false).toBe(true);
});
});
describe('updateCredentialTags', () => {
it('should return array of selected credentials (empty)', () => {
let creds = {
machine: null,
extra: []
};
let typeOpts = [];
let expected = [];
let actual = MultiCredentialService
.updateCredentialTags(creds, typeOpts);
let equal = _.isEqual(expected.sort(), actual.sort());
expect(equal).toBe(true);
});
it('should return array of selected credentials (populated)', () => {
let creds = {
machine: {
credential_type: 1,
id: 3,
name: 'ssh'
},
extra: [
{
credential_type: 2,
id: 4,
name: 'aws'
},
{
credential_type: 3,
id: 5,
name: 'gce'
}
]
};
let typeOpts = [
{
name: 'SSH',
value: 1
},
{
name: 'Amazon Web Services',
value: 2
},
{
name: 'Google Compute Engine',
value: 3
}
];
let expected = [
{
name: 'ssh',
id: 3,
postType: 'machine',
kind: 'SSH:'
},
{
name: 'aws',
id: 4,
postType: 'extra',
kind: 'Amazon Web Services:'
},
{
name: 'gce',
id: 5,
postType: 'extra',
kind: 'Google Compute Engine:'
}
];
let actual = MultiCredentialService
.updateCredentialTags(creds, typeOpts);
let equal = _.isEqual(expected.sort(), actual.sort());
expect(equal).toBe(true);
});
});
describe('removeCredential', () => {
it('should remove machine cred from structured obj and tag arr', () => {
let credToRemove = 3;
let structuredObj = {
machine: {
credential_type: 1,
id: 3,
name: 'ssh'
},
extra: [
{
credential_type: 2,
id: 4,
name: 'aws'
},
{
credential_type: 3,
id: 5,
name: 'gce'
}
]
};
let tagArr = [
{
name: 'ssh',
id: 3,
postType: 'machine',
kind: 'SSH:'
},
{
name: 'aws',
id: 4,
postType: 'extra',
kind: 'Amazon Web Services:'
},
{
name: 'gce',
id: 5,
postType: 'extra',
kind: 'Google Compute Engine:'
}
];
let expected = [
{
machine: null,
extra: [
{
credential_type: 2,
id: 4,
name: 'aws'
},
{
credential_type: 3,
id: 5,
name: 'gce'
}
]
},
[
{
name: 'aws',
id: 4,
postType: 'extra',
kind: 'Amazon Web Services:'
},
{
name: 'gce',
id: 5,
postType: 'extra',
kind: 'Google Compute Engine:'
}
]
];
let actual = MultiCredentialService
.removeCredential(credToRemove, structuredObj, tagArr);
let equal = _.isEqual(expected.sort(), actual.sort());
expect(equal).toBe(true);
});
it('should remove extra cred from structured obj and tag arr', () => {
let credToRemove = 4;
let structuredObj = {
machine: {
credential_type: 1,
id: 3,
name: 'ssh'
},
extra: [
{
credential_type: 2,
id: 4,
name: 'aws'
},
{
credential_type: 3,
id: 5,
name: 'gce'
}
]
};
let tagArr = [
{
name: 'ssh',
id: 3,
postType: 'machine',
kind: 'SSH:'
},
{
name: 'aws',
id: 4,
postType: 'extra',
kind: 'Amazon Web Services:'
},
{
name: 'gce',
id: 5,
postType: 'extra',
kind: 'Google Compute Engine:'
}
];
let expected = [
{
machine: {
credential_type: 1,
id: 3,
name: 'ssh'
},
extra: [
{
credential_type: 3,
id: 5,
name: 'gce'
}
]
},
[
{
name: 'ssh',
id: 3,
postType: 'machine',
kind: 'SSH:'
},
{
name: 'gce',
id: 5,
postType: 'extra',
kind: 'Google Compute Engine:'
}
]
];
let actual = MultiCredentialService
.removeCredential(credToRemove, structuredObj, tagArr);
let equal = _.isEqual(expected.sort(), actual.sort());
expect(equal).toBe(true);
});
});
describe('loadCredentials', () => {
xit('should call to get machine credential data', () => {
expect(false).toBe(true);
});
xit('should call ProcessErrors if machine cred get fails', () => {
expect(false).toBe(true);
});
xit('should call to get extra credentials data', () => {
expect(false).toBe(true);
});
xit('should call ProcessErrors if extra creds get fails', () => {
expect(false).toBe(true);
});
xit('should call to get credential types', () => {
expect(false).toBe(true);
});
xit('should call to update cred tags once GETs have completed', () => {
expect(false).toBe(true);
});
});
});