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 });