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  }