github.com/blixtra/nomad@v0.7.2-0.20171221000451-da9a1d7bb050/ui/tests/acceptance/jobs-list-test.js (about)

     1  import Ember from 'ember';
     2  import { click, find, findAll, currentURL, visit, fillIn } from 'ember-native-dom-helpers';
     3  import { test } from 'qunit';
     4  import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance';
     5  
     6  const { $ } = Ember;
     7  
     8  moduleForAcceptance('Acceptance | jobs list', {
     9    beforeEach() {
    10      // Required for placing allocations (a result of creating jobs)
    11      server.create('node');
    12    },
    13  });
    14  
    15  test('visiting /jobs', function(assert) {
    16    visit('/jobs');
    17  
    18    andThen(() => {
    19      assert.equal(currentURL(), '/jobs');
    20    });
    21  });
    22  
    23  test('/jobs should list the first page of jobs sorted by modify index', function(assert) {
    24    const jobsCount = 11;
    25    const pageSize = 10;
    26    server.createList('job', jobsCount, { createAllocations: false });
    27  
    28    visit('/jobs');
    29  
    30    andThen(() => {
    31      const sortedJobs = server.db.jobs.sortBy('modifyIndex').reverse();
    32      assert.equal(findAll('.job-row').length, pageSize);
    33      for (var jobNumber = 0; jobNumber < pageSize; jobNumber++) {
    34        assert.equal(
    35          $(`.job-row:eq(${jobNumber}) td:eq(0)`).text(),
    36          sortedJobs[jobNumber].name,
    37          'Jobs are ordered'
    38        );
    39      }
    40    });
    41  });
    42  
    43  test('each job row should contain information about the job', function(assert) {
    44    server.createList('job', 2);
    45    const job = server.db.jobs.sortBy('modifyIndex').reverse()[0];
    46    const taskGroups = server.db.taskGroups.where({ jobId: job.id });
    47  
    48    visit('/jobs');
    49  
    50    andThen(() => {
    51      const jobRow = $(findAll('.job-row')[0]);
    52  
    53      assert.equal(jobRow.find('td:eq(0)').text(), job.name, 'Name');
    54      assert.equal(jobRow.find('td:eq(0) a').attr('href'), `/ui/jobs/${job.id}`, 'Detail Link');
    55      assert.equal(
    56        jobRow
    57          .find('td:eq(1)')
    58          .text()
    59          .trim(),
    60        job.status,
    61        'Status'
    62      );
    63      assert.equal(jobRow.find('td:eq(2)').text(), job.type, 'Type');
    64      assert.equal(jobRow.find('td:eq(3)').text(), job.priority, 'Priority');
    65      andThen(() => {
    66        assert.equal(
    67          jobRow
    68            .find('td:eq(4)')
    69            .text()
    70            .trim(),
    71          taskGroups.length,
    72          '# Groups'
    73        );
    74      });
    75    });
    76  });
    77  
    78  test('each job row should link to the corresponding job', function(assert) {
    79    server.create('job');
    80    const job = server.db.jobs[0];
    81  
    82    visit('/jobs');
    83  
    84    andThen(() => {
    85      click($('.job-row:eq(0) td:eq(0) a').get(0));
    86    });
    87  
    88    andThen(() => {
    89      assert.equal(currentURL(), `/jobs/${job.id}`);
    90    });
    91  });
    92  
    93  test('when there are no jobs, there is an empty message', function(assert) {
    94    visit('/jobs');
    95  
    96    andThen(() => {
    97      assert.ok(find('.empty-message'));
    98      assert.equal(find('.empty-message-headline').textContent, 'No Jobs');
    99    });
   100  });
   101  
   102  test('when there are jobs, but no matches for a search result, there is an empty message', function(
   103    assert
   104  ) {
   105    server.create('job', { name: 'cat 1' });
   106    server.create('job', { name: 'cat 2' });
   107  
   108    visit('/jobs');
   109  
   110    andThen(() => {
   111      fillIn('.search-box input', 'dog');
   112    });
   113  
   114    andThen(() => {
   115      assert.ok(find('.empty-message'));
   116      assert.equal(find('.empty-message-headline').textContent, 'No Matches');
   117    });
   118  });
   119  
   120  test('when the namespace query param is set, only matching jobs are shown and the namespace value is forwarded to app state', function(
   121    assert
   122  ) {
   123    server.createList('namespace', 2);
   124    const job1 = server.create('job', { namespaceId: server.db.namespaces[0].id });
   125    const job2 = server.create('job', { namespaceId: server.db.namespaces[1].id });
   126  
   127    visit('/jobs');
   128  
   129    andThen(() => {
   130      assert.equal(findAll('.job-row').length, 1, 'One job in the default namespace');
   131      assert.equal(find('.job-row td').textContent, job1.name, 'The correct job is shown');
   132    });
   133  
   134    const secondNamespace = server.db.namespaces[1];
   135    visit(`/jobs?namespace=${secondNamespace.id}`);
   136  
   137    andThen(() => {
   138      assert.equal(findAll('.job-row').length, 1, `One job in the ${secondNamespace.name} namespace`);
   139      assert.equal(find('.job-row td').textContent, job2.name, 'The correct job is shown');
   140    });
   141  });
   142  
   143  test('when accessing jobs is forbidden, show a message with a link to the tokens page', function(
   144    assert
   145  ) {
   146    server.pretender.get('/v1/jobs', () => [403, {}, null]);
   147  
   148    visit('/jobs');
   149  
   150    andThen(() => {
   151      assert.equal(find('.empty-message-headline').textContent, 'Not Authorized');
   152    });
   153  
   154    andThen(() => {
   155      click('.empty-message-body a');
   156    });
   157  
   158    andThen(() => {
   159      assert.equal(currentURL(), '/settings/tokens');
   160    });
   161  });