Merge lp:~ralsina/ubuntuone-windows-installer/cloud-to-cloud into lp:ubuntuone-windows-installer
- cloud-to-cloud
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Natalia Bidart |
Approved revision: | 63 |
Merged at revision: | 56 |
Proposed branch: | lp:~ralsina/ubuntuone-windows-installer/cloud-to-cloud |
Merge into: | lp:ubuntuone-windows-installer |
Diff against target: |
708 lines (+219/-236) 9 files modified
data/qt/sync_now_or_later.ui (+0/-89) ubuntuone_installer/gui/qt/folders.py (+4/-1) ubuntuone_installer/gui/qt/gui.py (+7/-13) ubuntuone_installer/gui/qt/local_folders.py (+10/-10) ubuntuone_installer/gui/qt/main/windows.py (+2/-6) ubuntuone_installer/gui/qt/sync_now_or_later.py (+38/-9) ubuntuone_installer/gui/qt/tests/test_gui.py (+13/-63) ubuntuone_installer/gui/qt/tests/test_local_folders.py (+52/-45) ubuntuone_installer/gui/qt/tests/test_sync_now_or_later.py (+93/-0) |
To merge this branch: | bzr merge lp:~ralsina/ubuntuone-windows-installer/cloud-to-cloud |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Natalia Bidart (community) | Approve | ||
Diego Sarmentero (community) | Approve | ||
Review via email: mp+74457@code.launchpad.net |
Commit message
- Improve the folder sync selection workflow (LP: #843865).
Description of the change
Improve the sync selection workflow.
To test IRL:
Start the installer. Login with an account that has UDFs or shares. After the "login successful" screen, you should get an overlay over an empty page for a bit, and then the "Folders" page. After that, the "Local folders" page, containing only subscribed UDFs and suggested ones.
Start the installer. Login with an account that has no UDFs or shares. After the "login successful" screen, you should get an overlay over an empty page for a bit, and then the "Local folders" page, containing only suggested UDFs.
- 61. By Roberto Alsina
-
EOLs
Natalia Bidart (nataliabidart) wrote : | # |
Question:
when entering the SyncNowOrLaterPage, where its initializePage calls get_info and the overlay is shown, where is the overlay hid?
* Can you please move the self.patch(os.path, 'getsize', lambda *args: 0) to the testcase setup?
I'm getting this for test_status_
test_
Traceback (most recent call last):
File "/usr/lib/
self.run()
File "/home/
total_size += os.path.getsize(fp)
File "/usr/lib/
return os.stat(
OSError: [Errno 2] No such file or directory: '/tmp/tmp5i98v9
* When testing IRL, right after the SSO's "Congratulations" page, I got an empty page with a loading overlay. A few seconds later, the overlay went away, but the page remained empty (I have a screenshot if you need it).
I had to click next on the empty page to get the cloud to computer page.
* And I never for the computer to cloud page :-/.
Roberto Alsina (ralsina) wrote : | # |
> Question:
>
> when entering the SyncNowOrLaterPage, where its initializePage calls get_info
> and the overlay is shown, where is the overlay hid?
In the wizard's next()
> * Can you please move the self.patch(os.path, 'getsize', lambda *args: 0) to
> the testcase setup?
> I'm getting this for test_status_
>
> test_status_
> Traceback (most recent call last):
> File "/usr/lib/
> self.run()
> File "/home/
> cloud/ubuntuone
> total_size += os.path.getsize(fp)
> File "/usr/lib/
> return os.stat(
> OSError: [Errno 2] No such file or directory: '/tmp/tmp5i98v9
Sure. I am not sure if that won't break some other test that actually uses getsize though. Will check it.
>
> * When testing IRL, right after the SSO's "Congratulations" page, I got an
> empty page with a loading overlay. A few seconds later, the overlay went away,
> but the page remained empty (I have a screenshot if you need it).
> I had to click next on the empty page to get the cloud to computer page.
I believe you!
> * And I never for the computer to cloud page :-/.
That one should always be there, even if you get the "cloud to computer" page, it should after that.
- 62. By Roberto Alsina
-
separate tests that need getsize into a separate testcase
- 63. By Roberto Alsina
-
Make it work right with latest trunk
Roberto Alsina (ralsina) wrote : | # |
The white page problem was caused by something that merged into trunk interacting badly with this branch. Fixed in revno 63
Natalia Bidart (nataliabidart) wrote : | # |
The white page problem is indeed fixed but I still don't get the computer-to-cloud page.
So, after I login successfully, I get the congratulations page. Then, the loading overlay (when I click on setup now). Then, the cloud to computer screen, and then, zás, the last page with the "IMAGE GOES HERE" legend.
Am I missing something?
Roberto Alsina (ralsina) wrote : | # |
I can't reproduce it. I included it in the build I just uploaded, let's see if it works?
Natalia Bidart (nataliabidart) wrote : | # |
I tested with a fresh account and it worked, so approving.
Preview Diff
1 | === removed file 'data/qt/sync_now_or_later.ui' | |||
2 | --- data/qt/sync_now_or_later.ui 2011-09-02 12:58:29 +0000 | |||
3 | +++ data/qt/sync_now_or_later.ui 1970-01-01 00:00:00 +0000 | |||
4 | @@ -1,89 +0,0 @@ | |||
5 | 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
6 | 2 | <ui version="4.0"> | ||
7 | 3 | <class>Form</class> | ||
8 | 4 | <widget class="QWidget" name="Form"> | ||
9 | 5 | <property name="geometry"> | ||
10 | 6 | <rect> | ||
11 | 7 | <x>0</x> | ||
12 | 8 | <y>0</y> | ||
13 | 9 | <width>426</width> | ||
14 | 10 | <height>387</height> | ||
15 | 11 | </rect> | ||
16 | 12 | </property> | ||
17 | 13 | <property name="windowTitle"> | ||
18 | 14 | <string>Form</string> | ||
19 | 15 | </property> | ||
20 | 16 | <layout class="QVBoxLayout" name="verticalLayout"> | ||
21 | 17 | <property name="spacing"> | ||
22 | 18 | <number>24</number> | ||
23 | 19 | </property> | ||
24 | 20 | <property name="topMargin"> | ||
25 | 21 | <number>0</number> | ||
26 | 22 | </property> | ||
27 | 23 | <item> | ||
28 | 24 | <widget class="QLabel" name="label"> | ||
29 | 25 | <property name="font"> | ||
30 | 26 | <font> | ||
31 | 27 | <pointsize>14</pointsize> | ||
32 | 28 | <weight>75</weight> | ||
33 | 29 | <bold>true</bold> | ||
34 | 30 | </font> | ||
35 | 31 | </property> | ||
36 | 32 | <property name="text"> | ||
37 | 33 | <string>Syncing your computer with the cloud</string> | ||
38 | 34 | </property> | ||
39 | 35 | </widget> | ||
40 | 36 | </item> | ||
41 | 37 | <item> | ||
42 | 38 | <widget class="QLabel" name="label_9"> | ||
43 | 39 | <property name="text"> | ||
44 | 40 | <string>It seems that you have already some folders in the cloud. | ||
45 | 41 | Do you want to sync everything with this computer now?</string> | ||
46 | 42 | </property> | ||
47 | 43 | <property name="wordWrap"> | ||
48 | 44 | <bool>true</bool> | ||
49 | 45 | </property> | ||
50 | 46 | </widget> | ||
51 | 47 | </item> | ||
52 | 48 | <item> | ||
53 | 49 | <widget class="QRadioButton" name="sync_now"> | ||
54 | 50 | <property name="text"> | ||
55 | 51 | <string>Yes, sync all now</string> | ||
56 | 52 | </property> | ||
57 | 53 | <property name="checked"> | ||
58 | 54 | <bool>true</bool> | ||
59 | 55 | </property> | ||
60 | 56 | </widget> | ||
61 | 57 | </item> | ||
62 | 58 | <item> | ||
63 | 59 | <widget class="QRadioButton" name="sync_later"> | ||
64 | 60 | <property name="text"> | ||
65 | 61 | <string>No, I'll do it later</string> | ||
66 | 62 | </property> | ||
67 | 63 | </widget> | ||
68 | 64 | </item> | ||
69 | 65 | <item> | ||
70 | 66 | <widget class="QRadioButton" name="sync_custom"> | ||
71 | 67 | <property name="text"> | ||
72 | 68 | <string>Yes, but I want to choose what to sync</string> | ||
73 | 69 | </property> | ||
74 | 70 | </widget> | ||
75 | 71 | </item> | ||
76 | 72 | <item> | ||
77 | 73 | <spacer name="verticalSpacer"> | ||
78 | 74 | <property name="orientation"> | ||
79 | 75 | <enum>Qt::Vertical</enum> | ||
80 | 76 | </property> | ||
81 | 77 | <property name="sizeHint" stdset="0"> | ||
82 | 78 | <size> | ||
83 | 79 | <width>20</width> | ||
84 | 80 | <height>54</height> | ||
85 | 81 | </size> | ||
86 | 82 | </property> | ||
87 | 83 | </spacer> | ||
88 | 84 | </item> | ||
89 | 85 | </layout> | ||
90 | 86 | </widget> | ||
91 | 87 | <resources/> | ||
92 | 88 | <connections/> | ||
93 | 89 | </ui> | ||
94 | 90 | 0 | ||
95 | === modified file 'ubuntuone_installer/gui/qt/folders.py' | |||
96 | --- ubuntuone_installer/gui/qt/folders.py 2011-09-01 21:26:50 +0000 | |||
97 | +++ ubuntuone_installer/gui/qt/folders.py 2011-09-08 14:21:18 +0000 | |||
98 | @@ -25,6 +25,7 @@ | |||
99 | 25 | from ubuntu_sso.qt.gui import SSOWizardPage | 25 | from ubuntu_sso.qt.gui import SSOWizardPage |
100 | 26 | from ubuntuone.controlpanel.gui.qt import folders | 26 | from ubuntuone.controlpanel.gui.qt import folders |
101 | 27 | 27 | ||
102 | 28 | from ubuntuone_installer.gui import NEXT | ||
103 | 28 | from ubuntuone_installer.gui.qt.ui import folders_ui | 29 | from ubuntuone_installer.gui.qt.ui import folders_ui |
104 | 29 | 30 | ||
105 | 30 | _ = gettext.gettext | 31 | _ = gettext.gettext |
106 | @@ -55,7 +56,9 @@ | |||
107 | 55 | QtGui.QWizard.BackButton, | 56 | QtGui.QWizard.BackButton, |
108 | 56 | QtGui.QWizard.Stretch, | 57 | QtGui.QWizard.Stretch, |
109 | 57 | QtGui.QWizard.NextButton]) | 58 | QtGui.QWizard.NextButton]) |
111 | 58 | self.wizard()._next_id = self.wizard().CONGRATULATIONS_PAGE | 59 | self.wizard().setButtonText(QtGui.QWizard.NextButton, |
112 | 60 | NEXT) | ||
113 | 61 | self.wizard()._next_id = self.wizard().local_folders_page_id | ||
114 | 59 | 62 | ||
115 | 60 | # pylint: enable=C0103 | 63 | # pylint: enable=C0103 |
116 | 61 | 64 | ||
117 | 62 | 65 | ||
118 | === modified file 'ubuntuone_installer/gui/qt/gui.py' | |||
119 | --- ubuntuone_installer/gui/qt/gui.py 2011-09-07 15:51:10 +0000 | |||
120 | +++ ubuntuone_installer/gui/qt/gui.py 2011-09-08 14:21:18 +0000 | |||
121 | @@ -82,7 +82,6 @@ | |||
122 | 82 | TITLE_STYLE = "<span style=\"font-size:24px\">%s</span>" | 82 | TITLE_STYLE = "<span style=\"font-size:24px\">%s</span>" |
123 | 83 | CREDENTIALS_ERROR_TITLE = _("Error getting credentials") | 83 | CREDENTIALS_ERROR_TITLE = _("Error getting credentials") |
124 | 84 | CREDENTIALS_ERROR = _('Application will close.\n\n%r') | 84 | CREDENTIALS_ERROR = _('Application will close.\n\n%r') |
125 | 85 | STARTING_CP_ERROR = _('Error starting Ubuntu One') | ||
126 | 86 | SKIP_TOUR = _("Skip tour, go to Dashboard") | 85 | SKIP_TOUR = _("Skip tour, go to Dashboard") |
127 | 87 | START_SETUP = _("Start setup") | 86 | START_SETUP = _("Start setup") |
128 | 88 | # Invalid name logger | 87 | # Invalid name logger |
129 | @@ -237,12 +236,6 @@ | |||
130 | 237 | self.wizard().setButtonLayout([ | 236 | self.wizard().setButtonLayout([ |
131 | 238 | QtGui.QWizard.Stretch, | 237 | QtGui.QWizard.Stretch, |
132 | 239 | QtGui.QWizard.FinishButton]) | 238 | QtGui.QWizard.FinishButton]) |
133 | 240 | if self.field("sync_now").toBool() \ | ||
134 | 241 | or self.field("sync_custom").toBool(): | ||
135 | 242 | self.ui.progressContainer.setVisible(True) | ||
136 | 243 | else: | ||
137 | 244 | self.ui.progressContainer.setVisible(False) | ||
138 | 245 | |||
139 | 246 | # Set FinishButton as default when the page is shown. | 239 | # Set FinishButton as default when the page is shown. |
140 | 247 | self.wizard().button(QtGui.QWizard.FinishButton).setDefault(True) | 240 | self.wizard().button(QtGui.QWizard.FinishButton).setDefault(True) |
141 | 248 | self.wizard().button(QtGui.QWizard.FinishButton).style().unpolish( | 241 | self.wizard().button(QtGui.QWizard.FinishButton).style().unpolish( |
142 | @@ -372,11 +365,11 @@ | |||
143 | 372 | 365 | ||
144 | 373 | # End of SSO pages | 366 | # End of SSO pages |
145 | 374 | 367 | ||
146 | 375 | self.local_folders_page = LocalFoldersPage() | ||
147 | 376 | self.local_folders_page_id = self.addPage(self.local_folders_page) | ||
148 | 377 | self.SYNC_NOW_OR_LATER_PAGE = self.addPage(SyncNowOrLaterPage()) | 368 | self.SYNC_NOW_OR_LATER_PAGE = self.addPage(SyncNowOrLaterPage()) |
149 | 378 | self.folders_page = FoldersPage() | 369 | self.folders_page = FoldersPage() |
150 | 379 | self.folders_page_id = self.addPage(self.folders_page) | 370 | self.folders_page_id = self.addPage(self.folders_page) |
151 | 371 | self.local_folders_page = LocalFoldersPage() | ||
152 | 372 | self.local_folders_page_id = self.addPage(self.local_folders_page) | ||
153 | 380 | self.preferences_page = PreferencesPage() | 373 | self.preferences_page = PreferencesPage() |
154 | 381 | self.preferences_page_id = self.addPage(self.preferences_page) | 374 | self.preferences_page_id = self.addPage(self.preferences_page) |
155 | 382 | self.CONGRATULATIONS_PAGE = self.addPage(CongratulationsPage()) | 375 | self.CONGRATULATIONS_PAGE = self.addPage(CongratulationsPage()) |
156 | @@ -402,7 +395,8 @@ | |||
157 | 402 | """Show the next page to display and remove the form errors label.""" | 395 | """Show the next page to display and remove the form errors label.""" |
158 | 403 | self.overlay.hide() | 396 | self.overlay.hide() |
159 | 404 | self.form_errors_label.hide() | 397 | self.form_errors_label.hide() |
161 | 405 | self.currentPage().layout().removeWidget(self.form_errors_label) | 398 | if self.currentPage().layout(): |
162 | 399 | self.currentPage().layout().removeWidget(self.form_errors_label) | ||
163 | 406 | self.form_errors_label.setParent(None) | 400 | self.form_errors_label.setParent(None) |
164 | 407 | super(MainWindow, self).next() | 401 | super(MainWindow, self).next() |
165 | 408 | 402 | ||
166 | @@ -417,13 +411,13 @@ | |||
167 | 417 | """Called on successful login.""" | 411 | """Called on successful login.""" |
168 | 418 | self._next_id = self.SUCCESS_PAGE | 412 | self._next_id = self.SUCCESS_PAGE |
169 | 419 | self.next() | 413 | self.next() |
171 | 420 | self._next_id = self.local_folders_page_id | 414 | self._next_id = self.SYNC_NOW_OR_LATER_PAGE |
172 | 421 | 415 | ||
173 | 422 | def registration_success_slot(self): | 416 | def registration_success_slot(self): |
174 | 423 | """Called on successful registration.""" | 417 | """Called on successful registration.""" |
175 | 424 | self._next_id = self.SUCCESS_PAGE | 418 | self._next_id = self.SUCCESS_PAGE |
176 | 425 | self.next() | 419 | self.next() |
178 | 426 | self._next_id = self.local_folders_page_id | 420 | self._next_id = self.SYNC_NOW_OR_LATER_PAGE |
179 | 427 | 421 | ||
180 | 428 | def done(self, result): | 422 | def done(self, result): |
181 | 429 | """The main window is being closed, call any custom callback.""" | 423 | """The main window is being closed, call any custom callback.""" |
182 | @@ -448,7 +442,7 @@ | |||
183 | 448 | if page_id < self.SIGNIN_PAGE: | 442 | if page_id < self.SIGNIN_PAGE: |
184 | 449 | self.sideWidget().ui.states_frame.hide() | 443 | self.sideWidget().ui.states_frame.hide() |
185 | 450 | self.sideWidget().set_stage(0) | 444 | self.sideWidget().set_stage(0) |
187 | 451 | elif page_id < self.local_folders_page_id: | 445 | elif page_id < self.SYNC_NOW_OR_LATER_PAGE: |
188 | 452 | self.sideWidget().ui.states_frame.show() | 446 | self.sideWidget().ui.states_frame.show() |
189 | 453 | self.sideWidget().set_stage(1) | 447 | self.sideWidget().set_stage(1) |
190 | 454 | elif page_id < self.CONGRATULATIONS_PAGE: | 448 | elif page_id < self.CONGRATULATIONS_PAGE: |
191 | 455 | 449 | ||
192 | === modified file 'ubuntuone_installer/gui/qt/local_folders.py' | |||
193 | --- ubuntuone_installer/gui/qt/local_folders.py 2011-09-05 21:12:02 +0000 | |||
194 | +++ ubuntuone_installer/gui/qt/local_folders.py 2011-09-08 14:21:18 +0000 | |||
195 | @@ -113,7 +113,7 @@ | |||
196 | 113 | QtGui.QWizard.NextButton]) | 113 | QtGui.QWizard.NextButton]) |
197 | 114 | self.wizard().setButtonText(QtGui.QWizard.NextButton, | 114 | self.wizard().setButtonText(QtGui.QWizard.NextButton, |
198 | 115 | NEXT) | 115 | NEXT) |
200 | 116 | self.wizard()._next_id = self.wizard().SYNC_NOW_OR_LATER_PAGE | 116 | self.wizard()._next_id = self.wizard().CONGRATULATIONS_PAGE |
201 | 117 | # Start with this invisible | 117 | # Start with this invisible |
202 | 118 | self.ui.offer_frame.setVisible(False) | 118 | self.ui.offer_frame.setVisible(False) |
203 | 119 | # Show overlay until we have server data | 119 | # Show overlay until we have server data |
204 | @@ -134,16 +134,16 @@ | |||
205 | 134 | self.folders_info.append(volume) | 134 | self.folders_info.append(volume) |
206 | 135 | self.ui.folder_list.clear() | 135 | self.ui.folder_list.clear() |
207 | 136 | for folder in self.folders_info: | 136 | for folder in self.folders_info: |
216 | 137 | item = yield self.add_folder( | 137 | if folder['subscribed']: |
217 | 138 | os.path.expanduser(folder['path']), | 138 | item = yield self.add_folder( |
218 | 139 | validate=False, | 139 | os.path.expanduser(folder['path']), |
219 | 140 | volume_id=folder['volume_id'], | 140 | validate=False, |
220 | 141 | calculate=False, | 141 | volume_id=folder['volume_id'], |
221 | 142 | ) | 142 | calculate=False, |
222 | 143 | if item: | 143 | ) |
223 | 144 | if folder['subscribed']: | 144 | if item: |
224 | 145 | item.setCheckState(0, QtCore.Qt.Checked) | 145 | item.setCheckState(0, QtCore.Qt.Checked) |
226 | 146 | item.size = 0 | 146 | item.size = 0 |
227 | 147 | for folder_name in default_folders(): | 147 | for folder_name in default_folders(): |
228 | 148 | item = yield self.add_folder(folder_name, validate=True) | 148 | item = yield self.add_folder(folder_name, validate=True) |
229 | 149 | self.timer.start(2000) | 149 | self.timer.start(2000) |
230 | 150 | 150 | ||
231 | === modified file 'ubuntuone_installer/gui/qt/main/windows.py' | |||
232 | --- ubuntuone_installer/gui/qt/main/windows.py 2011-09-07 11:24:12 +0000 | |||
233 | +++ ubuntuone_installer/gui/qt/main/windows.py 2011-09-08 14:21:18 +0000 | |||
234 | @@ -46,12 +46,8 @@ | |||
235 | 46 | def success_cb(creds, gui): | 46 | def success_cb(creds, gui): |
236 | 47 | """Handle credentials success.""" | 47 | """Handle credentials success.""" |
237 | 48 | if creds: # Have credentials already | 48 | if creds: # Have credentials already |
244 | 49 | try: | 49 | from ubuntuone_installer.gui.qt import utils |
245 | 50 | from ubuntuone_installer.gui.qt import utils | 50 | utils.start_control_panel() |
240 | 51 | utils.start_control_panel() | ||
241 | 52 | except OSError: | ||
242 | 53 | QtGui.QMessageBox.critical( | ||
243 | 54 | None, "Ubuntu One", gui.STARTING_CP_ERROR) | ||
246 | 55 | stop() | 51 | stop() |
247 | 56 | else: # No credentials | 52 | else: # No credentials |
248 | 57 | window = gui.MainWindow(close_callback=stop) | 53 | window = gui.MainWindow(close_callback=stop) |
249 | 58 | 54 | ||
250 | === modified file 'ubuntuone_installer/gui/qt/sync_now_or_later.py' | |||
251 | --- ubuntuone_installer/gui/qt/sync_now_or_later.py 2011-08-10 21:37:30 +0000 | |||
252 | +++ ubuntuone_installer/gui/qt/sync_now_or_later.py 2011-09-08 14:21:18 +0000 | |||
253 | @@ -19,8 +19,16 @@ | |||
254 | 19 | """The user interface for the Ubuntu One Installer.""" | 19 | """The user interface for the Ubuntu One Installer.""" |
255 | 20 | 20 | ||
256 | 21 | from PyQt4 import QtGui | 21 | from PyQt4 import QtGui |
259 | 22 | 22 | from twisted.internet.defer import inlineCallbacks | |
260 | 23 | from ubuntuone_installer.gui.qt.ui import sync_now_or_later_ui | 23 | from ubuntuone.controlpanel import backend |
261 | 24 | |||
262 | 25 | from ubuntuone_installer.gui import NEXT | ||
263 | 26 | from ubuntuone_installer.logger import setup_logging | ||
264 | 27 | |||
265 | 28 | # Invalid name logger | ||
266 | 29 | # pylint: disable=C0103 | ||
267 | 30 | logger = setup_logging('qt.sync_now_or_later') | ||
268 | 31 | # pylint: enable=C0103 | ||
269 | 24 | 32 | ||
270 | 25 | 33 | ||
271 | 26 | class SyncNowOrLaterPage(QtGui.QWizardPage): | 34 | class SyncNowOrLaterPage(QtGui.QWizardPage): |
272 | @@ -28,11 +36,8 @@ | |||
273 | 28 | 36 | ||
274 | 29 | def __init__(self, parent=None): | 37 | def __init__(self, parent=None): |
275 | 30 | QtGui.QWizardPage.__init__(self, parent) | 38 | QtGui.QWizardPage.__init__(self, parent) |
281 | 31 | self.ui = sync_now_or_later_ui.Ui_Form() | 39 | self.has_cloud_folders = False |
282 | 32 | self.ui.setupUi(self) | 40 | self.cp_backend = None |
278 | 33 | self.registerField("sync_now", self.ui.sync_now) | ||
279 | 34 | self.registerField("sync_later", self.ui.sync_later) | ||
280 | 35 | self.registerField("sync_custom", self.ui.sync_custom) | ||
283 | 36 | 41 | ||
284 | 37 | # Invalid names of Qt-inherited methods | 42 | # Invalid names of Qt-inherited methods |
285 | 38 | # pylint: disable=C0103 | 43 | # pylint: disable=C0103 |
286 | @@ -42,10 +47,34 @@ | |||
287 | 42 | self.wizard().setOption(QtGui.QWizard.HaveCustomButton1, False) | 47 | self.wizard().setOption(QtGui.QWizard.HaveCustomButton1, False) |
288 | 43 | self.wizard().setOption(QtGui.QWizard.NoCancelButton, True) | 48 | self.wizard().setOption(QtGui.QWizard.NoCancelButton, True) |
289 | 44 | self.wizard()._next_id = None | 49 | self.wizard()._next_id = None |
290 | 50 | self.wizard().overlay.show() | ||
291 | 51 | self.wizard().setButtonText(QtGui.QWizard.NextButton, | ||
292 | 52 | NEXT) | ||
293 | 53 | self.get_info() | ||
294 | 45 | 54 | ||
295 | 46 | def nextId(self): | 55 | def nextId(self): |
296 | 47 | """Go to the next page depending on the select field.""" | 56 | """Go to the next page depending on the select field.""" |
298 | 48 | if self.field("sync_custom"): | 57 | if self.has_cloud_folders: |
299 | 49 | return self.wizard().folders_page_id | 58 | return self.wizard().folders_page_id |
300 | 50 | else: | 59 | else: |
302 | 51 | return self.wizard().CONGRATULATIONS_PAGE | 60 | return self.wizard().local_folders_page_id |
303 | 61 | |||
304 | 62 | @inlineCallbacks | ||
305 | 63 | def get_info(self): | ||
306 | 64 | """Get folder information from CP backend.""" | ||
307 | 65 | # pylint: disable=W0702 | ||
308 | 66 | try: | ||
309 | 67 | self.cp_backend = backend.ControlBackend() | ||
310 | 68 | volumes_info = yield self.cp_backend.volumes_info() | ||
311 | 69 | except: | ||
312 | 70 | logger.exception("Error getting backend info:") | ||
313 | 71 | else: | ||
314 | 72 | counter = 0 | ||
315 | 73 | for _, _, volumes in volumes_info: | ||
316 | 74 | counter += len(volumes) | ||
317 | 75 | if counter > 1: | ||
318 | 76 | # there are UDFs or shares, show cloud-to-computer | ||
319 | 77 | self.has_cloud_folders = True | ||
320 | 78 | else: | ||
321 | 79 | self.has_cloud_folders = False | ||
322 | 80 | self.wizard().next() | ||
323 | 52 | 81 | ||
324 | === modified file 'ubuntuone_installer/gui/qt/tests/test_gui.py' | |||
325 | --- ubuntuone_installer/gui/qt/tests/test_gui.py 2011-09-08 13:41:10 +0000 | |||
326 | +++ ubuntuone_installer/gui/qt/tests/test_gui.py 2011-09-08 14:21:18 +0000 | |||
327 | @@ -291,7 +291,7 @@ | |||
328 | 291 | tree_folders = folders_page.folders_widget.ui.folders | 291 | tree_folders = folders_page.folders_widget.ui.folders |
329 | 292 | self.assertEqual(tree_folders.isColumnHidden(2), True) | 292 | self.assertEqual(tree_folders.isColumnHidden(2), True) |
330 | 293 | # pylint: disable=W0212 | 293 | # pylint: disable=W0212 |
332 | 294 | self.assertEqual(self.ui._next_id, self.ui.CONGRATULATIONS_PAGE) | 294 | self.assertEqual(self.ui._next_id, self.ui.local_folders_page_id) |
333 | 295 | 295 | ||
334 | 296 | def test_folders_page_next_id(self): | 296 | def test_folders_page_next_id(self): |
335 | 297 | """Check Folders Page UI.""" | 297 | """Check Folders Page UI.""" |
336 | @@ -432,7 +432,6 @@ | |||
337 | 432 | @skipIfOS('linux2', 'Windows-specific tests.') | 432 | @skipIfOS('linux2', 'Windows-specific tests.') |
338 | 433 | def test_start_control_panel_frozen(self): | 433 | def test_start_control_panel_frozen(self): |
339 | 434 | """When frozen, the control-panel has a path.""" | 434 | """When frozen, the control-panel has a path.""" |
340 | 435 | self.ui.setStartId(self.ui.SYNC_NOW_OR_LATER_PAGE) | ||
341 | 436 | self.ui.restart() | 435 | self.ui.restart() |
342 | 437 | self.ui.show() | 436 | self.ui.show() |
343 | 438 | self.addCleanup(self.ui.hide) | 437 | self.addCleanup(self.ui.hide) |
344 | @@ -476,66 +475,6 @@ | |||
345 | 476 | self.assertEqual(self._called, False) | 475 | self.assertEqual(self._called, False) |
346 | 477 | self.assertEqual(FakeAreYouSure.shown, False) | 476 | self.assertEqual(FakeAreYouSure.shown, False) |
347 | 478 | 477 | ||
348 | 479 | def test_later_accepts_cancel(self): | ||
349 | 480 | """Clicking 'Later' accepts cancellation.""" | ||
350 | 481 | self.ui.setStartId(self.ui.SYNC_NOW_OR_LATER_PAGE) | ||
351 | 482 | self.ui.restart() | ||
352 | 483 | self.ui.show() | ||
353 | 484 | self.addCleanup(self.ui.hide) | ||
354 | 485 | gui.AreYouSure.result = 1 | ||
355 | 486 | self.ui.show() | ||
356 | 487 | self.addCleanup(self.ui.hide) | ||
357 | 488 | self.ui.done(result=0) | ||
358 | 489 | self.assertEqual(self.ui.isVisible(), False) | ||
359 | 490 | |||
360 | 491 | def test_sync_now_shows_message(self): | ||
361 | 492 | """If the user selects 'Sync Now' the congrats page shows a message.""" | ||
362 | 493 | congrats_page = self.ui.page(self.ui.CONGRATULATIONS_PAGE) | ||
363 | 494 | congrats_page.setField("sync_now", True) | ||
364 | 495 | |||
365 | 496 | # Show the congrats page | ||
366 | 497 | self.ui.setStartId(self.ui.CONGRATULATIONS_PAGE) | ||
367 | 498 | self.ui.restart() | ||
368 | 499 | self.ui.show() | ||
369 | 500 | self.addCleanup(self.ui.hide) | ||
370 | 501 | |||
371 | 502 | # Check the properties have the right values | ||
372 | 503 | self.assertEqual(congrats_page.field("sync_later").toBool(), | ||
373 | 504 | False) | ||
374 | 505 | self.assertEqual( | ||
375 | 506 | congrats_page.ui.progressContainer.isVisible(), True) | ||
376 | 507 | |||
377 | 508 | def test_sync_page_custom_field(self): | ||
378 | 509 | """If the user selects 'Sync Custom' we move to Folders page.""" | ||
379 | 510 | sync_page = self.ui.page(self.ui.SYNC_NOW_OR_LATER_PAGE) | ||
380 | 511 | sync_page.setField("sync_custom", True) | ||
381 | 512 | |||
382 | 513 | # Show the Sync Now page | ||
383 | 514 | self.ui.setStartId(self.ui.SYNC_NOW_OR_LATER_PAGE) | ||
384 | 515 | self.ui.restart() | ||
385 | 516 | self.ui.show() | ||
386 | 517 | self.addCleanup(self.ui.hide) | ||
387 | 518 | |||
388 | 519 | # Check the navigation is correct | ||
389 | 520 | self.assertEqual(sync_page.nextId(), self.ui.folders_page_id) | ||
390 | 521 | |||
391 | 522 | def test_sync_later_hides_message(self): | ||
392 | 523 | """Selecting 'Sync Later' the congrats page hides a message.""" | ||
393 | 524 | congrats_page = self.ui.page(self.ui.CONGRATULATIONS_PAGE) | ||
394 | 525 | congrats_page.setField("sync_later", True) | ||
395 | 526 | |||
396 | 527 | # Show the congrats page | ||
397 | 528 | self.ui.setStartId(self.ui.CONGRATULATIONS_PAGE) | ||
398 | 529 | self.ui.restart() | ||
399 | 530 | self.ui.show() | ||
400 | 531 | self.addCleanup(self.ui.hide) | ||
401 | 532 | |||
402 | 533 | # Check the properties have the right values | ||
403 | 534 | self.assertEqual(congrats_page.field("sync_now").toBool(), | ||
404 | 535 | False) | ||
405 | 536 | self.assertEqual( | ||
406 | 537 | congrats_page.ui.progressContainer.isVisible(), False) | ||
407 | 538 | |||
408 | 539 | def test_current_user_controller_parameters(self): | 478 | def test_current_user_controller_parameters(self): |
409 | 540 | """Compare controller parameters with expected values.""" | 479 | """Compare controller parameters with expected values.""" |
410 | 541 | self.assertEqual(self.ui.current_user_controller.args, | 480 | self.assertEqual(self.ui.current_user_controller.args, |
411 | @@ -636,17 +575,21 @@ | |||
412 | 636 | 575 | ||
413 | 637 | """A fake MainWindow.""" | 576 | """A fake MainWindow.""" |
414 | 638 | 577 | ||
415 | 639 | overlay = FakeOverlay() | ||
416 | 640 | currentIdChanged = FakeSignal() | 578 | currentIdChanged = FakeSignal() |
417 | 641 | loginSuccess = FakeSignal() | 579 | loginSuccess = FakeSignal() |
418 | 642 | registrationSuccess = FakeSignal() | 580 | registrationSuccess = FakeSignal() |
419 | 643 | userCancellation = FakeSignal() | 581 | userCancellation = FakeSignal() |
420 | 644 | shown = False | 582 | shown = False |
421 | 645 | SYNC_NOW_OR_LATER_PAGE = 4 | 583 | SYNC_NOW_OR_LATER_PAGE = 4 |
422 | 584 | CONGRATULATIONS_PAGE = 5 | ||
423 | 585 | folders_page_id = 6 | ||
424 | 586 | local_folders_page_id = 7 | ||
425 | 646 | 587 | ||
426 | 647 | def __init__(self, close_callback=None): | 588 | def __init__(self, close_callback=None): |
427 | 648 | self.button_texts = [] | 589 | self.button_texts = [] |
428 | 649 | self.button_layout = None | 590 | self.button_layout = None |
429 | 591 | self.options = [] | ||
430 | 592 | self.overlay = FakeOverlay() | ||
431 | 650 | 593 | ||
432 | 651 | def show(self): | 594 | def show(self): |
433 | 652 | """Fake method.""" | 595 | """Fake method.""" |
434 | @@ -661,6 +604,13 @@ | |||
435 | 661 | """Fake setButtonText.""" | 604 | """Fake setButtonText.""" |
436 | 662 | self.button_layout = layout | 605 | self.button_layout = layout |
437 | 663 | 606 | ||
438 | 607 | def setOption(self, *args): | ||
439 | 608 | """Fake setOption.""" | ||
440 | 609 | self.options.append(args) | ||
441 | 610 | |||
442 | 611 | def next(self): | ||
443 | 612 | """Fake next.""" | ||
444 | 613 | |||
445 | 664 | 614 | ||
446 | 665 | class SuccesPageTestCase(BaseTestCase): | 615 | class SuccesPageTestCase(BaseTestCase): |
447 | 666 | """Test the SuccessPage code.""" | 616 | """Test the SuccessPage code.""" |
448 | 667 | 617 | ||
449 | === modified file 'ubuntuone_installer/gui/qt/tests/test_local_folders.py' | |||
450 | --- ubuntuone_installer/gui/qt/tests/test_local_folders.py 2011-09-05 22:00:40 +0000 | |||
451 | +++ ubuntuone_installer/gui/qt/tests/test_local_folders.py 2011-09-08 14:21:18 +0000 | |||
452 | @@ -26,9 +26,7 @@ | |||
453 | 26 | from PyQt4 import QtGui, QtCore | 26 | from PyQt4 import QtGui, QtCore |
454 | 27 | from twisted.internet import defer | 27 | from twisted.internet import defer |
455 | 28 | 28 | ||
459 | 29 | from ubuntuone_installer.gui import ( | 29 | from ubuntuone_installer.gui import NEXT |
457 | 30 | NEXT, | ||
458 | 31 | ) | ||
460 | 32 | from ubuntuone_installer.gui.qt import local_folders | 30 | from ubuntuone_installer.gui.qt import local_folders |
461 | 33 | from ubuntuone_installer.gui.qt.tests import BaseTestCase, TestCase | 31 | from ubuntuone_installer.gui.qt.tests import BaseTestCase, TestCase |
462 | 34 | from ubuntuone_installer.gui.qt.tests.test_gui import FakeMainWindow | 32 | from ubuntuone_installer.gui.qt.tests.test_gui import FakeMainWindow |
463 | @@ -164,8 +162,8 @@ | |||
464 | 164 | self.assertEqual(item.volume_id, "xyzzy") | 162 | self.assertEqual(item.volume_id, "xyzzy") |
465 | 165 | 163 | ||
466 | 166 | 164 | ||
469 | 167 | class LocalFoldersTestCase(BaseTestCase): | 165 | class LocalFoldersWithGetSizeTestCase(BaseTestCase): |
470 | 168 | """Test the LocalFoldersPage code.""" | 166 | """Test the LocalFoldersPage code using the real getsize.""" |
471 | 169 | 167 | ||
472 | 170 | class_ui = local_folders.LocalFoldersPage | 168 | class_ui = local_folders.LocalFoldersPage |
473 | 171 | 169 | ||
474 | @@ -183,6 +181,48 @@ | |||
475 | 183 | self.addCleanup(shutil.rmtree, self.tmpdir) | 181 | self.addCleanup(shutil.rmtree, self.tmpdir) |
476 | 184 | self.fake_wizard = FakeMainWindow() | 182 | self.fake_wizard = FakeMainWindow() |
477 | 185 | self.patch(local_folders.backend, "ControlBackend", FakeCPBackend) | 183 | self.patch(local_folders.backend, "ControlBackend", FakeCPBackend) |
478 | 184 | super(LocalFoldersWithGetSizeTestCase, self).setUp() | ||
479 | 185 | self.patch(self.ui, "wizard", lambda: self.fake_wizard) | ||
480 | 186 | |||
481 | 187 | @defer.inlineCallbacks | ||
482 | 188 | def test_total_size(self): | ||
483 | 189 | """Test that the header reflects the change in item sizes.""" | ||
484 | 190 | self.patch(self.ui, "show_hide_offer", self._set_called) | ||
485 | 191 | yield self.ui.get_info() | ||
486 | 192 | self.ui.ui.folder_list.clear() | ||
487 | 193 | self.ui.items = {} | ||
488 | 194 | item = yield self.ui.add_folder(self.tmpdir) | ||
489 | 195 | item.thread.run() | ||
490 | 196 | item.thread.join() | ||
491 | 197 | item.size = 1337 | ||
492 | 198 | item.setCheckState(0, QtCore.Qt.Checked) | ||
493 | 199 | self.ui.update_sizes() | ||
494 | 200 | self.assertEqual(unicode(self.ui.ui.folder_list.headerItem().text(1)), | ||
495 | 201 | u"Space (1.5 KiB)") | ||
496 | 202 | self.assertEqual(self._called, ((1537L,), {})) | ||
497 | 203 | |||
498 | 204 | def test_size_calculation(self): | ||
499 | 205 | """Test the recursive folder size calculation.""" | ||
500 | 206 | queue = Queue.Queue() | ||
501 | 207 | csize = local_folders.CalculateSize(self.tmpdir, queue) | ||
502 | 208 | csize.run() | ||
503 | 209 | path, size = queue.get() | ||
504 | 210 | self.assertEqual(path, self.tmpdir) | ||
505 | 211 | self.assertEqual(size, 1337) | ||
506 | 212 | |||
507 | 213 | |||
508 | 214 | class LocalFoldersTestCase(BaseTestCase): | ||
509 | 215 | """Test the LocalFoldersPage code.""" | ||
510 | 216 | |||
511 | 217 | class_ui = local_folders.LocalFoldersPage | ||
512 | 218 | |||
513 | 219 | def setUp(self): | ||
514 | 220 | """Initialize this test instance.""" | ||
515 | 221 | self.tmpdir = tempfile.mkdtemp() | ||
516 | 222 | self.addCleanup(shutil.rmtree, self.tmpdir) | ||
517 | 223 | self.fake_wizard = FakeMainWindow() | ||
518 | 224 | self.patch(local_folders.backend, "ControlBackend", FakeCPBackend) | ||
519 | 225 | self.patch(os.path, 'getsize', lambda *args: 0) | ||
520 | 186 | super(LocalFoldersTestCase, self).setUp() | 226 | super(LocalFoldersTestCase, self).setUp() |
521 | 187 | self.patch(self.ui, "wizard", lambda: self.fake_wizard) | 227 | self.patch(self.ui, "wizard", lambda: self.fake_wizard) |
522 | 188 | 228 | ||
523 | @@ -199,8 +239,8 @@ | |||
524 | 199 | """Test status of page components after initializePage().""" | 239 | """Test status of page components after initializePage().""" |
525 | 200 | self.patch(self.ui, "get_info", self._set_called) | 240 | self.patch(self.ui, "get_info", self._set_called) |
526 | 201 | self.ui.initializePage() | 241 | self.ui.initializePage() |
529 | 202 | self.assertTrue(self.ui.wizard().overlay.show_counter, 1) | 242 | self.assertEqual(self.ui.wizard().overlay.show_counter, 1) |
530 | 203 | self.assertTrue(self.ui.wizard().overlay.hide_counter, 0) | 243 | self.assertEqual(self.ui.wizard().overlay.hide_counter, 0) |
531 | 204 | self.assertFalse(self.ui.ui.offer_frame.isVisible()) | 244 | self.assertFalse(self.ui.ui.offer_frame.isVisible()) |
532 | 205 | self.assertEqual(self._called, ((), {})) | 245 | self.assertEqual(self._called, ((), {})) |
533 | 206 | self.assertEqual(self.ui.wizard().button_texts, | 246 | self.assertEqual(self.ui.wizard().button_texts, |
534 | @@ -211,15 +251,12 @@ | |||
535 | 211 | """Test status of page components after get_info().""" | 251 | """Test status of page components after get_info().""" |
536 | 212 | yield self.ui.get_info() | 252 | yield self.ui.get_info() |
537 | 213 | self.assertTrue(self.ui.wizard().overlay.hide_counter, 1) | 253 | self.assertTrue(self.ui.wizard().overlay.hide_counter, 1) |
539 | 214 | self.assertEqual(self.ui.ui.folder_list.topLevelItemCount(), 5) | 254 | self.assertEqual(self.ui.ui.folder_list.topLevelItemCount(), 4) |
540 | 215 | self.assertEqual(self.ui.wizard().currentIdChanged.target, | 255 | self.assertEqual(self.ui.wizard().currentIdChanged.target, |
541 | 216 | self.ui.changed_page) | 256 | self.ui.changed_page) |
542 | 217 | self.assertEqual( | 257 | self.assertEqual( |
543 | 218 | self.ui.items[os.path.expanduser('~/xyzzy')].checkState(0), | 258 | self.ui.items[os.path.expanduser('~/xyzzy')].checkState(0), |
544 | 219 | QtCore.Qt.Checked) | 259 | QtCore.Qt.Checked) |
545 | 220 | self.assertEqual( | ||
546 | 221 | self.ui.items[os.path.expanduser('~/zxyzzy')].checkState(0), | ||
547 | 222 | QtCore.Qt.Unchecked) | ||
548 | 223 | check_states = [self.ui.items[item].checkState(0) | 260 | check_states = [self.ui.items[item].checkState(0) |
549 | 224 | for item in self.ui.items] | 261 | for item in self.ui.items] |
550 | 225 | self.assertEqual(len([ | 262 | self.assertEqual(len([ |
551 | @@ -236,22 +273,10 @@ | |||
552 | 236 | self.assertEqual(item.volume_id, 'asdfgh') | 273 | self.assertEqual(item.volume_id, 'asdfgh') |
553 | 237 | 274 | ||
554 | 238 | @defer.inlineCallbacks | 275 | @defer.inlineCallbacks |
557 | 239 | def test_unsubscribed_udf_checked(self): | 276 | def test_unsubscribed_udf_not_added(self): |
558 | 240 | """Check that unsubscribed UDF items are created correctly.""" | 277 | """Check that unsubscribed UDF items are not added.""" |
559 | 241 | yield self.ui.get_info() | 278 | yield self.ui.get_info() |
573 | 242 | item = self.ui.items[os.path.expanduser(u'~/zxyzzy')] | 279 | self.assertNotIn(os.path.expanduser(u'~/zxyzzy'), self.ui.items) |
561 | 243 | self.assertEqual(item.checkState(0), QtCore.Qt.Unchecked) | ||
562 | 244 | self.assertEqual(item.size, 0) | ||
563 | 245 | self.assertEqual(item.volume_id, 'qwerty') | ||
564 | 246 | |||
565 | 247 | def test_size_calculation(self): | ||
566 | 248 | """Test the recursive folder size calculation.""" | ||
567 | 249 | queue = Queue.Queue() | ||
568 | 250 | csize = local_folders.CalculateSize(self.tmpdir, queue) | ||
569 | 251 | csize.run() | ||
570 | 252 | path, size = queue.get() | ||
571 | 253 | self.assertEqual(path, self.tmpdir) | ||
572 | 254 | self.assertEqual(size, 1337) | ||
574 | 255 | 280 | ||
575 | 256 | @defer.inlineCallbacks | 281 | @defer.inlineCallbacks |
576 | 257 | def test_item_addition(self): | 282 | def test_item_addition(self): |
577 | @@ -293,23 +318,6 @@ | |||
578 | 293 | self.assertEqual(1, self.ui.ui.folder_list.topLevelItemCount()) | 318 | self.assertEqual(1, self.ui.ui.folder_list.topLevelItemCount()) |
579 | 294 | 319 | ||
580 | 295 | @defer.inlineCallbacks | 320 | @defer.inlineCallbacks |
581 | 296 | def test_total_size(self): | ||
582 | 297 | """Test that the header reflects the change in item sizes.""" | ||
583 | 298 | self.patch(self.ui, "show_hide_offer", self._set_called) | ||
584 | 299 | yield self.ui.get_info() | ||
585 | 300 | self.ui.ui.folder_list.clear() | ||
586 | 301 | self.ui.items = {} | ||
587 | 302 | item = yield self.ui.add_folder(self.tmpdir) | ||
588 | 303 | item.thread.run() | ||
589 | 304 | item.thread.join() | ||
590 | 305 | item.size = 1337 | ||
591 | 306 | item.setCheckState(0, QtCore.Qt.Checked) | ||
592 | 307 | self.ui.update_sizes() | ||
593 | 308 | self.assertEqual(unicode(self.ui.ui.folder_list.headerItem().text(1)), | ||
594 | 309 | u"Space (1.5 KiB)") | ||
595 | 310 | self.assertEqual(self._called, ((1537L,), {})) | ||
596 | 311 | |||
597 | 312 | @defer.inlineCallbacks | ||
598 | 313 | def test_total_size_unchecked(self): | 321 | def test_total_size_unchecked(self): |
599 | 314 | """Unchecked items use no space beyond quota_used.""" | 322 | """Unchecked items use no space beyond quota_used.""" |
600 | 315 | self.patch(self.ui, "show_hide_offer", self._set_called) | 323 | self.patch(self.ui, "show_hide_offer", self._set_called) |
601 | @@ -441,8 +449,7 @@ | |||
602 | 441 | self.ui.changed_page(self.ui.wizard().SYNC_NOW_OR_LATER_PAGE) | 449 | self.ui.changed_page(self.ui.wizard().SYNC_NOW_OR_LATER_PAGE) |
603 | 442 | changes = sorted(self.ui.cp_backend.volume_setings_changes) | 450 | changes = sorted(self.ui.cp_backend.volume_setings_changes) |
604 | 443 | self.assertEqual(changes, | 451 | self.assertEqual(changes, |
607 | 444 | sorted([('asdfgh', {'subscribed': True}), | 452 | [('asdfgh', {'subscribed': True})]) |
606 | 445 | ('qwerty', {'subscribed': False})])) | ||
608 | 446 | self.assertEqual(self.ui.wizard().overlay.show_counter, | 453 | self.assertEqual(self.ui.wizard().overlay.show_counter, |
609 | 447 | show_counter + 1) | 454 | show_counter + 1) |
610 | 448 | self.assertEqual(self.ui.wizard().overlay.hide_counter, | 455 | self.assertEqual(self.ui.wizard().overlay.hide_counter, |
611 | 449 | 456 | ||
612 | === added file 'ubuntuone_installer/gui/qt/tests/test_sync_now_or_later.py' | |||
613 | --- ubuntuone_installer/gui/qt/tests/test_sync_now_or_later.py 1970-01-01 00:00:00 +0000 | |||
614 | +++ ubuntuone_installer/gui/qt/tests/test_sync_now_or_later.py 2011-09-08 14:21:18 +0000 | |||
615 | @@ -0,0 +1,93 @@ | |||
616 | 1 | # -*- coding: utf-8 -*- | ||
617 | 2 | |||
618 | 3 | # Authors: Roberto Alsina <roberto.alsina@canonical.com> | ||
619 | 4 | # | ||
620 | 5 | # Copyright 2011 Canonical Ltd. | ||
621 | 6 | # | ||
622 | 7 | # This program is free software: you can redistribute it and/or modify it | ||
623 | 8 | # under the terms of the GNU General Public License version 3, as published | ||
624 | 9 | # by the Free Software Foundation. | ||
625 | 10 | # | ||
626 | 11 | # This program is distributed in the hope that it will be useful, but | ||
627 | 12 | # WITHOUT ANY WARRANTY; without even the implied warranties of | ||
628 | 13 | # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
629 | 14 | # PURPOSE. See the GNU General Public License for more details. | ||
630 | 15 | # | ||
631 | 16 | # You should have received a copy of the GNU General Public License along | ||
632 | 17 | # with this program. If not, see <http://www.gnu.org/licenses/>. | ||
633 | 18 | |||
634 | 19 | """Tests for the sync_now_or_later page.""" | ||
635 | 20 | |||
636 | 21 | import os | ||
637 | 22 | |||
638 | 23 | from PyQt4 import QtGui | ||
639 | 24 | from twisted.internet import defer | ||
640 | 25 | |||
641 | 26 | from ubuntuone_installer.gui import NEXT | ||
642 | 27 | from ubuntuone_installer.gui.qt import sync_now_or_later | ||
643 | 28 | from ubuntuone_installer.gui.qt.tests import BaseTestCase | ||
644 | 29 | from ubuntuone_installer.gui.qt.tests.test_gui import FakeMainWindow | ||
645 | 30 | from ubuntuone_installer.gui.qt.tests.test_local_folders import ( | ||
646 | 31 | FakeCPBackend, | ||
647 | 32 | ) | ||
648 | 33 | |||
649 | 34 | |||
650 | 35 | class FakeEmptyCPBackend(FakeCPBackend): | ||
651 | 36 | """A CP backend that returns only one folder.""" | ||
652 | 37 | def volumes_info(self, *args): | ||
653 | 38 | """Fake volumes info.""" | ||
654 | 39 | return defer.succeed(((None, None, | ||
655 | 40 | [ | ||
656 | 41 | { | ||
657 | 42 | 'type': u'ROOT', | ||
658 | 43 | 'path': os.path.expanduser(u'~/Ubuntu One'), | ||
659 | 44 | 'volume_id': 'asdfgh', | ||
660 | 45 | 'subscribed': True, | ||
661 | 46 | }]),)) | ||
662 | 47 | |||
663 | 48 | |||
664 | 49 | class SyncNowOrLaterTestCase(BaseTestCase): | ||
665 | 50 | """Test the sync_now_or_later page.""" | ||
666 | 51 | |||
667 | 52 | class_ui = sync_now_or_later.SyncNowOrLaterPage | ||
668 | 53 | |||
669 | 54 | def setUp(self): | ||
670 | 55 | """Initialize tests.""" | ||
671 | 56 | super(SyncNowOrLaterTestCase, self).setUp() | ||
672 | 57 | self.main_window = FakeMainWindow() | ||
673 | 58 | self.patch(self.ui, "wizard", lambda: self.main_window) | ||
674 | 59 | self.patch(sync_now_or_later.backend, "ControlBackend", FakeCPBackend) | ||
675 | 60 | |||
676 | 61 | @defer.inlineCallbacks | ||
677 | 62 | def test_has_folders_in_cloud(self): | ||
678 | 63 | """test behaviour when the user has folders in the cloud.""" | ||
679 | 64 | yield self.ui.get_info() | ||
680 | 65 | self.assertTrue(self.ui.has_cloud_folders) | ||
681 | 66 | |||
682 | 67 | @defer.inlineCallbacks | ||
683 | 68 | def test_has_no_folders_in_cloud(self): | ||
684 | 69 | """test behaviour when the user has no folders in the cloud.""" | ||
685 | 70 | self.patch(sync_now_or_later.backend, | ||
686 | 71 | "ControlBackend", FakeEmptyCPBackend) | ||
687 | 72 | yield self.ui.get_info() | ||
688 | 73 | self.assertFalse(self.ui.has_cloud_folders) | ||
689 | 74 | |||
690 | 75 | def test_has_cloud_folders_next(self): | ||
691 | 76 | """With cloud folders, next page is folders.""" | ||
692 | 77 | self.ui.has_cloud_folders = True | ||
693 | 78 | self.assertEqual(self.ui.nextId(), FakeMainWindow.folders_page_id) | ||
694 | 79 | |||
695 | 80 | def test_has_no_cloud_folders_next(self): | ||
696 | 81 | """With cloud folders, next page is folders.""" | ||
697 | 82 | self.ui.has_cloud_folders = False | ||
698 | 83 | self.assertEqual(self.ui.nextId(), | ||
699 | 84 | FakeMainWindow.local_folders_page_id) | ||
700 | 85 | |||
701 | 86 | def test_status_after_initialize(self): | ||
702 | 87 | """Test that everything is initialized correctly.""" | ||
703 | 88 | self.assertEqual(self.ui.wizard().overlay.show_counter, 0) | ||
704 | 89 | self.ui.initializePage() | ||
705 | 90 | self.assertEqual(self.ui.wizard().overlay.show_counter, 1) | ||
706 | 91 | self.assertEqual(self.ui.wizard().overlay.hide_counter, 0) | ||
707 | 92 | self.assertEqual(self.ui.wizard().button_texts, | ||
708 | 93 | [(QtGui.QWizard.NextButton, NEXT)]) |
+1