Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / remoting / webapp / crd / js / host_table_entry_unittest.js
blob8a4066eb591b084fa71eae8817a04ccd60b09a2a
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 (function() {
7 'use strict';
9 /** @type {remoting.HostTableEntry} */
10 var hostTableEntry_ = null;
11 var onConnect_ = null;
12 var onRename_ = null;
13 var onDelete_ = null;
15 QUnit.module('HostTableEntry', {
16   beforeEach: function() {
17     onConnect_ = /** @type {function(string)} */ (sinon.spy());
18     onRename_ = /** @type {function(remoting.HostTableEntry)} */ (sinon.spy());
19     onDelete_ = /** @type {function(remoting.HostTableEntry)} */ (sinon.spy());
20     hostTableEntry_ =
21         new remoting.HostTableEntry(10,
22           onConnect_, onRename_, onDelete_);
24     // Setup the DOM dependencies on the confirm delete dialog.
25     var fixture = document.getElementById('qunit-fixture');
26     fixture.innerHTML = '<div id="confirm-host-delete-message"></div>' +
27                         '<div id="confirm-host-delete"></div>' +
28                         '<div id="cancel-host-delete"></div>';
29     setHost('LocalHost', 'ONLINE');
30     fixture.appendChild(hostTableEntry_.element());
31     sinon.stub(chrome.i18n, 'getMessage', function(/** string */ tag){
32       return tag;
33     });
34   },
35   afterEach: function() {
36     hostTableEntry_.dispose();
37     hostTableEntry_ = null;
38     $testStub(chrome.i18n.getMessage).restore();
39   }
40 });
42 /**
43  * @param {string} hostName
44  * @param {string} status
45  * @param {string=} opt_offlineReason
46  */
47 function setHost(hostName, status, opt_offlineReason) {
48   var host = new remoting.Host('id');
49   host.hostName = hostName;
50   host.status = status;
51   if (opt_offlineReason) {
52     host.hostOfflineReason = opt_offlineReason;
53   }
54   hostTableEntry_.setHost(host);
58 /** @suppress {checkTypes|reportUnknownTypes} */
59 function sendKeydown(/** HTMLElement */ target, /** number */ keyCode) {
60   var event = document.createEvent('KeyboardEvent');
61   Object.defineProperty(
62       event, 'which', {get: function(assert) { return keyCode; }});
63   event.initKeyboardEvent("keydown", true, true, document.defaultView,
64                           false, false, false, false, keyCode, keyCode);
65   target.dispatchEvent(event);
68 function verifyVisible(
69   /** QUnit.Assert */ assert,
70   /** HTMLElement*/ element,
71   /** boolean */ isVisible,
72   /** string= */ opt_name) {
73   var expectedVisibility = (isVisible) ? 'visible' : 'hidden';
74   assert.equal(element.hidden, !isVisible,
75               'Element ' + opt_name + ' should be ' + expectedVisibility);
78 QUnit.test(
79   'Clicking on the confirm button in the confirm dialog deletes the host',
80   function(assert) {
81   // Setup.
82   sinon.stub(remoting, 'setMode', function(/** remoting.AppMode */ mode) {
83     if (mode === remoting.AppMode.CONFIRM_HOST_DELETE) {
84       document.getElementById('confirm-host-delete').click();
85     }
86   });
88   // Invoke.
89   hostTableEntry_.element().querySelector('.delete-button').click();
91   // Verify.
92   sinon.assert.calledWith(onDelete_, hostTableEntry_);
94   // Cleanup.
95   $testStub(remoting.setMode).restore();
96 });
98 QUnit.test(
99   'Clicking on the cancel button in the confirm dialog cancels host deletion',
100   function(assert) {
101   // Setup.
102   sinon.stub(remoting, 'setMode', function(/** remoting.AppMode */ mode) {
103     if (mode === remoting.AppMode.CONFIRM_HOST_DELETE) {
104       document.getElementById('cancel-host-delete').click();
105     }
106   });
108   // Invoke.
109   hostTableEntry_.element().querySelector('.delete-button').click();
111   // Verify.
112   sinon.assert.notCalled(onDelete_);
114   // Cleanup.
115   $testStub(remoting.setMode).restore();
118 QUnit.test('Clicking on the rename button shows the input field.',
119     function(assert) {
120   // Invoke.
121   hostTableEntry_.element().querySelector('.rename-button').click();
123   // Verify.
124   var inputField =
125       hostTableEntry_.element().querySelector('.host-rename-input');
127   verifyVisible(assert, inputField, true, 'inputField');
128   assert.equal(document.activeElement, inputField);
131 QUnit.test('Host renaming is canceled on ESCAPE key.', function(assert) {
132   // Invoke.
133   var inputField =
134       hostTableEntry_.element().querySelector('.host-rename-input');
135   hostTableEntry_.element().querySelector('.rename-button').click();
137   // Verify.
138   verifyVisible(assert, inputField, true, 'inputField');
139   assert.equal(document.activeElement, inputField);
140   sendKeydown(inputField, 27 /* ESCAPE */);
141   verifyVisible(assert, inputField, false, 'inputField');
144 QUnit.test('Host renaming commits on ENTER.', function(assert) {
145   // Invoke.
146   var inputField =
147       hostTableEntry_.element().querySelector('.host-rename-input');
148   hostTableEntry_.element().querySelector('.rename-button').click();
149   inputField.value = 'Renamed Host';
150   sendKeydown(inputField, 13 /* ENTER */);
152   // Verify
153   verifyVisible(assert, inputField, false, 'inputField');
154   sinon.assert.called(onRename_);
155   assert.equal(hostTableEntry_.host.hostName, 'Renamed Host');
157   // Renaming shouldn't trigger a connection request.
158   sinon.assert.notCalled(onConnect_);
161 QUnit.test('HostTableEntry renders the host name correctly.', function(assert) {
162   var label = hostTableEntry_.element().querySelector('.host-name-label');
163   assert.equal(label.innerText, 'LocalHost');
166 QUnit.test('HostTableEntry renders an offline host correctly.',
167     function(assert) {
168   setHost('LocalHost', 'OFFLINE', 'INITIALIZATION_FAILED');
169   var label = hostTableEntry_.element().querySelector('.host-name-label');
170   assert.equal(label.innerText, 'OFFLINE');
171   assert.equal(label.title, 'OFFLINE_REASON_INITIALIZATION_FAILED');
174 QUnit.test('HostTableEntry renders an out-of-date host correctly',
175     function(assert) {
176   sinon.stub(remoting.Host, 'needsUpdate').returns(true);
177   setHost('LocalHost', 'ONLINE');
178   var warningOverlay =
179       hostTableEntry_.element().querySelector('.warning-overlay');
180   var label = hostTableEntry_.element().querySelector('.host-name-label');
181   verifyVisible(assert, warningOverlay, true, 'warning overlay');
182   assert.equal(label.innerText, 'UPDATE_REQUIRED');
185 QUnit.test('Clicking on an online host connects it', function(assert) {
186   hostTableEntry_.element().querySelector('.host-name-label').click();
187   sinon.assert.calledWith(onConnect_,
188                           encodeURIComponent(hostTableEntry_.host.hostId));
191 QUnit.test('Clicking on an offline host should be a no-op', function(assert) {
192   setHost('LocalHost', 'OFFLINE');
193   hostTableEntry_.element().querySelector('.host-name-label').click();
194   sinon.assert.notCalled(onConnect_);
197 QUnit.test('HostTableEntry handles host that is null', function(assert) {
198   hostTableEntry_.setHost(null);
199   hostTableEntry_.element().querySelector('.host-name-label').click();
200   sinon.assert.notCalled(onConnect_);
203 })();