github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/ui/tests/acceptance/token-test.js (about)

     1  import { find } from 'ember-native-dom-helpers';
     2  import { test, skip } from 'ember-qunit';
     3  import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance';
     4  import Tokens from 'nomad-ui/tests/pages/settings/tokens';
     5  import Jobs from 'nomad-ui/tests/pages/jobs/list';
     6  import JobDetail from 'nomad-ui/tests/pages/jobs/detail';
     7  import ClientDetail from 'nomad-ui/tests/pages/clients/detail';
     8  
     9  let job;
    10  let node;
    11  let managementToken;
    12  let clientToken;
    13  
    14  moduleForAcceptance('Acceptance | tokens', {
    15    beforeEach() {
    16      server.create('agent');
    17      node = server.create('node');
    18      job = server.create('job');
    19      managementToken = server.create('token');
    20      clientToken = server.create('token');
    21    },
    22  });
    23  
    24  test('the token form sets the token in local storage', function(assert) {
    25    const { secretId } = managementToken;
    26  
    27    Tokens.visit();
    28  
    29    andThen(() => {
    30      assert.ok(window.localStorage.nomadTokenSecret == null, 'No token secret set');
    31  
    32      Tokens.secret(secretId).submit();
    33  
    34      andThen(() => {
    35        assert.equal(window.localStorage.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    JobDetail.visit({ id: job.id });
    46    ClientDetail.visit({ id: 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    Tokens.visit();
    59  
    60    andThen(() => {
    61      Tokens.secret(secretId).submit();
    62    });
    63  
    64    JobDetail.visit({ id: job.id });
    65    ClientDetail.visit({ id: 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    Tokens.visit();
    88  
    89    andThen(() => {
    90      Tokens.secret(bogusSecret).submit();
    91  
    92      andThen(() => {
    93        assert.ok(
    94          window.localStorage.nomadTokenSecret == null,
    95          'Token secret is discarded on failure'
    96        );
    97        assert.ok(Tokens.errorMessage, 'Token error message is shown');
    98        assert.notOk(Tokens.successMessage, 'Token success message is not shown');
    99        assert.equal(Tokens.policies.length, 0, 'No token policies are shown');
   100      });
   101    });
   102  });
   103  
   104  test('a success message and a special management token message are shown when authenticating succeeds', function(assert) {
   105    const { secretId } = managementToken;
   106  
   107    Tokens.visit();
   108  
   109    andThen(() => {
   110      Tokens.secret(secretId).submit();
   111  
   112      andThen(() => {
   113        assert.ok(Tokens.successMessage, 'Token success message is shown');
   114        assert.notOk(Tokens.errorMessage, 'Token error message is not shown');
   115        assert.ok(Tokens.managementMessage, 'Token management message is shown');
   116        assert.equal(Tokens.policies.length, 0, 'No token policies are shown');
   117      });
   118    });
   119  });
   120  
   121  test('a success message and associated policies are shown when authenticating succeeds', function(assert) {
   122    const { secretId } = clientToken;
   123    const policy = clientToken.policies.models[0];
   124    policy.update('description', 'Make sure there is a description');
   125  
   126    Tokens.visit();
   127  
   128    andThen(() => {
   129      Tokens.secret(secretId).submit();
   130  
   131      andThen(() => {
   132        assert.ok(Tokens.successMessage, 'Token success message is shown');
   133        assert.notOk(Tokens.errorMessage, 'Token error message is not shown');
   134        assert.notOk(Tokens.managementMessage, 'Token management message is not shown');
   135        assert.equal(
   136          Tokens.policies.length,
   137          clientToken.policies.length,
   138          'Each policy associated with the token is listed'
   139        );
   140  
   141        const policyElement = Tokens.policies.objectAt(0);
   142  
   143        assert.equal(policyElement.name, policy.name, 'Policy Name');
   144        assert.equal(policyElement.description, policy.description, 'Policy Description');
   145        assert.equal(policyElement.rules, policy.rules, 'Policy Rules');
   146      });
   147    });
   148  });
   149  
   150  test('setting a token clears the store', function(assert) {
   151    const { secretId } = clientToken;
   152  
   153    Jobs.visit();
   154  
   155    andThen(() => {
   156      assert.ok(find('.job-row'), 'Jobs found');
   157    });
   158  
   159    Tokens.visit();
   160  
   161    andThen(() => {
   162      Tokens.secret(secretId).submit();
   163    });
   164  
   165    // Don't return jobs from the API the second time around
   166    andThen(() => {
   167      server.pretender.get('/v1/jobs', function() {
   168        return [200, {}, '[]'];
   169      });
   170    });
   171  
   172    Jobs.visit();
   173  
   174    // If jobs are lingering in the store, they would show up
   175    assert.notOk(find('[data-test-job-row]'), 'No jobs found');
   176  });
   177  
   178  function getHeader({ requestHeaders }, name) {
   179    // Headers are case-insensitive, but object property look up is not
   180    return (
   181      requestHeaders[name] || requestHeaders[name.toLowerCase()] || requestHeaders[name.toUpperCase()]
   182    );
   183  }