~brendan-donegan/unity8/shellRotationInvestigation

« back to all changes in this revision

Viewing changes to tests/qmltests/Greeter/tst_Greeter.qml

  • Committer: Mirco Müller
  • Date: 2015-03-06 14:22:41 UTC
  • mfrom: (1589.1.1 unity8)
  • Revision ID: mirco.mueller@ubuntu.com-20150306142241-wse3a2j2yghqfwoh
Merged kgunn's conflict-resolving branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright 2015 Canonical Ltd.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; version 3.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 */
 
16
 
 
17
import QtQuick 2.0
 
18
import QtTest 1.0
 
19
import ".."
 
20
import "../../../qml/Greeter"
 
21
import Ubuntu.Components 0.1
 
22
import AccountsService 0.1
 
23
import LightDM 0.1 as LightDM
 
24
import Unity.Test 0.1 as UT
 
25
 
 
26
Item {
 
27
    width: units.gu(120)
 
28
    height: units.gu(80)
 
29
 
 
30
    property url defaultBackground: Qt.resolvedUrl("../../../qml/graphics/tablet_background.jpg")
 
31
 
 
32
    Component.onCompleted: {
 
33
        // set the mock mode before loading
 
34
        LightDM.Greeter.mockMode = "full";
 
35
        LightDM.Users.mockMode = "full";
 
36
        loader.active = true;
 
37
    }
 
38
 
 
39
    Loader {
 
40
        id: loader
 
41
 
 
42
        active: false
 
43
        anchors.fill: parent
 
44
 
 
45
        property bool itemDestroyed: false
 
46
        sourceComponent: Component {
 
47
            Greeter {
 
48
                width: loader.width
 
49
                height: loader.height
 
50
                background: defaultBackground
 
51
                viewSource: Qt.resolvedUrl("TestView.qml")
 
52
 
 
53
                Component.onDestruction: {
 
54
                    loader.itemDestroyed = true;
 
55
                }
 
56
            }
 
57
        }
 
58
    }
 
59
 
 
60
    SignalSpy {
 
61
        id: teaseSpy
 
62
        target: loader.item
 
63
        signalName: "tease"
 
64
    }
 
65
 
 
66
    SignalSpy {
 
67
        id: sessionStartedSpy
 
68
        target: loader.item
 
69
        signalName: "sessionStarted"
 
70
    }
 
71
 
 
72
    SignalSpy {
 
73
        id: emergencyCallSpy
 
74
        target: loader.item
 
75
        signalName: "emergencyCall"
 
76
    }
 
77
 
 
78
    UT.UnityTestCase {
 
79
        id: testCase
 
80
        name: "Greeter"
 
81
        when: windowShown
 
82
 
 
83
        property Item greeter: loader.status === Loader.Ready ? loader.item : null
 
84
        property Item view
 
85
 
 
86
        SignalSpy {
 
87
            id: viewShowMessageSpy
 
88
            target: testCase.view
 
89
            signalName: "_showMessageCalled"
 
90
        }
 
91
 
 
92
        SignalSpy {
 
93
            id: viewShowPromptSpy
 
94
            target: testCase.view
 
95
            signalName: "_showPromptCalled"
 
96
        }
 
97
 
 
98
        SignalSpy {
 
99
            id: viewShowLastChanceSpy
 
100
            target: testCase.view
 
101
            signalName: "_showLastChanceCalled"
 
102
        }
 
103
 
 
104
        SignalSpy {
 
105
            id: viewHideSpy
 
106
            target: testCase.view
 
107
            signalName: "_hideCalled"
 
108
        }
 
109
 
 
110
        SignalSpy {
 
111
            id: viewAuthenticationSucceededSpy
 
112
            target: testCase.view
 
113
            signalName: "_notifyAuthenticationSucceededCalled"
 
114
        }
 
115
 
 
116
        SignalSpy {
 
117
            id: viewAuthenticationFailedSpy
 
118
            target: testCase.view
 
119
            signalName: "_notifyAuthenticationFailedCalled"
 
120
        }
 
121
 
 
122
        SignalSpy {
 
123
            id: viewResetSpy
 
124
            target: testCase.view
 
125
            signalName: "_resetCalled"
 
126
        }
 
127
 
 
128
        SignalSpy {
 
129
            id: viewTryToUnlockSpy
 
130
            target: testCase.view
 
131
            signalName: "_tryToUnlockCalled"
 
132
        }
 
133
 
 
134
        function init() {
 
135
            teaseSpy.clear();
 
136
            sessionStartedSpy.clear();
 
137
            emergencyCallSpy.clear();
 
138
            viewShowMessageSpy.clear();
 
139
            viewShowPromptSpy.clear();
 
140
            viewShowLastChanceSpy.clear();
 
141
            viewHideSpy.clear();
 
142
            viewAuthenticationSucceededSpy.clear();
 
143
            viewAuthenticationFailedSpy.clear();
 
144
            viewResetSpy.clear();
 
145
            viewTryToUnlockSpy.clear();
 
146
            tryCompare(greeter, "waiting", false);
 
147
            view = findChild(greeter, "testView");
 
148
            verifySelected(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
 
149
        }
 
150
 
 
151
        function cleanup() {
 
152
            loader.itemDestroyed = false;
 
153
            loader.active = false;
 
154
            tryCompare(loader, "status", Loader.Null);
 
155
            tryCompare(loader, "item", null);
 
156
            tryCompare(loader, "itemDestroyed", true);
 
157
            loader.active = true;
 
158
            tryCompare(loader, "status", Loader.Ready);
 
159
            removeTimeConstraintsFromDirectionalDragAreas(loader.item);
 
160
        }
 
161
 
 
162
        function getIndexOf(name) {
 
163
            for (var i = 0; i < LightDM.Users.count; i++) {
 
164
                if (name === LightDM.Users.data(i, LightDM.UserRoles.NameRole)) {
 
165
                    return i;
 
166
                }
 
167
            }
 
168
            fail("Didn't find name")
 
169
            return -1;
 
170
        }
 
171
 
 
172
        function selectUser(name) {
 
173
            var i = getIndexOf(name);
 
174
            view.selected(i);
 
175
            verifySelected(name);
 
176
            return i;
 
177
        }
 
178
 
 
179
        function verifySelected(name) {
 
180
            var i = getIndexOf(name);
 
181
            compare(view.currentIndex, i);
 
182
            compare(AccountsService.user, name);
 
183
            compare(LightDM.Greeter.authenticationUser, name);
 
184
        }
 
185
 
 
186
        function verifyLoggedIn() {
 
187
            tryCompare(sessionStartedSpy, "count", 1);
 
188
            verify(viewAuthenticationSucceededSpy.count > 0);
 
189
            compare(LightDM.Greeter.authenticated, true);
 
190
            compare(greeter.shown, false);
 
191
        }
 
192
 
 
193
        function test_unlockPass() {
 
194
            selectUser("has-password");
 
195
            tryCompare(viewShowPromptSpy, "count", 1);
 
196
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
197
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
198
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
199
 
 
200
            view.responded("password");
 
201
            verifyLoggedIn();
 
202
        }
 
203
 
 
204
        function test_unlockFail() {
 
205
            selectUser("has-password");
 
206
            tryCompare(viewShowPromptSpy, "count", 1);
 
207
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
208
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
209
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
210
 
 
211
            view.responded("wr0ng p4ssw0rd");
 
212
            tryCompare(viewAuthenticationFailedSpy, "count", 1);
 
213
 
 
214
            tryCompare(viewShowPromptSpy, "count", 2);
 
215
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
216
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
217
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
218
        }
 
219
 
 
220
        function test_promptless() {
 
221
            selectUser("no-password");
 
222
            tryCompare(viewAuthenticationSucceededSpy, "count", 1);
 
223
            compare(sessionStartedSpy.count, 1);
 
224
            compare(viewShowPromptSpy.count, 0);
 
225
            compare(viewHideSpy.count, 0);
 
226
            compare(view.locked, false);
 
227
        }
 
228
 
 
229
        function test_twoFactorPass() {
 
230
            selectUser("two-factor");
 
231
            tryCompare(viewShowPromptSpy, "count", 1);
 
232
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
233
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
234
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
235
 
 
236
            view.responded("password");
 
237
            tryCompare(viewShowPromptSpy, "count", 2);
 
238
            compare(viewShowPromptSpy.signalArguments[1][0], "otp");
 
239
            compare(viewShowPromptSpy.signalArguments[1][1], false);
 
240
            compare(viewShowPromptSpy.signalArguments[1][2], false);
 
241
 
 
242
            view.responded("otp");
 
243
            verifyLoggedIn();
 
244
        }
 
245
 
 
246
        function test_twoFactorFailOnFirst() {
 
247
            selectUser("two-factor");
 
248
            tryCompare(viewShowPromptSpy, "count", 1);
 
249
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
250
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
251
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
252
 
 
253
            view.responded("wr0ng p4ssw0rd");
 
254
            tryCompare(viewAuthenticationFailedSpy, "count", 1);
 
255
 
 
256
            tryCompare(viewShowPromptSpy, "count", 2);
 
257
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
258
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
259
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
260
        }
 
261
 
 
262
        function test_twoFactorFailOnSecond() {
 
263
            selectUser("two-factor");
 
264
            tryCompare(viewShowPromptSpy, "count", 1);
 
265
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
266
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
267
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
268
 
 
269
            view.responded("password");
 
270
            tryCompare(viewShowPromptSpy, "count", 2);
 
271
            compare(viewShowPromptSpy.signalArguments[1][0], "otp");
 
272
            compare(viewShowPromptSpy.signalArguments[1][1], false);
 
273
            compare(viewShowPromptSpy.signalArguments[1][2], false);
 
274
 
 
275
            view.responded("wr0ng p4ssw0rd");
 
276
            tryCompare(viewAuthenticationFailedSpy, "count", 1);
 
277
 
 
278
            tryCompare(viewShowPromptSpy, "count", 3);
 
279
            compare(viewShowPromptSpy.signalArguments[0][0], "Password");
 
280
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
281
            compare(viewShowPromptSpy.signalArguments[0][2], true);
 
282
        }
 
283
 
 
284
        function test_htmlInfoPrompt() {
 
285
            selectUser("html-info-prompt");
 
286
            tryCompare(viewShowPromptSpy, "count", 1);
 
287
            compare(viewShowMessageSpy.count, 1);
 
288
            compare(viewShowMessageSpy.signalArguments[0][0], "&lt;b&gt;&amp;&lt;/b&gt;");
 
289
        }
 
290
 
 
291
        function test_multiInfoPrompt() {
 
292
            selectUser("multi-info-prompt");
 
293
            tryCompare(viewShowPromptSpy, "count", 1);
 
294
            compare(viewShowMessageSpy.count, 3);
 
295
            compare(viewShowMessageSpy.signalArguments[0][0], "Welcome to Unity Greeter");
 
296
            compare(viewShowMessageSpy.signalArguments[1][0], "<font color=\"#df382c\">This is an error</font>");
 
297
            compare(viewShowMessageSpy.signalArguments[2][0], "You should have seen three messages");
 
298
        }
 
299
 
 
300
        function test_waiting() {
 
301
            // Make sure we unset 'waiting' on prompt
 
302
            selectUser("has-password");
 
303
            compare(greeter.waiting, true);
 
304
            tryCompare(greeter, "waiting", false);
 
305
 
 
306
            // Make sure we unset 'waiting' on authentication
 
307
            selectUser("no-password");
 
308
            compare(greeter.waiting, true);
 
309
            tryCompare(greeter, "waiting", false);
 
310
        }
 
311
 
 
312
        function test_locked() {
 
313
            selectUser("has-password");
 
314
            compare(view.locked, true);
 
315
 
 
316
            LightDM.Greeter.active = false;
 
317
            compare(view.locked, false);
 
318
            LightDM.Greeter.active = true;
 
319
 
 
320
            greeter.forcedUnlock = true;
 
321
            compare(view.locked, false);
 
322
            greeter.forcedUnlock = false;
 
323
 
 
324
            selectUser("no-password");
 
325
            tryCompare(view, "locked", false);
 
326
            selectUser("has-password");
 
327
        }
 
328
 
 
329
        function test_fullyShown() {
 
330
            compare(greeter.fullyShown, true);
 
331
            view.hide();
 
332
            compare(greeter.fullyShown, false);
 
333
        }
 
334
 
 
335
        function test_alphanumeric() {
 
336
            selectUser("has-password");
 
337
            compare(view.alphanumeric, true);
 
338
            selectUser("has-pin");
 
339
            compare(view.alphanumeric, false);
 
340
        }
 
341
 
 
342
        function test_background() {
 
343
            greeter.background = "testing";
 
344
            compare(view.background, Qt.resolvedUrl("testing"));
 
345
        }
 
346
 
 
347
        function test_notifyAboutToFocusApp() {
 
348
            greeter.notifyAboutToFocusApp("fake-app");
 
349
            compare(viewTryToUnlockSpy.count, 1);
 
350
            compare(viewTryToUnlockSpy.signalArguments[0][0], false);
 
351
        }
 
352
 
 
353
        function test_notifyShowingDashFromDrag() {
 
354
            compare(greeter.notifyShowingDashFromDrag("fake-app"), true);
 
355
            compare(viewTryToUnlockSpy.count, 1);
 
356
            compare(viewTryToUnlockSpy.signalArguments[0][0], true);
 
357
        }
 
358
 
 
359
        function test_dragHandleLeftMargin() {
 
360
            compare(view.dragHandleLeftMargin, 0);
 
361
            greeter.dragHandleLeftMargin = 5;
 
362
            compare(view.dragHandleLeftMargin, 5);
 
363
        }
 
364
 
 
365
        function test_launcherOffset() {
 
366
            compare(view.launcherOffset, 0);
 
367
            greeter.launcherOffset = 5;
 
368
            tryCompare(view, "launcherOffset", 5);
 
369
        }
 
370
 
 
371
        function test_laucherOffsetAnimation() {
 
372
            // Our logic for smoothing launcherOffset when it suddenly goes to
 
373
            // zero is a bit complicated.  Let's just make sure it works here.
 
374
 
 
375
            launcherOffsetWatcher.target = view;
 
376
 
 
377
            // should follow immediately
 
378
            launcherOffsetWatcher.values = [];
 
379
            greeter.launcherOffset = 100;
 
380
            compare(view.launcherOffset, 100);
 
381
            compare(launcherOffsetWatcher.values.length, 1);
 
382
 
 
383
            // should interpolate values until it reaches 0
 
384
            launcherOffsetWatcher.values = [];
 
385
            greeter.launcherOffset = 0;
 
386
            tryCompare(view, "launcherOffset", 0);
 
387
            verify(launcherOffsetWatcher.values.length > 1);
 
388
            for (var i = 0; i < launcherOffsetWatcher.values.length - 1; ++i) {
 
389
                verify(launcherOffsetWatcher.values[i] > 0.0);
 
390
                verify(launcherOffsetWatcher.values[i] < 100.0);
 
391
            }
 
392
        }
 
393
        Connections {
 
394
            id: launcherOffsetWatcher
 
395
            property var values: []
 
396
            onLauncherOffsetChanged: {
 
397
                values.push(target.launcherOffset);
 
398
            }
 
399
        }
 
400
 
 
401
        function test_backgroundTopMargin() {
 
402
            compare(view.backgroundTopMargin, 0);
 
403
            greeter.y = 5;
 
404
            compare(view.backgroundTopMargin, -5);
 
405
        }
 
406
 
 
407
        function test_differentPrompt() {
 
408
            selectUser("different-prompt");
 
409
            tryCompare(viewShowPromptSpy, "count", 1);
 
410
            compare(viewShowPromptSpy.signalArguments[0][0], "Secret word");
 
411
            compare(viewShowPromptSpy.signalArguments[0][1], true);
 
412
            compare(viewShowPromptSpy.signalArguments[0][2], false);
 
413
        }
 
414
 
 
415
        function test_authError() {
 
416
            selectUser("auth-error");
 
417
            tryCompare(viewAuthenticationFailedSpy, "count", 1);
 
418
            compare(viewShowPromptSpy.count, 0);
 
419
            compare(view.locked, true);
 
420
        }
 
421
 
 
422
        function test_statsWelcomeScreen() {
 
423
            // Test logic in greeter that turns statsWelcomeScreen setting into infographic changes
 
424
            selectUser("has-password");
 
425
            compare(LightDM.Infographic.username, "has-password");
 
426
            AccountsService.statsWelcomeScreen = false;
 
427
            compare(LightDM.Infographic.username, "");
 
428
            AccountsService.statsWelcomeScreen = true;
 
429
            compare(LightDM.Infographic.username, "has-password");
 
430
        }
 
431
 
 
432
        function test_dbusRequestAuthenticationUser() {
 
433
            selectUser("no-password");
 
434
            LightDM.Greeter.requestAuthenticationUser("has-password");
 
435
            verifySelected("has-password");
 
436
        }
 
437
 
 
438
        function test_dbusHideGreeter() {
 
439
            compare(view.required, true);
 
440
            LightDM.Greeter.hideGreeter();
 
441
            compare(view.required, false);
 
442
            compare(greeter.required, false);
 
443
        }
 
444
 
 
445
        function test_dbusShowGreeterFromHiddenState() {
 
446
            greeter.hide();
 
447
            compare(greeter.required, false);
 
448
 
 
449
            LightDM.Greeter.showGreeter();
 
450
            compare(greeter.required, true);
 
451
            compare(greeter.fullyShown, true);
 
452
            view = findChild(greeter, "testView");
 
453
            compare(view.required, true);
 
454
 
 
455
            // Can't test some of the stuff called on 'view' here because
 
456
            // the view was torn down and created again.  So the spies missed
 
457
            // the good stuff while it down.  See next test for more.
 
458
        }
 
459
 
 
460
        function test_dbusShowGreeterFromShownState() {
 
461
            selectUser("has-password");
 
462
            compare(viewResetSpy.count, 1);
 
463
            tryCompare(viewShowPromptSpy, "count", 1);
 
464
 
 
465
            viewResetSpy.clear();
 
466
            viewShowPromptSpy.clear();
 
467
 
 
468
            LightDM.Greeter.showGreeter();
 
469
            compare(viewResetSpy.count, 1);
 
470
        }
 
471
    }
 
472
}