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 });