@@ -22,6 +22,7 @@ import Ubuntu.Components 1.3
2222import Ubuntu.Components.ListItems 1.3
2323import Ubuntu.Telephony 0.1 as Telephony
2424import Unity.Application 0.1
25+import Unity.Notifications 1.0
2526import Unity.Test 0.1 as UT
2627import Utils 0.1
2728
@@ -55,6 +56,33 @@ Rectangle {
5556 phoneNumber: "+447812221111"
5657 }
5758
59+ Component {
60+ id: mockNotification
61+ QtObject {}
62+ }
63+
64+ ListModel {
65+ id: mockNotificationsModel
66+
67+ function getRaw(id) {
68+ return mockNotification.createObject(mockNotificationsModel)
69+ }
70+ }
71+
72+ function addNotification() {
73+ var n = {
74+ type: Notification.Confirmation,
75+ hints: {},
76+ summary: "",
77+ body: "",
78+ icon: "",
79+ secondaryIcon: "",
80+ actions: []
81+ };
82+
83+ mockNotificationsModel.append(n);
84+ }
85+
5886 Component.onCompleted: {
5987 // must set the mock mode before loading the Shell
6088 LightDM.Greeter.mockMode = "single-pin";
@@ -262,6 +290,7 @@ Rectangle {
262290 // reload our test subject to get it in a fresh state once again
263291 shellLoader.active = true;
264292
293+ mockNotificationsModel.clear();
265294 tryCompare(shellLoader, "status", Loader.Ready);
266295 removeTimeConstraintsFromDirectionalDragAreas(shellLoader.item);
267296 }
@@ -690,24 +719,59 @@ Rectangle {
690719 verify(tutorialLeft.shown);
691720 }
692721
693− function test_oskPreventsTutorial() {
694− var surface = SurfaceManager.inputMethodSurface;
695− var inputMethod = findInvisibleChild(shell, "inputMethod");
722+ function test_oskDelaysTutorial() {
723+ var tutorial = findChild(shell, "tutorial");
724+ verify(!tutorial.delayed);
696725
697− AccountsService.demoEdges = false;
698− surface.setState(Mir.RestoredState);
699− tryCompare(inputMethod, "state", "shown");
726+ SurfaceManager.inputMethodSurface.setState(Mir.RestoredState);
700727
728+ tryCompare(tutorial, "delayed", true);
729+ }
730+
731+ function test_notificationDelaysTutorial() {
701732 var tutorial = findChild(shell, "tutorial");
702− tryCompare(tutorial, "keyboardVisible", true);
733+ verify(!tutorial.delayed);
703734
704− AccountsService.demoEdges = true;
705− var tutorialLeft = findChild(shell, "tutorialLeft");
706− verify(!tutorialLeft.shown);
735+ var notifications = findChild(shell, "notificationList");
736+ notifications.model = mockNotificationsModel;
737+ addNotification();
707738
708− surface.setState(Mir.MinimizedState);
709− tryCompare(inputMethod, "state", "hidden");
710− tryCompare(tutorialLeft, "shown", false);
739+ tryCompare(tutorial, "delayed", true);
740+ }
741+
742+ function test_dialogDelaysTutorial() {
743+ var tutorial = findChild(shell, "tutorial");
744+ verify(!tutorial.delayed);
745+
746+ var dialogs = findChild(shell, "dialogs");
747+ dialogs.showPowerDialog();
748+
749+ verify(tutorial.delayed);
750+ }
751+
752+ function test_delayedTutorial() {
753+ var tutorial = findChild(shell, "tutorial");
754+ var tutorialTop = findChild(tutorial, "tutorialTop");
755+ var tutorialTopTimer = findChild(tutorialTop, "tutorialTopTimer");
756+
757+ // Get top tutorial ready
758+ AccountsService.demoEdgesCompleted = ["left"];
759+ verify(tutorialTop.isReady);
760+ verify(tutorialTopTimer.running);
761+
762+ // Confirm that we become unready when delayed, but timer still goes
763+ tutorial.delayed = true;
764+ verify(!tutorialTop.isReady);
765+ verify(tutorialTopTimer.running);
766+
767+ // Confirm that we don't open the tutorial when delayed
768+ tutorialTopTimer.interval = 1;
769+ wait(5);
770+ verify(!tutorialTop.shown);
771+
772+ // Confirm we go back to normal when undelayed
773+ tutorial.delayed = false;
774+ tryCompare(tutorialTop, "shown", true);
711775 }
712776
713777 function test_accountsServiceSettings() {