github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/ui/tests/unit/adapters/volume-test.js (about) 1 import { run } from '@ember/runloop'; 2 import { settled } from '@ember/test-helpers'; 3 import { setupTest } from 'ember-qunit'; 4 import { module, test } from 'qunit'; 5 import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; 6 import XHRToken from 'nomad-ui/utils/classes/xhr-token'; 7 8 module('Unit | Adapter | Volume', function(hooks) { 9 setupTest(hooks); 10 11 hooks.beforeEach(async function() { 12 this.store = this.owner.lookup('service:store'); 13 this.subject = () => this.store.adapterFor('volume'); 14 15 window.sessionStorage.clear(); 16 window.localStorage.clear(); 17 18 this.server = startMirage(); 19 20 this.initializeUI = async () => { 21 this.server.create('namespace'); 22 this.server.create('namespace', { id: 'some-namespace' }); 23 this.server.create('node'); 24 this.server.create('job', { id: 'job-1', namespaceId: 'default' }); 25 this.server.create('csi-plugin', 2); 26 this.server.create('csi-volume', { id: 'volume-1', namespaceId: 'some-namespace' }); 27 28 this.server.create('region', { id: 'region-1' }); 29 this.server.create('region', { id: 'region-2' }); 30 31 this.system = this.owner.lookup('service:system'); 32 33 // Namespace, default region, and all regions are requests that all 34 // job requests depend on. Fetching them ahead of time means testing 35 // job adapter behavior in isolation. 36 await this.system.get('namespaces'); 37 this.system.get('shouldIncludeRegion'); 38 await this.system.get('defaultRegion'); 39 40 // Reset the handledRequests array to avoid accounting for this 41 // namespaces request everywhere. 42 this.server.pretender.handledRequests.length = 0; 43 }; 44 }); 45 46 hooks.afterEach(function() { 47 this.server.shutdown(); 48 }); 49 50 test('The volume endpoint can be queried by type', async function(assert) { 51 const { pretender } = this.server; 52 53 await this.initializeUI(); 54 55 this.subject().query(this.store, { modelName: 'volume' }, { type: 'csi' }, null, {}); 56 await settled(); 57 58 assert.deepEqual(pretender.handledRequests.mapBy('url'), ['/v1/volumes?type=csi']); 59 }); 60 61 test('When a namespace is set in localStorage and the volume endpoint is queried, the namespace is in the query string', async function(assert) { 62 const { pretender } = this.server; 63 64 window.localStorage.nomadActiveNamespace = 'some-namespace'; 65 await this.initializeUI(); 66 67 this.subject().query(this.store, { modelName: 'volume' }, { type: 'csi' }, null, {}); 68 await settled(); 69 70 assert.deepEqual(pretender.handledRequests.mapBy('url'), [ 71 '/v1/volumes?namespace=some-namespace&type=csi', 72 ]); 73 }); 74 75 test('When the volume has a namespace other than default, it is in the URL', async function(assert) { 76 const { pretender } = this.server; 77 const volumeName = 'csi/volume-1'; 78 const volumeNamespace = 'some-namespace'; 79 const volumeId = JSON.stringify([volumeName, volumeNamespace]); 80 81 await this.initializeUI(); 82 83 this.subject().findRecord(this.store, { modelName: 'volume' }, volumeId); 84 await settled(); 85 86 assert.deepEqual(pretender.handledRequests.mapBy('url'), [ 87 `/v1/volume/${encodeURIComponent(volumeName)}?namespace=${volumeNamespace}`, 88 ]); 89 }); 90 91 test('query can be watched', async function(assert) { 92 await this.initializeUI(); 93 94 const { pretender } = this.server; 95 96 const request = () => 97 this.subject().query(this.store, { modelName: 'volume' }, { type: 'csi' }, null, { 98 reload: true, 99 adapterOptions: { watch: true }, 100 }); 101 102 request(); 103 assert.equal(pretender.handledRequests[0].url, '/v1/volumes?type=csi&index=1'); 104 105 await settled(); 106 request(); 107 assert.equal(pretender.handledRequests[1].url, '/v1/volumes?type=csi&index=2'); 108 109 await settled(); 110 }); 111 112 test('query can be canceled', async function(assert) { 113 await this.initializeUI(); 114 115 const { pretender } = this.server; 116 const token = new XHRToken(); 117 118 pretender.get('/v1/volumes', () => [200, {}, '[]'], true); 119 120 this.subject() 121 .query(this.store, { modelName: 'volume' }, { type: 'csi' }, null, { 122 reload: true, 123 adapterOptions: { watch: true, abortToken: token }, 124 }) 125 .catch(() => {}); 126 127 const { request: xhr } = pretender.requestReferences[0]; 128 assert.equal(xhr.status, 0, 'Request is still pending'); 129 130 // Schedule the cancelation before waiting 131 run.next(() => { 132 token.abort(); 133 }); 134 135 await settled(); 136 assert.ok(xhr.aborted, 'Request was aborted'); 137 }); 138 139 test('query and findAll have distinct watchList entries', async function(assert) { 140 await this.initializeUI(); 141 142 const { pretender } = this.server; 143 144 const request = () => 145 this.subject().query(this.store, { modelName: 'volume' }, { type: 'csi' }, null, { 146 reload: true, 147 adapterOptions: { watch: true }, 148 }); 149 150 const findAllRequest = () => 151 this.subject().findAll(null, { modelName: 'volume' }, null, { 152 reload: true, 153 adapterOptions: { watch: true }, 154 }); 155 156 request(); 157 assert.equal(pretender.handledRequests[0].url, '/v1/volumes?type=csi&index=1'); 158 159 await settled(); 160 request(); 161 assert.equal(pretender.handledRequests[1].url, '/v1/volumes?type=csi&index=2'); 162 163 await settled(); 164 findAllRequest(); 165 assert.equal(pretender.handledRequests[2].url, '/v1/volumes?index=1'); 166 }); 167 });