github.com/hspak/nomad@v0.7.2-0.20180309000617-bc4ae22a39a5/ui/tests/acceptance/token-test.js (about)

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