<commit_before>import EmberObject from '@ember/object';
import { run } from '@ember/runloop';
import { assign } from '@ember/polyfills';
import { test } from 'ember-qunit';
import wait from 'ember-test-helpers/wait';
import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage';
import moduleForAdapter from '../../helpers/module-for-adapter';

moduleForAdapter('job', 'Unit | Adapter | Job', {
  needs: [
    'adapter:job',
    'service:token',
    'service:system',
    'model:allocation',
    'model:deployment',
    'model:evaluation',
    'model:job-summary',
    'model:job-version',
    'model:namespace',
    'adapter:application',
    'service:watchList',
  ],
  beforeEach() {
    window.sessionStorage.clear();
    window.localStorage.clear();

    this.server = startMirage();
    this.server.create('node');
    this.server.create('job', { id: 'job-1' });
    this.server.create('job', { id: 'job-2', namespaceId: 'some-namespace' });
  },
  afterEach() {
    this.server.shutdown();
  },
});

test('The job endpoint is the only required endpoint for fetching a job', function(assert) {
  const { pretender } = this.server;
  const jobName = 'job-1';
  const jobNamespace = 'default';
  const jobId = JSON.stringify([jobName, jobNamespace]);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.deepEqual(
    pretender.handledRequests.mapBy('url'),
    [`/v1/job/${jobName}`],
    'The only request made is /job/:id'
  );
});

test('When a namespace is in localStorage and the requested job is in the default namespace, the namespace query param is left out', function(assert) {
  window.localStorage.nomadActiveNamespace = 'red-herring';

  const { pretender } = this.server;
  const jobName = 'job-1';
  const jobNamespace = 'default';
  const jobId = JSON.stringify([jobName, jobNamespace]);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.deepEqual(
    pretender.handledRequests.mapBy('url'),
    [`/v1/job/${jobName}`],
    'The request made is /job/:id with no namespace query param'
  );
});

test('When the job has a namespace other than default, it is in the URL', function(assert) {
  const { pretender } = this.server;
  const jobName = 'job-2';
  const jobNamespace = 'some-namespace';
  const jobId = JSON.stringify([jobName, jobNamespace]);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.deepEqual(
    pretender.handledRequests.mapBy('url'),
    [`/v1/job/${jobName}?namespace=${jobNamespace}`],
    'The only request made is /job/:id?namespace=:namespace'
  );
});

test('When there is no token set in the token service, no x-nomad-token header is set', function(assert) {
  const { pretender } = this.server;
  const jobId = JSON.stringify(['job-1', 'default']);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.notOk(
    pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']),
    'No token header present on either job request'
  );
});

test('When a token is set in the token service, then x-nomad-token header is set', function(assert) {
  const { pretender } = this.server;
  const jobId = JSON.stringify(['job-1', 'default']);
  const secret = 'here is the secret';

  this.subject().set('token.secret', secret);
  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.ok(
    pretender.handledRequests
      .mapBy('requestHeaders')
      .every(headers => headers['X-Nomad-Token'] === secret),
    'The token header is present on both job requests'
  );
});

test('findAll can be watched', function(assert) {
  const { pretender } = this.server;

  const request = () =>
    this.subject().findAll(null, { modelName: 'job' }, null, {
      reload: true,
      adapterOptions: { watch: true },
    });

  request();
  assert.equal(
    pretender.handledRequests[0].url,
    '/v1/namespaces',
    'First request is for namespaces'
  );
  assert.equal(
    pretender.handledRequests[1].url,
    '/v1/jobs?index=1',
    'Second request is a blocking request for jobs'
  );

  return wait().then(() => {
    request();
    assert.equal(
      pretender.handledRequests[2].url,
      '/v1/jobs?index=2',
      'Third request is a blocking request with an incremented index param'
    );

    return wait();
  });
});

test('findRecord can be watched', function(assert) {
  const jobId = JSON.stringify(['job-1', 'default']);
  const { pretender } = this.server;

  const request = () =>
    this.subject().findRecord(null, { modelName: 'job' }, jobId, {
      reload: true,
      adapterOptions: { watch: true },
    });

  request();
  assert.equal(
    pretender.handledRequests[0].url,
    '/v1/job/job-1?index=1',
    'Second request is a blocking request for job-1'
  );

  return wait().then(() => {
    request();
    assert.equal(
      pretender.handledRequests[1].url,
      '/v1/job/job-1?index=2',
      'Third request is a blocking request with an incremented index param'
    );

    return wait();
  });
});

