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