blob: 694aa164d289d3c3bafa4faa571e62ef16ac3c18 [file] [log] [blame]
Andrew Bonventre4c944782015-11-18 16:31:18 -05001<!DOCTYPE html>
2<!--
3Copyright (C) 2015 The Android Open Source Project
4
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16-->
17
18<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
19<title>gr-diff-comment</title>
20
Urs Wolferf2f936f2016-01-25 19:26:30 +010021<script src="../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
22<script src="../bower_components/web-component-tester/browser.js"></script>
23<script src="../bower_components/page/page.js"></script>
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -050024<script src="../scripts/util.js"></script>
Andrew Bonventre4c944782015-11-18 16:31:18 -050025
Urs Wolferf2f936f2016-01-25 19:26:30 +010026<link rel="import" href="../bower_components/iron-test-helpers/iron-test-helpers.html">
Andrew Bonventre4c944782015-11-18 16:31:18 -050027<link rel="import" href="../elements/gr-diff-comment.html">
28
29<test-fixture id="basic">
30 <template>
31 <gr-diff-comment></gr-diff-comment>
32 </template>
33</test-fixture>
34
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -050035<test-fixture id="draft">
36 <template>
37 <gr-diff-comment draft="true"></gr-diff-comment>
38 </template>
39</test-fixture>
40
Andrew Bonventre4c944782015-11-18 16:31:18 -050041<script>
42 suite('gr-diff-comment tests', function() {
43 var element;
44 setup(function() {
45 element = fixture('basic');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -050046 element.comment = {
47 author: {
48 name: 'Mr. Peanutbutter',
49 email: 'tenn1sballchaser@aol.com',
50 },
51 id: 'baf0414d_60047215',
52 line: 5,
53 message: 'is this a crossover episode!?',
54 updated: '2015-12-08 19:48:33.843000000',
Andrew Bonventre1b3d9532015-12-20 19:13:45 -050055 };
Andrew Bonventre4c944782015-11-18 16:31:18 -050056 });
57
58 test('proper event fires on reply', function(done) {
Andrew Bonventre1b3d9532015-12-20 19:13:45 -050059 element.addEventListener('reply', function(e) {
Andrew Bonventreecc86172016-01-28 18:07:26 -050060 assert.ok(e.detail.comment);
Andrew Bonventre4c944782015-11-18 16:31:18 -050061 done();
62 });
63 MockInteractions.tap(element.$$('.reply'));
64 });
65
Andrew Bonventreecc86172016-01-28 18:07:26 -050066 test('proper event fires on quote', function(done) {
67 element.addEventListener('reply', function(e) {
68 assert.ok(e.detail.comment);
69 assert.isTrue(e.detail.quote);
70 done();
71 });
72 MockInteractions.tap(element.$$('.quote'));
73 });
74
Andrew Bonventre4c944782015-11-18 16:31:18 -050075 test('proper event fires on done', function(done) {
Andrew Bonventre1b3d9532015-12-20 19:13:45 -050076 element.addEventListener('done', function(e) {
Andrew Bonventre4c944782015-11-18 16:31:18 -050077 done();
78 });
79 MockInteractions.tap(element.$$('.done'));
80 });
81
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -050082 test('clicking on date link does not trigger nav', function() {
83 var showStub = sinon.stub(page, 'show');
84 var dateEl = element.$$('.date');
85 assert.ok(dateEl);
86 MockInteractions.tap(dateEl);
87 var dest = window.location.pathname + '#5';
88 assert(showStub.lastCall.calledWithExactly(dest, null, false),
89 'Should navigate to ' + dest + ' without triggering nav');
90 showStub.restore();
91 });
92 });
93
94 suite('gr-diff-comment draft tests', function() {
95 var element;
96 var server;
97
98 setup(function() {
99 element = fixture('draft');
100 element.changeNum = 42;
101 element.patchNum = 1;
102 element.comment = {
103 __draft: true,
104 __draftID: 'temp_draft_id',
105 path: '/path/to/file',
106 line: 5,
107 };
108
109 server = sinon.fakeServer.create();
110 server.respondWith(
111 'PUT',
112 '/changes/42/revisions/1/drafts',
113 [
114 201,
Urs Wolfer26caed72016-02-02 21:02:42 +0100115 {'Content-Type': 'application/json'},
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500116 ')]}\'\n{' +
117 '"id": "baf0414d_40572e03",' +
118 '"path": "/path/to/file",' +
119 '"line": 5,' +
120 '"updated": "2015-12-08 21:52:36.177000000",' +
121 '"message": "created!"' +
122 '}'
123 ]
124 );
125
126 server.respondWith(
127 'PUT',
128 /\/changes\/42\/revisions\/1\/drafts\/.+/,
129 [
130 200,
Urs Wolfer26caed72016-02-02 21:02:42 +0100131 {'Content-Type': 'application/json'},
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500132 ')]}\'\n{' +
133 '"id": "baf0414d_40572e03",' +
134 '"path": "/path/to/file",' +
135 '"line": 5,' +
136 '"updated": "2015-12-08 21:52:36.177000000",' +
137 '"message": "saved!"' +
138 '}'
139 ]
140 );
141 });
142
143 teardown(function() {
144 server.restore();
145 });
146
147 function isVisible(el) {
148 assert.ok(el);
149 return getComputedStyle(el).getPropertyValue('display') != 'none';
150 }
151
152 test('button visibility states', function() {
Andrew Bonventre1b3d9532015-12-20 19:13:45 -0500153 element.showActions = false;
154 assert.isTrue(element.$$('.actions').hasAttribute('hidden'));
155 element.showActions = true;
156 assert.isFalse(element.$$('.actions').hasAttribute('hidden'));
157
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500158 element.draft = true;
159 assert.isTrue(isVisible(element.$$('.edit')), 'edit is visible');
160 assert.isTrue(isVisible(element.$$('.discard')), 'discard is visible');
161 assert.isFalse(isVisible(element.$$('.save')), 'save is not visible');
162 assert.isFalse(isVisible(element.$$('.cancel')), 'cancel is not visible');
163 assert.isFalse(isVisible(element.$$('.reply')), 'reply is not visible');
Andrew Bonventreecc86172016-01-28 18:07:26 -0500164 assert.isFalse(isVisible(element.$$('.quote')), 'quote is not visible');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500165 assert.isFalse(isVisible(element.$$('.done')), 'done is not visible');
166
167 element.editing = true;
Urs Wolfer26caed72016-02-02 21:02:42 +0100168 assert.isFalse(isVisible(element.$$('.edit')), 'edit is not visible');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500169 assert.isTrue(isVisible(element.$$('.discard')), 'discard is visible');
170 assert.isTrue(isVisible(element.$$('.save')), 'save is visible');
Andrew Bonventreecc86172016-01-28 18:07:26 -0500171 assert.isFalse(isVisible(element.$$('.cancel')), 'cancel is visible');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500172 assert.isFalse(isVisible(element.$$('.reply')), 'reply is not visible');
Andrew Bonventreecc86172016-01-28 18:07:26 -0500173 assert.isFalse(isVisible(element.$$('.quote')), 'quote is not visible');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500174 assert.isFalse(isVisible(element.$$('.done')), 'done is not visible');
175
Urs Wolfer26caed72016-02-02 21:02:42 +0100176 element.draft = false;
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500177 element.editing = false;
Urs Wolfer26caed72016-02-02 21:02:42 +0100178 assert.isFalse(isVisible(element.$$('.edit')), 'edit is not visible');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500179 assert.isFalse(isVisible(element.$$('.discard')),
180 'discard is not visible');
181 assert.isFalse(isVisible(element.$$('.save')), 'save is not visible');
182 assert.isFalse(isVisible(element.$$('.cancel')), 'cancel is not visible');
Andrew Bonventreecc86172016-01-28 18:07:26 -0500183 assert.isTrue(isVisible(element.$$('.reply')), 'reply is visible');
184 assert.isTrue(isVisible(element.$$('.quote')), 'quote is visible');
185 assert.isTrue(isVisible(element.$$('.done')), 'done is visible');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500186
Andrew Bonventreecc86172016-01-28 18:07:26 -0500187 element.comment.id = 'foo';
188 element.editing = true;
189 assert.isTrue(isVisible(element.$$('.cancel')), 'cancel is visible');
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500190 });
191
192 test('draft creation/cancelation', function(done) {
193 assert.isFalse(element.editing);
194 MockInteractions.tap(element.$$('.edit'));
195 assert.isTrue(element.editing);
196
197 element._editDraft = '';
198 // Save should be disabled on an empty message.
199 var disabled = element.$$('.save').hasAttribute('disabled');
200 assert.isTrue(disabled, 'save button should be disabled.');
Urs Wolfer26caed72016-02-02 21:02:42 +0100201 element._editDraft = ' ';
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500202 disabled = element.$$('.save').hasAttribute('disabled');
203 assert.isTrue(disabled, 'save button should be disabled.');
204
205 var numDiscardEvents = 0;
Andrew Bonventre1b3d9532015-12-20 19:13:45 -0500206 element.addEventListener('discard', function(e) {
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500207 numDiscardEvents++;
Andrew Bonventre593db0f2016-01-16 13:35:57 -0500208 if (numDiscardEvents == 3) {
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500209 done();
210 }
211 });
212 MockInteractions.tap(element.$$('.cancel'));
213 MockInteractions.tap(element.$$('.discard'));
Andrew Bonventre7523c332016-01-18 14:24:33 -0500214 MockInteractions.pressAndReleaseKeyOn(element.$.editTextarea, 27); // esc
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500215 });
216
217 test('draft saving/editing', function(done) {
218 element.draft = true;
219 MockInteractions.tap(element.$$('.edit'));
220 element._editDraft = 'good news, everyone!';
221 MockInteractions.tap(element.$$('.save'));
222 assert.isTrue(element.disabled,
223 'Element should be disabled when creating draft.');
224
225 server.respond();
226
227 element._xhrPromise.then(function(req) {
228 assert.isFalse(element.disabled,
229 'Element should be enabled when done creating draft.');
230 assert.equal(req.status, 201);
231 assert.equal(req.url, '/changes/42/revisions/1/drafts');
232 assert.equal(req.response.message, 'created!');
233 assert.isFalse(element.editing);
234 }).then(function() {
235 MockInteractions.tap(element.$$('.edit'));
236 element._editDraft = 'You’ll be delivering a package to Chapek 9, a ' +
237 'world where humans are killed on sight.';
238 MockInteractions.tap(element.$$('.save'));
239 assert.isTrue(element.disabled,
240 'Element should be disabled when updating draft.');
241 server.respond();
242
243 element._xhrPromise.then(function(req) {
244 assert.isFalse(element.disabled,
245 'Element should be enabled when done updating draft.');
246 assert.equal(req.status, 200);
247 assert.equal(req.url,
248 '/changes/42/revisions/1/drafts/baf0414d_40572e03');
249 assert.equal(req.response.message, 'saved!');
250 assert.isFalse(element.editing);
251 done();
252 });
253 });
254 });
255
Andrew Bonventrec3ef3e42015-12-02 11:40:14 -0500256 test('clicking on date link does not trigger nav', function() {
257 var showStub = sinon.stub(page, 'show');
258 var dateEl = element.$$('.date');
259 assert.ok(dateEl);
260 MockInteractions.tap(dateEl);
261 var dest = window.location.pathname + '#5';
262 assert(showStub.lastCall.calledWithExactly(dest, null, false),
263 'Should navigate to ' + dest + ' without triggering nav');
264 showStub.restore();
265 });
Andrew Bonventre4c944782015-11-18 16:31:18 -0500266 });
267</script>