test('relationships can be reloaded', function(assert) {
  const { pretender } = this.server;
  const plainId = 'job-1';
  const mockModel = makeMockModel(plainId);

  this.subject().reloadRelationship(mockModel, 'summary');
  assert.equal(
    pretender.handledRequests[0].url,
    `/v1/job/${plainId}/summary`,
    'Relationship was reloaded'
  );
});

test('relationship reloads can be watched', function(assert) {
  const { pretender } = this.server;
  const plainId = 'job-1';
  const mockModel = makeMockModel(plainId);

  this.subject().reloadRelationship(mockModel, 'summary', true);
  assert.equal(
    pretender.handledRequests[0].url,
    '/v1/job/job-1/summary?index=1',
    'First request is a blocking request for job-1 summary relationship'
  );

  return wait().then(() => {
    this.subject().reloadRelationship(mockModel, 'summary', true);
    assert.equal(
      pretender.handledRequests[1].url,
      '/v1/job/job-1/summary?index=2',
      'Second request is a blocking request with an incremented index param'
    );
  });<commit_msg>A test to assert the bug<commit_after>import EmberObject from '@ember/object';
import { getOwner } from '@ember/application';
import { run } from '@ember/runloop';
import { assign } from '@ember/polyfills';
import { test } from 'ember-qunit';
import wait from 'ember-test-helpers/wait';
import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage';
import moduleForAdapter from '../../helpers/module-for-adapter';

moduleForAdapter('job', 'Unit | Adapter | Job', {
  needs: [
    'adapter:application',
    'adapter:job',
    'adapter:namespace',
    'model:task-group',
    'model:allocation',
    'model:deployment',
    'model:evaluation',
    'model:job-summary',
    'model:job-version',
    'model:namespace',
    'model:task-group-summary',
    'serializer:namespace',
    'serializer:job',
    'serializer:job-summary',
    'service:token',
    'service:system',
    'service:watchList',
    'transform:fragment',
    'transform:fragment-array',
  ],
  beforeEach() {
    window.sessionStorage.clear();
    window.localStorage.clear();

    this.server = startMirage();
    this.server.create('namespace');
    this.server.create('namespace', { id: 'some-namespace' });
    this.server.create('node');
    this.server.create('job', { id: 'job-1', namespaceId: 'default' });
    this.server.create('job', { id: 'job-2', namespaceId: 'some-namespace' });

    this.system = getOwner(this).lookup('service:system');
    this.system.get('namespaces');

    // Reset the handledRequests array to avoid accounting for this
    // namespaces request everywhere.
    this.server.pretender.handledRequests.length = 0;
  },
  afterEach() {
    this.server.shutdown();
  },
});

test('The job endpoint is the only required endpoint for fetching a job', function(assert) {
  const { pretender } = this.server;
  const jobName = 'job-1';
  const jobNamespace = 'default';
  const jobId = JSON.stringify([jobName, jobNamespace]);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.deepEqual(
    pretender.handledRequests.mapBy('url'),
    [`/v1/job/${jobName}`],
    'The only request made is /job/:id'
  );
});

test('When a namespace is set in localStorage but a job in the default namespace is requested, the namespace query param is not present', function(assert) {
  window.localStorage.nomadActiveNamespace = 'some-namespace';

  const { pretender } = this.server;
  const jobName = 'job-1';
  const jobNamespace = 'default';
  const jobId = JSON.stringify([jobName, jobNamespace]);

  this.system.get('namespaces');
  return wait().then(() => {
    this.subject().findRecord(null, { modelName: 'job' }, jobId);

    assert.deepEqual(
      pretender.handledRequests.mapBy('url'),
      [`/v1/job/${jobName}`],
      'The one request made is /job/:id with no namespace query param'
    );
  });
});

test('When a namespace is in localStorage and the requested job is in the default namespace, the namespace query param is left out', function(assert) {
  window.localStorage.nomadActiveNamespace = 'red-herring';

  const { pretender } = this.server;
  const jobName = 'job-1';
  const jobNamespace = 'default';
  const jobId = JSON.stringify([jobName, jobNamespace]);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.deepEqual(
    pretender.handledRequests.mapBy('url'),
    [`/v1/job/${jobName}`],
    'The request made is /job/:id with no namespace query param'
  );
});

test('When the job has a namespace other than default, it is in the URL', function(assert) {
  const { pretender } = this.server;
  const jobName = 'job-2';
  const jobNamespace = 'some-namespace';
  const jobId = JSON.stringify([jobName, jobNamespace]);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.deepEqual(
    pretender.handledRequests.mapBy('url'),
    [`/v1/job/${jobName}?namespace=${jobNamespace}`],
    'The only request made is /job/:id?namespace=:namespace'
  );
});

test('When there is no token set in the token service, no x-nomad-token header is set', function(assert) {
  const { pretender } = this.server;
  const jobId = JSON.stringify(['job-1', 'default']);

  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.notOk(
    pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']),
    'No token header present on either job request'
  );
});

test('When a token is set in the token service, then x-nomad-token header is set', function(assert) {
  const { pretender } = this.server;
  const jobId = JSON.stringify(['job-1', 'default']);
  const secret = 'here is the secret';

  this.subject().set('token.secret', secret);
  this.subject().findRecord(null, { modelName: 'job' }, jobId);

  assert.ok(
    pretender.handledRequests
      .mapBy('requestHeaders')
      .every(headers => headers['X-Nomad-Token'] === secret),
    'The token header is present on both job requests'
  );
});

test('findAll can be watched', function(assert) {
  const { pretender } = this.server;

  const request = () =>
    this.subject().findAll(null, { modelName: 'job' }, null, {
      reload: true,
      adapterOptions: { watch: true },
    });

  request();
  assert.equal(
    pretender.handledRequests[0].url,
    '/v1/jobs?index=1',
    'Second request is a blocking request for jobs'
  );

  return wait().then(() => {
    request();
    assert.equal(
      pretender.handledRequests[1].url,
      '/v1/jobs?index=2',
      'Third request is a blocking request with an incremented index param'
    );

    return wait();
  });
});

test('findRecord can be watched', function(assert) {
  const jobId = JSON.stringify(['job-1', 'default']);
  const { pretender } = this.server;

  const request = () =>
    this.subject().findRecord(null, { modelName: 'job' }, jobId, {
      reload: true,
      adapterOptions: { watch: true },
    });

  request();
  assert.equal(
    pretender.handledRequests[0].url,
    '/v1/job/job-1?index=1',
    'Second request is a blocking request for job-1'
  );

  return wait().then(() => {
    request();
    assert.equal(
      pretender.handledRequests[1].url,
      '/v1/job/job-1?index=2',
      'Third request is a blocking request with an incremented index param'
    );

    return wait();
  });
});

test('relationships can be reloaded', function(assert) {
  const { pretender } = this.server;
  const plainId = 'job-1';
  const mockModel = makeMockModel(plainId);

  this.subject().reloadRelationship(mockModel, 'summary');
  return wait().then(() => {
    assert.equal(
      pretender.handledRequests[0].url,
      `/v1/job/${plainId}/summary`,
      'Relationship was reloaded'
    );
  });
});

test('relationship reloads can be watched', function(assert) {
  const { pretender } = this.server;
  const plainId = 'job-1';
  const mockModel = makeMockModel(plainId);

  this.subject().reloadRelationship(mockModel, 'summary', true);
  assert.equal(
    pretender.handledRequests[0].url,
    '/v1/job/job-1/summary?index=1',
    'First request is a blocking request for job-1 summary relationship'
  );

  return wait().then(() => {
    this.subject().reloadRelationship(mockModel, 'summary', true);
    assert.equal(
      pretender.handledRequests[1].url,
      '/v1/job/job-1/summary?index=2',
      'Second request is a blocking request with an incremented index param'
    );
  });
{'fraction_non_alphanumeric': 0.15895222503348713, 'fraction_numerical': 0.0061765143622562885, 'mean_word_length': 3.6907504363001746, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5541039', 'n_tokens_mistral': 4245, 'n_tokens_neox': 4234, 'n_words': 1026}