github.com/hernad/nomad@v1.6.112/ui/tests/acceptance/proxy-test.js (about)

     1  /**
     2   * Copyright (c) HashiCorp, Inc.
     3   * SPDX-License-Identifier: MPL-2.0
     4   */
     5  
     6  /* eslint-disable ember-a11y-testing/a11y-audit-called */ // Tests for non-UI behaviour.
     7  import { module, test } from 'qunit';
     8  import { setupApplicationTest } from 'ember-qunit';
     9  import { setupMirage } from 'ember-cli-mirage/test-support';
    10  import Jobs from 'nomad-ui/tests/pages/jobs/list';
    11  
    12  let managementToken;
    13  
    14  module('Acceptance | reverse proxy', function (hooks) {
    15    setupApplicationTest(hooks);
    16    setupMirage(hooks);
    17  
    18    hooks.beforeEach(function () {
    19      window.localStorage.clear();
    20      window.sessionStorage.clear();
    21  
    22      server.create('agent');
    23      managementToken = server.create('token');
    24  
    25      // Prepare a setRequestHeader that accumulate headers already set. This is to avoid double setting X-Nomad-Token
    26      this._originalXMLHttpRequestSetRequestHeader =
    27        XMLHttpRequest.prototype.setRequestHeader;
    28      (function (setRequestHeader) {
    29        XMLHttpRequest.prototype.setRequestHeader = function (header, value) {
    30          if (!this.headers) {
    31            this.headers = {};
    32          }
    33          if (!this.headers[header]) {
    34            this.headers[header] = [];
    35          }
    36          // Add the value to the header
    37          this.headers[header].push(value);
    38          setRequestHeader.call(this, header, value);
    39        };
    40      })(this._originalXMLHttpRequestSetRequestHeader);
    41  
    42      // Simulate a reverse proxy injecting X-Nomad-Token header for all requests
    43      this._originalXMLHttpRequestSend = XMLHttpRequest.prototype.send;
    44      (function (send) {
    45        XMLHttpRequest.prototype.send = function (data) {
    46          if (!this.headers || !('X-Nomad-Token' in this.headers)) {
    47            this.setRequestHeader('X-Nomad-Token', managementToken.secretId);
    48          }
    49          send.call(this, data);
    50        };
    51      })(this._originalXMLHttpRequestSend);
    52    });
    53  
    54    hooks.afterEach(function () {
    55      XMLHttpRequest.prototype.setRequestHeader =
    56        this._originalXMLHttpRequestSetRequestHeader;
    57      XMLHttpRequest.prototype.send = this._originalXMLHttpRequestSend;
    58    });
    59  
    60    test('when token is inserted by a reverse proxy, the UI is adjusted', async function (assert) {
    61      // when token is inserted by reserve proxy, the token is reverse proxy
    62      const { secretId } = managementToken;
    63  
    64      await Jobs.visit();
    65      assert.equal(
    66        window.localStorage.nomadTokenSecret,
    67        secretId,
    68        'Token secret was set'
    69      );
    70  
    71      // Make sure that server received the header
    72      assert.ok(
    73        server.pretender.handledRequests
    74          .mapBy('requestHeaders')
    75          .every((headers) => headers['X-Nomad-Token'] === secretId),
    76        'The token header is always present'
    77      );
    78  
    79      assert.notOk(Jobs.runJobButton.isDisabled, 'Run job button is enabled');
    80    });
    81  });