github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/ui/tests/integration/components/agent-monitor-test.js (about)

     1  import { run } from '@ember/runloop';
     2  import { module, test } from 'qunit';
     3  import { setupRenderingTest } from 'ember-qunit';
     4  import { find, render, settled } from '@ember/test-helpers';
     5  import hbs from 'htmlbars-inline-precompile';
     6  import Pretender from 'pretender';
     7  import sinon from 'sinon';
     8  import { logEncode } from '../../../mirage/data/logs';
     9  import { selectOpen, selectOpenChoose } from '../../utils/ember-power-select-extensions';
    10  import { componentA11yAudit } from 'nomad-ui/tests/helpers/a11y-audit';
    11  
    12  module('Integration | Component | agent-monitor', function(hooks) {
    13    setupRenderingTest(hooks);
    14  
    15    const LOG_MESSAGE = 'log message goes here';
    16  
    17    hooks.beforeEach(function() {
    18      // Normally this would be called server, but server is a prop of this component.
    19      this.pretender = new Pretender(function() {
    20        this.get('/v1/regions', () => [200, {}, '[]']);
    21        this.get('/v1/agent/monitor', ({ queryParams }) => [
    22          200,
    23          {},
    24          logEncode([`[${(queryParams.log_level || 'info').toUpperCase()}] ${LOG_MESSAGE}\n`], 0),
    25        ]);
    26      });
    27    });
    28  
    29    hooks.afterEach(function() {
    30      this.pretender.shutdown();
    31    });
    32  
    33    const INTERVAL = 200;
    34  
    35    const commonTemplate = hbs`
    36      <AgentMonitor
    37        @level={{this.level}}
    38        @client={{this.client}}
    39        @server={{this.server}}
    40        @onLevelChange={{this.onLevelChange}} />
    41    `;
    42  
    43    test('basic appearance', async function(assert) {
    44      this.setProperties({
    45        level: 'info',
    46        client: { id: 'client1' },
    47      });
    48  
    49      run.later(run, run.cancelTimers, INTERVAL);
    50  
    51      await render(commonTemplate);
    52  
    53      assert.ok(find('[data-test-level-switcher]'));
    54      assert.ok(find('[data-test-toggle]'));
    55      assert.ok(find('[data-test-log-box]'));
    56      assert.ok(find('[data-test-log-box].is-full-bleed.is-dark'));
    57  
    58      await componentA11yAudit(this.element, assert);
    59    });
    60  
    61    test('when provided with a client, AgentMonitor streams logs for the client', async function(assert) {
    62      this.setProperties({
    63        level: 'info',
    64        client: { id: 'client1', region: 'us-west-1' },
    65      });
    66  
    67      run.later(run, run.cancelTimers, INTERVAL);
    68  
    69      await render(commonTemplate);
    70  
    71      const logRequest = this.pretender.handledRequests[1];
    72      assert.ok(logRequest.url.startsWith('/v1/agent/monitor'));
    73      assert.ok(logRequest.url.includes('client_id=client1'));
    74      assert.ok(logRequest.url.includes('log_level=info'));
    75      assert.notOk(logRequest.url.includes('server_id'));
    76      assert.notOk(logRequest.url.includes('region='));
    77    });
    78  
    79    test('when provided with a server, AgentMonitor streams logs for the server', async function(assert) {
    80      this.setProperties({
    81        level: 'warn',
    82        server: { id: 'server1', region: 'us-west-1' },
    83      });
    84  
    85      run.later(run, run.cancelTimers, INTERVAL);
    86  
    87      await render(commonTemplate);
    88  
    89      const logRequest = this.pretender.handledRequests[1];
    90      assert.ok(logRequest.url.startsWith('/v1/agent/monitor'));
    91      assert.ok(logRequest.url.includes('server_id=server1'));
    92      assert.ok(logRequest.url.includes('log_level=warn'));
    93      assert.ok(logRequest.url.includes('region=us-west-1'));
    94      assert.notOk(logRequest.url.includes('client_id'));
    95    });
    96  
    97    test('switching levels calls onLevelChange and restarts the logger', async function(assert) {
    98      const onLevelChange = sinon.spy();
    99      const newLevel = 'trace';
   100  
   101      this.setProperties({
   102        level: 'info',
   103        client: { id: 'client1' },
   104        onLevelChange,
   105      });
   106  
   107      run.later(run, run.cancelTimers, INTERVAL);
   108  
   109      await render(commonTemplate);
   110      await settled();
   111  
   112      const contentId = await selectOpen('[data-test-level-switcher]');
   113      run.later(run, run.cancelTimers, INTERVAL);
   114      await selectOpenChoose(contentId, newLevel.capitalize());
   115      await settled();
   116  
   117      assert.ok(onLevelChange.calledOnce);
   118      assert.ok(onLevelChange.calledWith(newLevel));
   119  
   120      const secondLogRequest = this.pretender.handledRequests[2];
   121      assert.ok(secondLogRequest.url.includes(`log_level=${newLevel}`));
   122    });
   123  
   124    test('when switching levels, the scrollback is preserved and annotated with a switch message', async function(assert) {
   125      const newLevel = 'trace';
   126      const onLevelChange = sinon.spy();
   127  
   128      this.setProperties({
   129        level: 'info',
   130        client: { id: 'client1' },
   131        onLevelChange,
   132      });
   133  
   134      run.later(run, run.cancelTimers, INTERVAL);
   135  
   136      await render(commonTemplate);
   137      await settled();
   138      assert.equal(find('[data-test-log-cli]').textContent, `[INFO] ${LOG_MESSAGE}\n`);
   139  
   140      const contentId = await selectOpen('[data-test-level-switcher]');
   141      run.later(run, run.cancelTimers, INTERVAL);
   142      await selectOpenChoose(contentId, newLevel.capitalize());
   143      await settled();
   144  
   145      assert.equal(
   146        find('[data-test-log-cli]').textContent,
   147        `[INFO] ${LOG_MESSAGE}\n\n...changing log level to ${newLevel}...\n\n[TRACE] ${LOG_MESSAGE}\n`
   148      );
   149    });
   150  
   151    test('when switching levels and there is no scrollback, there is no appended switch message', async function(assert) {
   152      const newLevel = 'trace';
   153      const onLevelChange = sinon.spy();
   154  
   155      // Emit nothing for the first request
   156      this.pretender.get('/v1/agent/monitor', ({ queryParams }) => [
   157        200,
   158        {},
   159        queryParams.log_level === 'info'
   160          ? logEncode([''], 0)
   161          : logEncode([`[${(queryParams.log_level || 'info').toUpperCase()}] ${LOG_MESSAGE}\n`], 0),
   162      ]);
   163  
   164      this.setProperties({
   165        level: 'info',
   166        client: { id: 'client1' },
   167        onLevelChange,
   168      });
   169  
   170      run.later(run, run.cancelTimers, INTERVAL);
   171  
   172      await render(commonTemplate);
   173      await settled();
   174      assert.equal(find('[data-test-log-cli]').textContent, '');
   175  
   176      const contentId = await selectOpen('[data-test-level-switcher]');
   177      run.later(run, run.cancelTimers, INTERVAL);
   178      await selectOpenChoose(contentId, newLevel.capitalize());
   179      await settled();
   180  
   181      assert.equal(find('[data-test-log-cli]').textContent, `[TRACE] ${LOG_MESSAGE}\n`);
   182    });
   183  });