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