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