github.com/ferranbt/nomad@v0.9.3-0.20190607002617-85c449b7667c/ui/tests/acceptance/token-test.js (about) 1 import { find } from 'ember-native-dom-helpers'; 2 import { module, skip, test } from 'qunit'; 3 import { setupApplicationTest } from 'ember-qunit'; 4 import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; 5 import Tokens from 'nomad-ui/tests/pages/settings/tokens'; 6 import Jobs from 'nomad-ui/tests/pages/jobs/list'; 7 import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; 8 import ClientDetail from 'nomad-ui/tests/pages/clients/detail'; 9 10 let job; 11 let node; 12 let managementToken; 13 let clientToken; 14 15 module('Acceptance | tokens', function(hooks) { 16 setupApplicationTest(hooks); 17 setupMirage(hooks); 18 19 hooks.beforeEach(function() { 20 localStorage.clear(); 21 sessionStorage.clear(); 22 23 server.create('agent'); 24 node = server.create('node'); 25 job = server.create('job'); 26 managementToken = server.create('token'); 27 clientToken = server.create('token'); 28 }); 29 30 test('the token form sets the token in local storage', async function(assert) { 31 const { secretId } = managementToken; 32 33 await Tokens.visit(); 34 assert.ok(window.localStorage.nomadTokenSecret == null, 'No token secret set'); 35 36 await Tokens.secret(secretId).submit(); 37 assert.equal(window.localStorage.nomadTokenSecret, secretId, 'Token secret was set'); 38 }); 39 40 // TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle 41 skip('the X-Nomad-Token header gets sent with requests once it is set', async function(assert) { 42 const { secretId } = managementToken; 43 44 await JobDetail.visit({ id: job.id }); 45 await ClientDetail.visit({ id: node.id }); 46 47 assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); 48 49 server.pretender.handledRequests.forEach(req => { 50 assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`); 51 }); 52 53 const requestPosition = server.pretender.handledRequests.length; 54 55 await Tokens.visit(); 56 await Tokens.secret(secretId).submit(); 57 58 await JobDetail.visit({ id: job.id }); 59 await ClientDetail.visit({ id: node.id }); 60 61 const newRequests = server.pretender.handledRequests.slice(requestPosition); 62 assert.ok(newRequests.length > 1, 'New requests have been made'); 63 64 // Cross-origin requests can't have a token 65 newRequests.forEach(req => { 66 assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`); 67 }); 68 }); 69 70 test('an error message is shown when authenticating a token fails', async function(assert) { 71 const { secretId } = managementToken; 72 const bogusSecret = 'this-is-not-the-secret'; 73 assert.notEqual( 74 secretId, 75 bogusSecret, 76 'bogus secret is not somehow coincidentally equal to the real secret' 77 ); 78 79 await Tokens.visit(); 80 await Tokens.secret(bogusSecret).submit(); 81 82 assert.ok(window.localStorage.nomadTokenSecret == null, 'Token secret is discarded on failure'); 83 assert.ok(Tokens.errorMessage, 'Token error message is shown'); 84 assert.notOk(Tokens.successMessage, 'Token success message is not shown'); 85 assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); 86 }); 87 88 test('a success message and a special management token message are shown when authenticating succeeds', async function(assert) { 89 const { secretId } = managementToken; 90 91 await Tokens.visit(); 92 await Tokens.secret(secretId).submit(); 93 94 assert.ok(Tokens.successMessage, 'Token success message is shown'); 95 assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); 96 assert.ok(Tokens.managementMessage, 'Token management message is shown'); 97 assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); 98 }); 99 100 test('a success message and associated policies are shown when authenticating succeeds', async function(assert) { 101 const { secretId } = clientToken; 102 const policy = clientToken.policies.models[0]; 103 policy.update('description', 'Make sure there is a description'); 104 105 await Tokens.visit(); 106 await Tokens.secret(secretId).submit(); 107 108 assert.ok(Tokens.successMessage, 'Token success message is shown'); 109 assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); 110 assert.notOk(Tokens.managementMessage, 'Token management message is not shown'); 111 assert.equal( 112 Tokens.policies.length, 113 clientToken.policies.length, 114 'Each policy associated with the token is listed' 115 ); 116 117 const policyElement = Tokens.policies.objectAt(0); 118 119 assert.equal(policyElement.name, policy.name, 'Policy Name'); 120 assert.equal(policyElement.description, policy.description, 'Policy Description'); 121 assert.equal(policyElement.rules, policy.rules, 'Policy Rules'); 122 }); 123 124 test('setting a token clears the store', async function(assert) { 125 const { secretId } = clientToken; 126 127 await Jobs.visit(); 128 assert.ok(find('.job-row'), 'Jobs found'); 129 130 await Tokens.visit(); 131 await Tokens.secret(secretId).submit(); 132 133 server.pretender.get('/v1/jobs', function() { 134 return [200, {}, '[]']; 135 }); 136 137 await Jobs.visit(); 138 139 // If jobs are lingering in the store, they would show up 140 assert.notOk(find('[data-test-job-row]'), 'No jobs found'); 141 }); 142 143 function getHeader({ requestHeaders }, name) { 144 // Headers are case-insensitive, but object property look up is not 145 return ( 146 requestHeaders[name] || 147 requestHeaders[name.toLowerCase()] || 148 requestHeaders[name.toUpperCase()] 149 ); 150 } 151 });