github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/ui/tests/acceptance/token-test.js (about) 1 import { find } from 'ember-native-dom-helpers'; 2 import { test, skip } from 'ember-qunit'; 3 import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; 4 import Tokens from 'nomad-ui/tests/pages/settings/tokens'; 5 import Jobs from 'nomad-ui/tests/pages/jobs/list'; 6 import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; 7 import ClientDetail from 'nomad-ui/tests/pages/clients/detail'; 8 9 let job; 10 let node; 11 let managementToken; 12 let clientToken; 13 14 moduleForAcceptance('Acceptance | tokens', { 15 beforeEach() { 16 server.create('agent'); 17 node = server.create('node'); 18 job = server.create('job'); 19 managementToken = server.create('token'); 20 clientToken = server.create('token'); 21 }, 22 }); 23 24 test('the token form sets the token in local storage', function(assert) { 25 const { secretId } = managementToken; 26 27 Tokens.visit(); 28 29 andThen(() => { 30 assert.ok(window.localStorage.nomadTokenSecret == null, 'No token secret set'); 31 32 Tokens.secret(secretId).submit(); 33 34 andThen(() => { 35 assert.equal(window.localStorage.nomadTokenSecret, secretId, 'Token secret was set'); 36 }); 37 }); 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', function(assert) { 42 const { secretId } = managementToken; 43 let requestPosition = 0; 44 45 JobDetail.visit({ id: job.id }); 46 ClientDetail.visit({ id: node.id }); 47 48 andThen(() => { 49 assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); 50 51 server.pretender.handledRequests.forEach(req => { 52 assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`); 53 }); 54 55 requestPosition = server.pretender.handledRequests.length; 56 }); 57 58 Tokens.visit(); 59 60 andThen(() => { 61 Tokens.secret(secretId).submit(); 62 }); 63 64 JobDetail.visit({ id: job.id }); 65 ClientDetail.visit({ id: node.id }); 66 67 andThen(() => { 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 78 test('an error message is shown when authenticating a token fails', function(assert) { 79 const { secretId } = managementToken; 80 const bogusSecret = 'this-is-not-the-secret'; 81 assert.notEqual( 82 secretId, 83 bogusSecret, 84 'bogus secret is not somehow coincidentally equal to the real secret' 85 ); 86 87 Tokens.visit(); 88 89 andThen(() => { 90 Tokens.secret(bogusSecret).submit(); 91 92 andThen(() => { 93 assert.ok( 94 window.localStorage.nomadTokenSecret == null, 95 'Token secret is discarded on failure' 96 ); 97 assert.ok(Tokens.errorMessage, 'Token error message is shown'); 98 assert.notOk(Tokens.successMessage, 'Token success message is not shown'); 99 assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); 100 }); 101 }); 102 }); 103 104 test('a success message and a special management token message are shown when authenticating succeeds', function(assert) { 105 const { secretId } = managementToken; 106 107 Tokens.visit(); 108 109 andThen(() => { 110 Tokens.secret(secretId).submit(); 111 112 andThen(() => { 113 assert.ok(Tokens.successMessage, 'Token success message is shown'); 114 assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); 115 assert.ok(Tokens.managementMessage, 'Token management message is shown'); 116 assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); 117 }); 118 }); 119 }); 120 121 test('a success message and associated policies are shown when authenticating succeeds', function(assert) { 122 const { secretId } = clientToken; 123 const policy = clientToken.policies.models[0]; 124 policy.update('description', 'Make sure there is a description'); 125 126 Tokens.visit(); 127 128 andThen(() => { 129 Tokens.secret(secretId).submit(); 130 131 andThen(() => { 132 assert.ok(Tokens.successMessage, 'Token success message is shown'); 133 assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); 134 assert.notOk(Tokens.managementMessage, 'Token management message is not shown'); 135 assert.equal( 136 Tokens.policies.length, 137 clientToken.policies.length, 138 'Each policy associated with the token is listed' 139 ); 140 141 const policyElement = Tokens.policies.objectAt(0); 142 143 assert.equal(policyElement.name, policy.name, 'Policy Name'); 144 assert.equal(policyElement.description, policy.description, 'Policy Description'); 145 assert.equal(policyElement.rules, policy.rules, 'Policy Rules'); 146 }); 147 }); 148 }); 149 150 test('setting a token clears the store', function(assert) { 151 const { secretId } = clientToken; 152 153 Jobs.visit(); 154 155 andThen(() => { 156 assert.ok(find('.job-row'), 'Jobs found'); 157 }); 158 159 Tokens.visit(); 160 161 andThen(() => { 162 Tokens.secret(secretId).submit(); 163 }); 164 165 // Don't return jobs from the API the second time around 166 andThen(() => { 167 server.pretender.get('/v1/jobs', function() { 168 return [200, {}, '[]']; 169 }); 170 }); 171 172 Jobs.visit(); 173 174 // If jobs are lingering in the store, they would show up 175 assert.notOk(find('[data-test-job-row]'), 'No jobs found'); 176 }); 177 178 function getHeader({ requestHeaders }, name) { 179 // Headers are case-insensitive, but object property look up is not 180 return ( 181 requestHeaders[name] || requestHeaders[name.toLowerCase()] || requestHeaders[name.toUpperCase()] 182 ); 183 }