@@ -0,0 +1,183 @@
1+/*
2+ * Copyright 2014 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 Ubuntu.Components 0.1
20+import "../../../../qml/Dash/Previews"
21+import Unity.Test 0.1 as UT
22+
23+Rectangle {
24+ id: root
25+ width: units.gu(40)
26+ height: units.gu(80)
27+ color: Theme.palette.selected.background
28+
29+ property real validInputRating: 1
30+ property real invalidInputRating: -1
31+ property string validInputText: "Great!"
32+ property string invalidInputText: ""
33+
34+ property var triggeredDataBoth: { "rating": validInputRating, "review": validInputText, "author": null }
35+ property var triggeredDataRatingOnly: { "rating": validInputRating, "review": invalidInputText, "author": null }
36+ property var triggeredDataReviewOnly: { "rating": invalidInputRating, "review": validInputText, "author": null }
37+
38+ property var widgetDataBoth: { "visible": "both", "required": "both" }
39+ property var widgetDataRating: { "visible": "rating", "required": "rating" }
40+ property var widgetDataRatingBroken: { "visible": "rating", "required": "review" }
41+ property var widgetDataReview: { "visible": "review", "required": "review" }
42+ property var widgetDataReviewBroken: { "visible": "review", "required": "rating" }
43+
44+ property var widgetDataNewLabels: { "visible": "both", "required": "both", "rating-label": "TestRatingLabel", "review-label": "TestReviewLabel", "submit-label": "TestSubmitLabel" }
45+
46+ PreviewRating {
47+ id: previewRating
48+ anchors.left: parent.left
49+ anchors.right: parent.right
50+ widgetData: widgetDataBoth
51+ widgetId: "previewRating"
52+ }
53+
54+ SignalSpy {
55+ id: spy
56+ signalName: "triggered"
57+ }
58+
59+ UT.UnityTestCase {
60+ name: "PreviewRatingTest"
61+ when: windowShown
62+
63+ property var rating: findChild(previewRating, "rating")
64+ property var reviewTextArea: findChild(previewRating, "reviewTextArea")
65+ property var submitButton: findChild(previewRating, "submitButton")
66+
67+ function init() {
68+ rating.value = -1;
69+ reviewTextArea.text = "";
70+ }
71+
72+ function test_labels() {
73+ var ratingLabel = findChild(previewRating, "ratingLabel");
74+ var reviewLabel = findChild(previewRating, "reviewLabel");
75+
76+ previewRating.widgetData = widgetDataNewLabels;
77+ compare(ratingLabel.text, widgetDataNewLabels["rating-label"]);
78+ compare(reviewLabel.text, widgetDataNewLabels["review-label"]);
79+ compare(submitButton.text, widgetDataNewLabels["submit-label"]);
80+ }
81+
82+ function test_submit_and_visibility_data() {
83+ return [
84+ {tag: "both, null review", widgetData: widgetDataBoth, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
85+ {tag: "both, rating-only review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
86+ {tag: "both, review-only review", widgetData: widgetDataBoth, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
87+ {tag: "both, complete review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: validInputText, emitted: true},
88+ {tag: "rating, null review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
89+ {tag: "rating, rating-only review", widgetData: widgetDataRating, inputRating: validInputRating, inputText: invalidInputText, emitted: true},
90+ {tag: "rating, review-only review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
91+ {tag: "rating, complete review", widgetData: widgetDataRating, inputRating: validInputRating, inputText: validInputText, emitted: true},
92+ {tag: "rating broken, null review", widgetData: widgetDataRatingBroken, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
93+ {tag: "rating broken, rating-only review", widgetData: widgetDataRatingBroken, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
94+ {tag: "rating broken, review-only review", widgetData: widgetDataRatingBroken, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
95+ {tag: "rating broken, complete review", widgetData: widgetDataRatingBroken, inputRating: validInputRating, inputText: validInputText, emitted: false},
96+ {tag: "review, null review", widgetData: widgetDataReview, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
97+ {tag: "review, rating-only review", widgetData: widgetDataReview, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
98+ {tag: "review, review-only review", widgetData: widgetDataReview, inputRating: invalidInputRating, inputText: validInputText, emitted: true},
99+ {tag: "review, complete review", widgetData: widgetDataReview, inputRating: validInputRating, inputText: validInputText, emitted: true},
100+ {tag: "review broken, null review", widgetData: widgetDataReviewBroken, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
101+ {tag: "review broken, rating-only review", widgetData: widgetDataReviewBroken, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
102+ {tag: "review broken, review-only review", widgetData: widgetDataReviewBroken, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
103+ {tag: "review broken, complete review", widgetData: widgetDataReviewBroken, inputRating: validInputRating, inputText: validInputText, emitted: false},
104+ ];
105+ }
106+
107+ function test_submit_and_visibility(data) {
108+ spy.clear();
109+ spy.target = previewRating;
110+
111+ previewRating.widgetData = data.widgetData;
112+
113+ if (data.widgetData["visible"] !== "review") {
114+ verify(rating.visible === true);
115+
116+ rating.value = data.inputRating;
117+ if (data.widgetData["required"] !== "rating" || data.inputRating < 0) {
118+ compare(spy.count, 0);
119+ } else {
120+ compare(spy.count, 1);
121+ }
122+ } else {
123+ verify(rating.visible === false);
124+ }
125+
126+ if (data.widgetData["visible"] !== "rating") {
127+ verify(reviewTextArea.visible === true);
128+
129+ reviewTextArea.text = data.inputText;
130+ mouseClick(submitButton, submitButton.width / 2, submitButton.height / 2);
131+ switch (data.widgetData["required"]) {
132+ case "rating": compare(spy.count, 0); break;
133+ case "both":
134+ default: {
135+ if (data.inputRating < 0 || data.inputText === "") {
136+ compare(spy.count, 0); break;
137+ }
138+ }
139+ case "review": {
140+ if (data.inputText === "") {
141+ compare(spy.count, 0); break;
142+ } else {
143+ compare(spy.count, 1); break;
144+ }
145+ }
146+ }
147+ } else {
148+ verify(reviewTextArea.visible === false);
149+ }
150+
151+ compare(spy.count === 1, data.emitted);
152+ }
153+
154+ function test_triggered_data() {
155+ return [
156+ {tag: "complete review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: validInputText, triggeredData: triggeredDataBoth},
157+ {tag: "rating-only review", widgetData: widgetDataRating, inputRating: validInputRating, inputText: invalidInputText, triggeredData: triggeredDataRatingOnly},
158+ {tag: "review-only review", widgetData: widgetDataReview, inputRating: invalidInputRating, inputText: validInputText, triggeredData: triggeredDataReviewOnly}
159+ ];
160+ }
161+
162+ function test_triggered(data) {
163+ spy.clear();
164+ spy.target = previewRating;
165+
166+ previewRating.widgetData = data.widgetData;
167+
168+ if (data.inputRating > 0) rating.value = data.inputRating;
169+ if (data.inputText !== "") {
170+ reviewTextArea.text = data.inputText;
171+ mouseClick(submitButton, submitButton.width / 2, submitButton.height / 2);
172+ }
173+
174+ compare(spy.count, 1);
175+ var args = spy.signalArguments[0];
176+ compare(args[0], previewRating.widgetId);
177+ compare(args[1], data.widgetData["required"]);
178+ compare(args[2]["rating"], data.triggeredData["rating"]);
179+ compare(args[2]["review"], data.triggeredData["review"]);
180+ verify(args[2]["author"]); // Just verifying it exists now
181+ }
182+ }
183+}