github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/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 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 window.localStorage.clear(); 21 window.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 assert.equal(document.title, 'Tokens - Nomad'); 36 37 await Tokens.secret(secretId).submit(); 38 assert.equal(window.localStorage.nomadTokenSecret, secretId, 'Token secret was set'); 39 }); 40 41 // TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle 42 skip('the X-Nomad-Token header gets sent with requests once it is set', async function(assert) { 43 const { secretId } = managementToken; 44 45 await JobDetail.visit({ id: job.id }); 46 await ClientDetail.visit({ id: node.id }); 47 48 assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); 49 50 server.pretender.handledRequests.forEach(req => { 51 assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`); 52 }); 53 54 const requestPosition = server.pretender.handledRequests.length; 55 56 await Tokens.visit(); 57 await Tokens.secret(secretId).submit(); 58 59 await JobDetail.visit({ id: job.id }); 60 await ClientDetail.visit({ id: node.id }); 61 62 const newRequests = server.pretender.handledRequests.slice(requestPosition); 63 assert.ok(newRequests.length > 1, 'New requests have been made'); 64 65 // Cross-origin requests can't have a token 66 newRequests.forEach(req => { 67 assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`); 68 }); 69 }); 70 71 test('an error message is shown when authenticating a token fails', async function(assert) { 72 const { secretId } = managementToken; 73 const bogusSecret = 'this-is-not-the-secret'; 74 assert.notEqual( 75 secretId, 76 bogusSecret, 77 'bogus secret is not somehow coincidentally equal to the real secret' 78 ); 79 80 await Tokens.visit(); 81 await Tokens.secret(bogusSecret).submit(); 82 83 assert.ok(window.localStorage.nomadTokenSecret == null, 'Token secret is discarded on failure'); 84 assert.ok(Tokens.errorMessage, 'Token error message is shown'); 85 assert.notOk(Tokens.successMessage, 'Token success message is not shown'); 86 assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); 87 }); 88 89 test('a success message and a special management token message are shown when authenticating succeeds', async function(assert) { 90 const { secretId } = managementToken; 91 92 await Tokens.visit(); 93 await Tokens.secret(secretId).submit(); 94 95 assert.ok(Tokens.successMessage, 'Token success message is shown'); 96 assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); 97 assert.ok(Tokens.managementMessage, 'Token management message is shown'); 98 assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); 99 }); 100 101 test('a success message and associated policies are shown when authenticating succeeds', async function(assert) { 102 const { secretId } = clientToken; 103 const policy = clientToken.policies.models[0]; 104 policy.update('description', 'Make sure there is a description'); 105 106 await Tokens.visit(); 107 await Tokens.secret(secretId).submit(); 108 109 assert.ok(Tokens.successMessage, 'Token success message is shown'); 110 assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); 111 assert.notOk(Tokens.managementMessage, 'Token management message is not shown'); 112 assert.equal( 113 Tokens.policies.length, 114 clientToken.policies.length, 115 'Each policy associated with the token is listed' 116 ); 117 118 const policyElement = Tokens.policies.objectAt(0); 119 120 assert.equal(policyElement.name, policy.name, 'Policy Name'); 121 assert.equal(policyElement.description, policy.description, 'Policy Description'); 122 assert.equal(policyElement.rules, policy.rules, 'Policy Rules'); 123 }); 124 125 test('setting a token clears the store', async function(assert) { 126 const { secretId } = clientToken; 127 128 await Jobs.visit(); 129 assert.ok(find('.job-row'), 'Jobs found'); 130 131 await Tokens.visit(); 132 await Tokens.secret(secretId).submit(); 133 134 server.pretender.get('/v1/jobs', function() { 135 return [200, {}, '[]']; 136 }); 137 138 await Jobs.visit(); 139 140 // If jobs are lingering in the store, they would show up 141 assert.notOk(find('[data-test-job-row]'), 'No jobs found'); 142 }); 143 144 function getHeader({ requestHeaders }, name) { 145 // Headers are case-insensitive, but object property look up is not 146 return ( 147 requestHeaders[name] || 148 requestHeaders[name.toLowerCase()] || 149 requestHeaders[name.toUpperCase()] 150 ); 151 } 152 });