github.com/hspak/nomad@v0.7.2-0.20180309000617-bc4ae22a39a5/ui/tests/unit/adapters/job-test.js (about) 1 import { run } from '@ember/runloop'; 2 import { assign } from '@ember/polyfills'; 3 import { test } from 'ember-qunit'; 4 import wait from 'ember-test-helpers/wait'; 5 import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; 6 import moduleForAdapter from '../../helpers/module-for-adapter'; 7 8 moduleForAdapter('job', 'Unit | Adapter | Job', { 9 needs: [ 10 'adapter:job', 11 'service:token', 12 'service:system', 13 'model:namespace', 14 'model:job-summary', 15 'adapter:application', 16 'service:watchList', 17 ], 18 beforeEach() { 19 window.sessionStorage.clear(); 20 21 this.server = startMirage(); 22 this.server.create('node'); 23 this.server.create('job', { id: 'job-1' }); 24 this.server.create('job', { id: 'job-2', namespaceId: 'some-namespace' }); 25 }, 26 afterEach() { 27 this.server.shutdown(); 28 }, 29 }); 30 31 test('The job summary is stitched into the job request', function(assert) { 32 const { pretender } = this.server; 33 const jobName = 'job-1'; 34 const jobNamespace = 'default'; 35 const jobId = JSON.stringify([jobName, jobNamespace]); 36 37 this.subject().findRecord(null, { modelName: 'job' }, jobId); 38 39 assert.deepEqual( 40 pretender.handledRequests.mapBy('url'), 41 ['/v1/namespaces', `/v1/job/${jobName}`], 42 'The two requests made are /namespaces and /job/:id' 43 ); 44 }); 45 46 test('When the job has a namespace other than default, it is in the URL', function(assert) { 47 const { pretender } = this.server; 48 const jobName = 'job-2'; 49 const jobNamespace = 'some-namespace'; 50 const jobId = JSON.stringify([jobName, jobNamespace]); 51 52 this.subject().findRecord(null, { modelName: 'job' }, jobId); 53 54 assert.deepEqual( 55 pretender.handledRequests.mapBy('url'), 56 ['/v1/namespaces', `/v1/job/${jobName}?namespace=${jobNamespace}`], 57 'The two requests made are /namespaces and /job/:id?namespace=:namespace' 58 ); 59 }); 60 61 test('When there is no token set in the token service, no x-nomad-token header is set', function(assert) { 62 const { pretender } = this.server; 63 const jobId = JSON.stringify(['job-1', 'default']); 64 65 this.subject().findRecord(null, { modelName: 'job' }, jobId); 66 67 assert.notOk( 68 pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']), 69 'No token header present on either job request' 70 ); 71 }); 72 73 test('When a token is set in the token service, then x-nomad-token header is set', function(assert) { 74 const { pretender } = this.server; 75 const jobId = JSON.stringify(['job-1', 'default']); 76 const secret = 'here is the secret'; 77 78 this.subject().set('token.secret', secret); 79 this.subject().findRecord(null, { modelName: 'job' }, jobId); 80 81 assert.ok( 82 pretender.handledRequests 83 .mapBy('requestHeaders') 84 .every(headers => headers['X-Nomad-Token'] === secret), 85 'The token header is present on both job requests' 86 ); 87 }); 88 89 test('findAll can be watched', function(assert) { 90 const { pretender } = this.server; 91 92 const request = () => 93 this.subject().findAll(null, { modelName: 'job' }, null, { 94 reload: true, 95 adapterOptions: { watch: true }, 96 }); 97 98 request(); 99 assert.equal( 100 pretender.handledRequests[0].url, 101 '/v1/namespaces', 102 'First request is for namespaces' 103 ); 104 assert.equal( 105 pretender.handledRequests[1].url, 106 '/v1/jobs?index=0', 107 'Second request is a blocking request for jobs' 108 ); 109 110 return wait().then(() => { 111 request(); 112 assert.equal( 113 pretender.handledRequests[2].url, 114 '/v1/jobs?index=1', 115 'Third request is a blocking request with an incremented index param' 116 ); 117 118 return wait(); 119 }); 120 }); 121 122 test('findRecord can be watched', function(assert) { 123 const jobId = JSON.stringify(['job-1', 'default']); 124 const { pretender } = this.server; 125 126 const request = () => 127 this.subject().findRecord(null, { modelName: 'job' }, jobId, { 128 reload: true, 129 adapterOptions: { watch: true }, 130 }); 131 132 request(); 133 assert.equal( 134 pretender.handledRequests[0].url, 135 '/v1/namespaces', 136 'First request is for namespaces' 137 ); 138 assert.equal( 139 pretender.handledRequests[1].url, 140 '/v1/job/job-1?index=0', 141 'Second request is a blocking request for job-1' 142 ); 143 144 return wait().then(() => { 145 request(); 146 assert.equal( 147 pretender.handledRequests[2].url, 148 '/v1/job/job-1?index=1', 149 'Third request is a blocking request with an incremented index param' 150 ); 151 152 return wait(); 153 }); 154 }); 155 156 test('relationships can be reloaded', function(assert) { 157 const { pretender } = this.server; 158 const plainId = 'job-1'; 159 const mockModel = makeMockModel(plainId); 160 161 this.subject().reloadRelationship(mockModel, 'summary'); 162 assert.equal( 163 pretender.handledRequests[0].url, 164 `/v1/job/${plainId}/summary`, 165 'Relationship was reloaded' 166 ); 167 }); 168 169 test('relationship reloads can be watched', function(assert) { 170 const { pretender } = this.server; 171 const plainId = 'job-1'; 172 const mockModel = makeMockModel(plainId); 173 174 this.subject().reloadRelationship(mockModel, 'summary', true); 175 assert.equal( 176 pretender.handledRequests[0].url, 177 '/v1/job/job-1/summary?index=0', 178 'First request is a blocking request for job-1 summary relationship' 179 ); 180 181 return wait().then(() => { 182 this.subject().reloadRelationship(mockModel, 'summary', true); 183 assert.equal( 184 pretender.handledRequests[1].url, 185 '/v1/job/job-1/summary?index=1', 186 'Second request is a blocking request with an incremented index param' 187 ); 188 }); 189 }); 190 191 test('findAll can be canceled', function(assert) { 192 const { pretender } = this.server; 193 pretender.get('/v1/jobs', () => [200, {}, '[]'], true); 194 195 this.subject() 196 .findAll(null, { modelName: 'job' }, null, { 197 reload: true, 198 adapterOptions: { watch: true }, 199 }) 200 .catch(() => {}); 201 202 const { request: xhr } = pretender.requestReferences[0]; 203 assert.equal(xhr.status, 0, 'Request is still pending'); 204 205 // Schedule the cancelation before waiting 206 run.next(() => { 207 this.subject().cancelFindAll('job'); 208 }); 209 210 return wait().then(() => { 211 assert.ok(xhr.aborted, 'Request was aborted'); 212 }); 213 }); 214 215 test('findRecord can be canceled', function(assert) { 216 const { pretender } = this.server; 217 const jobId = JSON.stringify(['job-1', 'default']); 218 219 pretender.get('/v1/job/:id', () => [200, {}, '{}'], true); 220 221 this.subject().findRecord(null, { modelName: 'job' }, jobId, { 222 reload: true, 223 adapterOptions: { watch: true }, 224 }); 225 226 const { request: xhr } = pretender.requestReferences[0]; 227 assert.equal(xhr.status, 0, 'Request is still pending'); 228 229 // Schedule the cancelation before waiting 230 run.next(() => { 231 this.subject().cancelFindRecord('job', jobId); 232 }); 233 234 return wait().then(() => { 235 assert.ok(xhr.aborted, 'Request was aborted'); 236 }); 237 }); 238 239 test('relationship reloads can be canceled', function(assert) { 240 const { pretender } = this.server; 241 const plainId = 'job-1'; 242 const mockModel = makeMockModel(plainId); 243 pretender.get('/v1/job/:id/summary', () => [200, {}, '{}'], true); 244 245 this.subject().reloadRelationship(mockModel, 'summary', true); 246 247 const { request: xhr } = pretender.requestReferences[0]; 248 assert.equal(xhr.status, 0, 'Request is still pending'); 249 250 // Schedule the cancelation before waiting 251 run.next(() => { 252 this.subject().cancelReloadRelationship(mockModel, 'summary'); 253 }); 254 255 return wait().then(() => { 256 assert.ok(xhr.aborted, 'Request was aborted'); 257 }); 258 }); 259 260 function makeMockModel(id, options) { 261 return assign( 262 { 263 relationshipFor(name) { 264 return { 265 kind: 'belongsTo', 266 type: 'job-summary', 267 key: name, 268 }; 269 }, 270 belongsTo(name) { 271 return { 272 link() { 273 return `/v1/job/${id}/${name}`; 274 }, 275 }; 276 }, 277 }, 278 options 279 ); 280 }