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

     1  import { find, findAll, fillIn, click, visit } from 'ember-native-dom-helpers';
     2  import Ember from 'ember';
     3  import { test, skip } from 'ember-qunit';
     4  import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance';
     5  
     6  const { $ } = Ember;
     7  
     8  let job;
     9  let node;
    10  let managementToken;
    11  let clientToken;
    12  
    13  moduleForAcceptance('Acceptance | tokens', {
    14    beforeEach() {
    15      server.create('agent');
    16      node = server.create('node');
    17      job = server.create('job');
    18      managementToken = server.create('token');
    19      clientToken = server.create('token');
    20    },
    21  });
    22  
    23  test('the token form sets the token in session storage', function(assert) {
    24    const { secretId } = managementToken;
    25  
    26    visit('/settings/tokens');
    27  
    28    andThen(() => {
    29      assert.ok(window.sessionStorage.nomadTokenSecret == null, 'No token secret set');
    30  
    31      fillIn('.token-secret', secretId);
    32      click('.token-submit');
    33  
    34      andThen(() => {
    35        assert.equal(window.sessionStorage.nomadTokenSecret, secretId, 'Token secret was set');
    36      });
    37    });
    38  });
    39  
    40  // TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle
    41  skip('the X-Nomad-Token header gets sent with requests once it is set', function(assert) {
    42    const { secretId } = managementToken;
    43    let requestPosition = 0;
    44  
    45    visit(`/jobs/${job.id}`);
    46    visit(`/clients/${node.id}`);
    47  
    48    andThen(() => {
    49      assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made');
    50  
    51      server.pretender.handledRequests.forEach(req => {
    52        assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`);
    53      });
    54  
    55      requestPosition = server.pretender.handledRequests.length;
    56    });
    57  
    58    visit('/settings/tokens');
    59    andThen(() => {
    60      fillIn('.token-secret', secretId);
    61      click('.token-submit');
    62    });
    63  
    64    visit(`/jobs/${job.id}`);
    65    visit(`/clients/${node.id}`);
    66  
    67    andThen(() => {
    68      const newRequests = server.pretender.handledRequests.slice(requestPosition);
    69      assert.ok(newRequests.length > 1, 'New requests have been made');
    70  
    71      // Cross-origin requests can't have a token
    72      newRequests.forEach(req => {
    73        assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`);
    74      });
    75    });
    76  });
    77  
    78  test('an error message is shown when authenticating a token fails', function(assert) {
    79    const { secretId } = managementToken;
    80    const bogusSecret = 'this-is-not-the-secret';
    81    assert.notEqual(
    82      secretId,
    83      bogusSecret,
    84      'bogus secret is not somehow coincidentally equal to the real secret'
    85    );
    86  
    87    visit('/settings/tokens');
    88  
    89    andThen(() => {
    90      fillIn('.token-secret', bogusSecret);
    91      click('.token-submit');
    92  
    93      andThen(() => {
    94        assert.ok(
    95          window.sessionStorage.nomadTokenSecret == null,
    96          'Token secret is discarded on failure'
    97        );
    98        assert.ok(find('.token-error'), 'Token error message is shown');
    99        assert.notOk(find('.token-success'), 'Token success message is not shown');
   100        assert.notOk(find('.token-policy'), 'No token policies are shown');
   101      });
   102    });
   103  });
   104  
   105  test('a success message and a special management token message are shown when authenticating succeeds', function(
   106    assert
   107  ) {
   108    const { secretId } = managementToken;
   109  
   110    visit('/settings/tokens');
   111  
   112    andThen(() => {
   113      fillIn('.token-secret', secretId);
   114      click('.token-submit');
   115  
   116      andThen(() => {
   117        assert.ok(find('.token-success'), 'Token success message is shown');
   118        assert.notOk(find('.token-error'), 'Token error message is not shown');
   119        assert.ok(find('.token-management-message'), 'Token management message is shown');
   120        assert.notOk(find('.token-policy'), 'No token policies are shown');
   121      });
   122    });
   123  });
   124  
   125  test('a success message and associated policies are shown when authenticating succeeds', function(
   126    assert
   127  ) {
   128    const { secretId } = clientToken;
   129    const policy = clientToken.policies.models[0];
   130    policy.update('description', 'Make sure there is a description');
   131  
   132    visit('/settings/tokens');
   133  
   134    andThen(() => {
   135      fillIn('.token-secret', secretId);
   136      click('.token-submit');
   137  
   138      andThen(() => {
   139        assert.ok(find('.token-success'), 'Token success message is shown');
   140        assert.notOk(find('.token-error'), 'Token error message is not shown');
   141        assert.notOk(find('.token-management-message'), 'Token management message is not shown');
   142        assert.equal(
   143          findAll('.token-policy').length,
   144          clientToken.policies.length,
   145          'Each policy associated with the token is listed'
   146        );
   147  
   148        const policyElement = $(find('.token-policy'));
   149  
   150        assert.equal(
   151          policyElement
   152            .find('.boxed-section-head')
   153            .text()
   154            .trim(),
   155          policy.name,
   156          'Policy Name'
   157        );
   158        assert.equal(
   159          policyElement
   160            .find('.boxed-section-body p.content')
   161            .text()
   162            .trim(),
   163          policy.description,
   164          'Policy Description'
   165        );
   166        assert.equal(
   167          policyElement.find('.boxed-section-body pre code').text(),
   168          policy.rules,
   169          'Policy Rules'
   170        );
   171      });
   172    });
   173  });
   174  
   175  test('setting a token clears the store', function(assert) {
   176    const { secretId } = clientToken;
   177  
   178    visit('/jobs');
   179  
   180    andThen(() => {
   181      assert.ok(find('.job-row'), 'Jobs found');
   182    });
   183  
   184    visit('/settings/tokens');
   185  
   186    andThen(() => {
   187      fillIn('.token-secret', secretId);
   188      click('.token-submit');
   189    });
   190  
   191    // Don't return jobs from the API the second time around
   192    andThen(() => {
   193      server.pretender.get('/v1/jobs', function() {
   194        return [200, {}, '[]'];
   195      });
   196    });
   197  
   198    visit('/jobs');
   199  
   200    // If jobs are lingering in the store, they would show up
   201    assert.notOk(find('.job-row'), 'No jobs found');
   202  });
   203  
   204  function getHeader({ requestHeaders }, name) {
   205    // Headers are case-insensitive, but object property look up is not
   206    return (
   207      requestHeaders[name] || requestHeaders[name.toLowerCase()] || requestHeaders[name.toUpperCase()]
   208    );
   209  }