github.com/aminovpavel/nomad@v0.11.8/ui/tests/acceptance/token-test.js (about)

     1  import { find } from '@ember/test-helpers';
     2  import { module, skip, test } from 'qunit';
     3  import { setupApplicationTest } from 'ember-qunit';
     4  import { setupMirage } from 'ember-cli-mirage/test-support';
     5  import Tokens from 'nomad-ui/tests/pages/settings/tokens';
     6  import Jobs from 'nomad-ui/tests/pages/jobs/list';
     7  import JobDetail from 'nomad-ui/tests/pages/jobs/detail';
     8  import ClientDetail from 'nomad-ui/tests/pages/clients/detail';
     9  
    10  let job;
    11  let node;
    12  let managementToken;
    13  let clientToken;
    14  
    15  module('Acceptance | tokens', function(hooks) {
    16    setupApplicationTest(hooks);
    17    setupMirage(hooks);
    18  
    19    hooks.beforeEach(function() {
    20      window.localStorage.clear();
    21      window.sessionStorage.clear();
    22  
    23      server.create('agent');
    24      node = server.create('node');
    25      job = server.create('job');
    26      managementToken = server.create('token');
    27      clientToken = server.create('token');
    28    });
    29  
    30    test('the token form sets the token in local storage', async function(assert) {
    31      const { secretId } = managementToken;
    32  
    33      await Tokens.visit();
    34      assert.ok(window.localStorage.nomadTokenSecret == null, 'No token secret set');
    35      assert.equal(document.title, 'Tokens - Nomad');
    36  
    37      await Tokens.secret(secretId).submit();
    38      assert.equal(window.localStorage.nomadTokenSecret, secretId, 'Token secret was set');
    39    });
    40  
    41    // TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle
    42    skip('the X-Nomad-Token header gets sent with requests once it is set', async function(assert) {
    43      const { secretId } = managementToken;
    44  
    45      await JobDetail.visit({ id: job.id });
    46      await ClientDetail.visit({ id: node.id });
    47  
    48      assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made');
    49  
    50      server.pretender.handledRequests.forEach(req => {
    51        assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`);
    52      });
    53  
    54      const requestPosition = server.pretender.handledRequests.length;
    55  
    56      await Tokens.visit();
    57      await Tokens.secret(secretId).submit();
    58  
    59      await JobDetail.visit({ id: job.id });
    60      await ClientDetail.visit({ id: node.id });
    61  
    62      const newRequests = server.pretender.handledRequests.slice(requestPosition);
    63      assert.ok(newRequests.length > 1, 'New requests have been made');
    64  
    65      // Cross-origin requests can't have a token
    66      newRequests.forEach(req => {
    67        assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`);
    68      });
    69    });
    70  
    71    test('an error message is shown when authenticating a token fails', async function(assert) {
    72      const { secretId } = managementToken;
    73      const bogusSecret = 'this-is-not-the-secret';
    74      assert.notEqual(
    75        secretId,
    76        bogusSecret,
    77        'bogus secret is not somehow coincidentally equal to the real secret'
    78      );
    79  
    80      await Tokens.visit();
    81      await Tokens.secret(bogusSecret).submit();
    82  
    83      assert.ok(window.localStorage.nomadTokenSecret == null, 'Token secret is discarded on failure');
    84      assert.ok(Tokens.errorMessage, 'Token error message is shown');
    85      assert.notOk(Tokens.successMessage, 'Token success message is not shown');
    86      assert.equal(Tokens.policies.length, 0, 'No token policies are shown');
    87    });
    88  
    89    test('a success message and a special management token message are shown when authenticating succeeds', async function(assert) {
    90      const { secretId } = managementToken;
    91  
    92      await Tokens.visit();
    93      await Tokens.secret(secretId).submit();
    94  
    95      assert.ok(Tokens.successMessage, 'Token success message is shown');
    96      assert.notOk(Tokens.errorMessage, 'Token error message is not shown');
    97      assert.ok(Tokens.managementMessage, 'Token management message is shown');
    98      assert.equal(Tokens.policies.length, 0, 'No token policies are shown');
    99    });
   100  
   101    test('a success message and associated policies are shown when authenticating succeeds', async function(assert) {
   102      const { secretId } = clientToken;
   103      const policy = clientToken.policies.models[0];
   104      policy.update('description', 'Make sure there is a description');
   105  
   106      await Tokens.visit();
   107      await Tokens.secret(secretId).submit();
   108  
   109      assert.ok(Tokens.successMessage, 'Token success message is shown');
   110      assert.notOk(Tokens.errorMessage, 'Token error message is not shown');
   111      assert.notOk(Tokens.managementMessage, 'Token management message is not shown');
   112      assert.equal(
   113        Tokens.policies.length,
   114        clientToken.policies.length,
   115        'Each policy associated with the token is listed'
   116      );
   117  
   118      const policyElement = Tokens.policies.objectAt(0);
   119  
   120      assert.equal(policyElement.name, policy.name, 'Policy Name');
   121      assert.equal(policyElement.description, policy.description, 'Policy Description');
   122      assert.equal(policyElement.rules, policy.rules, 'Policy Rules');
   123    });
   124  
   125    test('setting a token clears the store', async function(assert) {
   126      const { secretId } = clientToken;
   127  
   128      await Jobs.visit();
   129      assert.ok(find('.job-row'), 'Jobs found');
   130  
   131      await Tokens.visit();
   132      await Tokens.secret(secretId).submit();
   133  
   134      server.pretender.get('/v1/jobs', function() {
   135        return [200, {}, '[]'];
   136      });
   137  
   138      await Jobs.visit();
   139  
   140      // If jobs are lingering in the store, they would show up
   141      assert.notOk(find('[data-test-job-row]'), 'No jobs found');
   142    });
   143  
   144    function getHeader({ requestHeaders }, name) {
   145      // Headers are case-insensitive, but object property look up is not
   146      return (
   147        requestHeaders[name] ||
   148        requestHeaders[name.toLowerCase()] ||
   149        requestHeaders[name.toUpperCase()]
   150      );
   151    }
   152  });