github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/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 { AbortController } from 'fetch';
     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 controller = new AbortController();
   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, abortController: controller },
   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        controller.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  });