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

     1  import Ember from 'ember';
     2  import { click, find, findAll, currentURL, visit } from 'ember-native-dom-helpers';
     3  import { test } from 'qunit';
     4  import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance';
     5  import { findLeader } from '../../mirage/config';
     6  import ipParts from 'nomad-ui/utils/ip-parts';
     7  
     8  const { $ } = Ember;
     9  
    10  function minimumSetup() {
    11    server.createList('node', 1);
    12    server.createList('agent', 1);
    13  }
    14  
    15  moduleForAcceptance('Acceptance | clients list');
    16  
    17  test('/clients should list one page of clients', function(assert) {
    18    // Make sure to make more nodes than 1 page to assert that pagination is working
    19    const nodesCount = 10;
    20    const pageSize = 8;
    21  
    22    server.createList('node', nodesCount);
    23    server.createList('agent', 1);
    24  
    25    visit('/clients');
    26  
    27    andThen(() => {
    28      assert.equal(findAll('.client-node-row').length, pageSize);
    29      assert.ok(findAll('.pagination').length, 'Pagination found on the page');
    30  
    31      const sortedNodes = server.db.nodes.sortBy('modifyIndex').reverse();
    32  
    33      for (var nodeNumber = 0; nodeNumber < pageSize; nodeNumber++) {
    34        assert.equal(
    35          $(`.client-node-row:eq(${nodeNumber}) td:eq(0)`).text(),
    36          sortedNodes[nodeNumber].id.split('-')[0],
    37          'Clients are ordered'
    38        );
    39      }
    40    });
    41  });
    42  
    43  test('each client record should show high-level info of the client', function(assert) {
    44    minimumSetup();
    45    const node = server.db.nodes[0];
    46  
    47    visit('/clients');
    48  
    49    andThen(() => {
    50      const nodeRow = $(findAll('.client-node-row')[0]);
    51      const allocations = server.db.allocations.where({ nodeId: node.id });
    52      const { address, port } = ipParts(node.httpAddr);
    53  
    54      assert.equal(nodeRow.find('td:eq(0)').text(), node.id.split('-')[0], 'ID');
    55      assert.equal(nodeRow.find('td:eq(1)').text(), node.name, 'Name');
    56      assert.equal(nodeRow.find('td:eq(2)').text(), node.status, 'Status');
    57      assert.equal(nodeRow.find('td:eq(3)').text(), address, 'Address');
    58      assert.equal(nodeRow.find('td:eq(4)').text(), port, 'Port');
    59      assert.equal(nodeRow.find('td:eq(5)').text(), node.datacenter, 'Datacenter');
    60      assert.equal(nodeRow.find('td:eq(6)').text(), allocations.length, '# Allocations');
    61    });
    62  });
    63  
    64  test('each client should link to the client detail page', function(assert) {
    65    minimumSetup();
    66    const node = server.db.nodes[0];
    67  
    68    visit('/clients');
    69    andThen(() => {
    70      click(findAll('.client-node-row')[0]);
    71    });
    72  
    73    andThen(() => {
    74      assert.equal(currentURL(), `/clients/${node.id}`);
    75    });
    76  });
    77  
    78  test('when there are no clients, there is an empty message', function(assert) {
    79    server.createList('agent', 1);
    80  
    81    visit('/clients');
    82  
    83    andThen(() => {
    84      assert.ok(find('.empty-message'));
    85      assert.equal(find('.empty-message-headline').textContent, 'No Clients');
    86    });
    87  });
    88  
    89  test('when there are clients, but no matches for a search term, there is an empty message', function(
    90    assert
    91  ) {
    92    server.createList('agent', 1);
    93    server.create('node', { name: 'node' });
    94  
    95    visit('/clients');
    96  
    97    andThen(() => {
    98      fillIn('.search-box input', 'client');
    99    });
   100  
   101    andThen(() => {
   102      assert.ok(find('.empty-message'));
   103      assert.equal(find('.empty-message-headline').textContent, 'No Matches');
   104    });
   105  });
   106  
   107  test('when accessing clients is forbidden, show a message with a link to the tokens page', function(
   108    assert
   109  ) {
   110    server.create('agent');
   111    server.create('node', { name: 'node' });
   112    server.pretender.get('/v1/nodes', () => [403, {}, null]);
   113  
   114    visit('/clients');
   115  
   116    andThen(() => {
   117      assert.equal(find('.empty-message-headline').textContent, 'Not Authorized');
   118    });
   119  
   120    andThen(() => {
   121      click('.empty-message-body a');
   122    });
   123  
   124    andThen(() => {
   125      assert.equal(currentURL(), '/settings/tokens');
   126    });
   127  });
   128  
   129  test('/servers should list all servers', function(assert) {
   130    const agentsCount = 10;
   131    const pageSize = 8;
   132  
   133    server.createList('node', 1);
   134    server.createList('agent', agentsCount);
   135  
   136    const leader = findLeader(server.schema);
   137  
   138    visit('/servers');
   139  
   140    andThen(() => {
   141      assert.equal(findAll('.server-agent-row').length, pageSize);
   142  
   143      const sortedAgents = server.db.agents
   144        .sort((a, b) => {
   145          if (`${a.address}:${a.tags.port}` === leader) {
   146            return 1;
   147          } else if (`${b.address}:${b.tags.port}` === leader) {
   148            return -1;
   149          }
   150          return 0;
   151        })
   152        .reverse();
   153  
   154      for (var agentNumber = 0; agentNumber < 8; agentNumber++) {
   155        assert.equal(
   156          $(`.server-agent-row:eq(${agentNumber}) td:eq(0)`).text(),
   157          sortedAgents[agentNumber].name,
   158          'Clients are ordered'
   159        );
   160      }
   161    });
   162  });
   163  
   164  test('each server should show high-level info of the server', function(assert) {
   165    minimumSetup();
   166    const agent = server.db.agents[0];
   167  
   168    visit('/servers');
   169  
   170    andThen(() => {
   171      const agentRow = $(findAll('.server-agent-row')[0]);
   172  
   173      assert.equal(agentRow.find('td:eq(0)').text(), agent.name, 'Name');
   174      assert.equal(agentRow.find('td:eq(1)').text(), agent.status, 'Status');
   175      assert.equal(agentRow.find('td:eq(2)').text(), 'True', 'Leader?');
   176      assert.equal(agentRow.find('td:eq(3)').text(), agent.address, 'Address');
   177      assert.equal(agentRow.find('td:eq(4)').text(), agent.serf_port, 'Serf Port');
   178      assert.equal(agentRow.find('td:eq(5)').text(), agent.tags.dc, 'Datacenter');
   179    });
   180  });
   181  
   182  test('each server should link to the server detail page', function(assert) {
   183    minimumSetup();
   184    const agent = server.db.agents[0];
   185  
   186    visit('/servers');
   187    andThen(() => {
   188      click(findAll('.server-agent-row')[0]);
   189    });
   190  
   191    andThen(() => {
   192      assert.equal(currentURL(), `/servers/${agent.name}`);
   193    });
   194  });
   195  
   196  test('when accessing servers is forbidden, show a message with a link to the tokens page', function(
   197    assert
   198  ) {
   199    server.create('agent');
   200    server.pretender.get('/v1/agent/members', () => [403, {}, null]);
   201  
   202    visit('/servers');
   203  
   204    andThen(() => {
   205      assert.equal(find('.empty-message-headline').textContent, 'Not Authorized');
   206    });
   207  
   208    andThen(() => {
   209      click('.empty-message-body a');
   210    });
   211  
   212    andThen(() => {
   213      assert.equal(currentURL(), '/settings/tokens');
   214    });
   215  });