github.com/blixtra/nomad@v0.7.2-0.20171221000451-da9a1d7bb050/ui/tests/acceptance/token-test.js (about) 1 import { find, findAll, fillIn, click, visit } from 'ember-native-dom-helpers'; 2 import Ember from 'ember'; 3 import { test, skip } from 'ember-qunit'; 4 import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; 5 6 const { $ } = Ember; 7 8 let job; 9 let node; 10 let managementToken; 11 let clientToken; 12 13 moduleForAcceptance('Acceptance | tokens', { 14 beforeEach() { 15 server.create('agent'); 16 node = server.create('node'); 17 job = server.create('job'); 18 managementToken = server.create('token'); 19 clientToken = server.create('token'); 20 }, 21 }); 22 23 test('the token form sets the token in session storage', function(assert) { 24 const { secretId } = managementToken; 25 26 visit('/settings/tokens'); 27 28 andThen(() => { 29 assert.ok(window.sessionStorage.nomadTokenSecret == null, 'No token secret set'); 30 31 fillIn('.token-secret', secretId); 32 click('.token-submit'); 33 34 andThen(() => { 35 assert.equal(window.sessionStorage.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 visit(`/jobs/${job.id}`); 46 visit(`/clients/${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 visit('/settings/tokens'); 59 andThen(() => { 60 fillIn('.token-secret', secretId); 61 click('.token-submit'); 62 }); 63 64 visit(`/jobs/${job.id}`); 65 visit(`/clients/${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 visit('/settings/tokens'); 88 89 andThen(() => { 90 fillIn('.token-secret', bogusSecret); 91 click('.token-submit'); 92 93 andThen(() => { 94 assert.ok( 95 window.sessionStorage.nomadTokenSecret == null, 96 'Token secret is discarded on failure' 97 ); 98 assert.ok(find('.token-error'), 'Token error message is shown'); 99 assert.notOk(find('.token-success'), 'Token success message is not shown'); 100 assert.notOk(find('.token-policy'), 'No token policies are shown'); 101 }); 102 }); 103 }); 104 105 test('a success message and a special management token message are shown when authenticating succeeds', function( 106 assert 107 ) { 108 const { secretId } = managementToken; 109 110 visit('/settings/tokens'); 111 112 andThen(() => { 113 fillIn('.token-secret', secretId); 114 click('.token-submit'); 115 116 andThen(() => { 117 assert.ok(find('.token-success'), 'Token success message is shown'); 118 assert.notOk(find('.token-error'), 'Token error message is not shown'); 119 assert.ok(find('.token-management-message'), 'Token management message is shown'); 120 assert.notOk(find('.token-policy'), 'No token policies are shown'); 121 }); 122 }); 123 }); 124 125 test('a success message and associated policies are shown when authenticating succeeds', function( 126 assert 127 ) { 128 const { secretId } = clientToken; 129 const policy = clientToken.policies.models[0]; 130 policy.update('description', 'Make sure there is a description'); 131 132 visit('/settings/tokens'); 133 134 andThen(() => { 135 fillIn('.token-secret', secretId); 136 click('.token-submit'); 137 138 andThen(() => { 139 assert.ok(find('.token-success'), 'Token success message is shown'); 140 assert.notOk(find('.token-error'), 'Token error message is not shown'); 141 assert.notOk(find('.token-management-message'), 'Token management message is not shown'); 142 assert.equal( 143 findAll('.token-policy').length, 144 clientToken.policies.length, 145 'Each policy associated with the token is listed' 146 ); 147 148 const policyElement = $(find('.token-policy')); 149 150 assert.equal( 151 policyElement 152 .find('.boxed-section-head') 153 .text() 154 .trim(), 155 policy.name, 156 'Policy Name' 157 ); 158 assert.equal( 159 policyElement 160 .find('.boxed-section-body p.content') 161 .text() 162 .trim(), 163 policy.description, 164 'Policy Description' 165 ); 166 assert.equal( 167 policyElement.find('.boxed-section-body pre code').text(), 168 policy.rules, 169 'Policy Rules' 170 ); 171 }); 172 }); 173 }); 174 175 test('setting a token clears the store', function(assert) { 176 const { secretId } = clientToken; 177 178 visit('/jobs'); 179 180 andThen(() => { 181 assert.ok(find('.job-row'), 'Jobs found'); 182 }); 183 184 visit('/settings/tokens'); 185 186 andThen(() => { 187 fillIn('.token-secret', secretId); 188 click('.token-submit'); 189 }); 190 191 // Don't return jobs from the API the second time around 192 andThen(() => { 193 server.pretender.get('/v1/jobs', function() { 194 return [200, {}, '[]']; 195 }); 196 }); 197 198 visit('/jobs'); 199 200 // If jobs are lingering in the store, they would show up 201 assert.notOk(find('.job-row'), 'No jobs found'); 202 }); 203 204 function getHeader({ requestHeaders }, name) { 205 // Headers are case-insensitive, but object property look up is not 206 return ( 207 requestHeaders[name] || requestHeaders[name.toLowerCase()] || requestHeaders[name.toUpperCase()] 208 ); 209 }