Merge lp:~dobey/ubuntuone-control-panel/update-4-0 into lp:ubuntuone-control-panel/stable-4-0

Proposed by dobey
Status: Merged
Approved by: dobey
Approved revision: no longer in the source branch.
Merged at revision: 328
Proposed branch: lp:~dobey/ubuntuone-control-panel/update-4-0
Merge into: lp:ubuntuone-control-panel/stable-4-0
Diff against target: 463 lines (+118/-97)
7 files modified
bin/ubuntuone-control-panel-qt (+1/-1)
data/qt/images.qrc (+1/-0)
run-tests (+32/-7)
ubuntuone/controlpanel/gui/qt/folders.py (+28/-12)
ubuntuone/controlpanel/gui/qt/main/__init__.py (+5/-5)
ubuntuone/controlpanel/gui/qt/main/twisted_main.py (+1/-1)
ubuntuone/controlpanel/gui/qt/tests/test_folders.py (+50/-71)
To merge this branch: bzr merge lp:~dobey/ubuntuone-control-panel/update-4-0
Reviewer Review Type Date Requested Status
Mike McCracken (community) Approve
Review via email: mp+111291@code.launchpad.net

Commit message

[Mike McCracken]

    - Use qt4reactor on Darwin. (LP: #1013820)
    - Make run-tests script work on Darwin. (LP: #1010211)

[Roberto Alsina]

    - Enable folder list sorting (Fixes LP:1006385).

[Diego Sarmentero]

    - Using suggested_path to server path comparisons (LP: #1004603).

To post a comment you must log in.
Revision history for this message
Mike McCracken (mikemc) wrote :

Looks OK to me.

review: Approve
328. By Diego Sarmentero

[Mike McCracken]

    - Use qt4reactor on Darwin. (LP: #1013820)
    - Make run-tests script work on Darwin. (LP: #1010211)

[Roberto Alsina]

    - Enable folder list sorting (Fixes LP:1006385).

[Diego Sarmentero]

    - Using suggested_path to server path comparisons (LP: #1004603).

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bin/ubuntuone-control-panel-qt'
--- bin/ubuntuone-control-panel-qt 2012-03-01 17:47:54 +0000
+++ bin/ubuntuone-control-panel-qt 2012-06-20 19:10:48 +0000
@@ -22,7 +22,7 @@
22import signal22import signal
23import sys23import sys
2424
25if sys.platform == 'win32':25if sys.platform in ('win32', 'darwin'):
26 import qt4reactor26 import qt4reactor
27 qt4reactor.install()27 qt4reactor.install()
2828
2929
=== added file 'data/audio-x-generic.png'
30Binary files data/audio-x-generic.png 1970-01-01 00:00:00 +0000 and data/audio-x-generic.png 2012-06-20 19:10:48 +0000 differ30Binary files data/audio-x-generic.png 1970-01-01 00:00:00 +0000 and data/audio-x-generic.png 2012-06-20 19:10:48 +0000 differ
=== modified file 'data/qt/images.qrc'
--- data/qt/images.qrc 2012-05-14 21:05:08 +0000
+++ data/qt/images.qrc 2012-06-20 19:10:48 +0000
@@ -1,5 +1,6 @@
1<RCC>1<RCC>
2 <qresource prefix="/">2 <qresource prefix="/">
3 <file>../audio-x-generic.png</file>
3 <file>../banner.png</file>4 <file>../banner.png</file>
4 <file>../computer.png</file>5 <file>../computer.png</file>
5 <file>../external_icon_dark_grey.png</file>6 <file>../external_icon_dark_grey.png</file>
67
=== modified file 'run-tests'
--- run-tests 2012-04-25 13:35:35 +0000
+++ run-tests 2012-06-20 19:10:48 +0000
@@ -19,8 +19,9 @@
19QT_TESTS_PATH="ubuntuone/controlpanel/gui/qt/tests, ubuntuone/controlpanel/gui/qt/main/tests, ubuntuone/controlpanel/gui/qt/uniqueapp/tests"19QT_TESTS_PATH="ubuntuone/controlpanel/gui/qt/tests, ubuntuone/controlpanel/gui/qt/main/tests, ubuntuone/controlpanel/gui/qt/uniqueapp/tests"
20DBUS_TESTS_PATH=ubuntuone/controlpanel/dbustests20DBUS_TESTS_PATH=ubuntuone/controlpanel/dbustests
21WINDOWS_TESTS=test_windows.py21WINDOWS_TESTS=test_windows.py
22LINUX_TESTS=test_linux.py
23DARWIN_TESTS=test_darwin.py
2224
23set -e
2425
25if [ $# -ne 0 ]; then26if [ $# -ne 0 ]; then
26 # run specific module given by the caller27 # run specific module given by the caller
@@ -31,7 +32,7 @@
31fi32fi
3233
33style_check() {34style_check() {
34 u1lint --ignore ubuntuone/controlpanel/gui/qt/ui35 $u1lint --ignore ubuntuone/controlpanel/gui/qt/ui
35 if [ -x `which pep8` ]; then36 if [ -x `which pep8` ]; then
36 pep8 --exclude '.svn,CVS,.bzr,.hg,.git,*_ui.py,*_rc.py' --repeat . bin/*37 pep8 --exclude '.svn,CVS,.bzr,.hg,.git,*_ui.py,*_rc.py' --repeat . bin/*
37 else38 else
@@ -45,15 +46,39 @@
45 XVFB_CMDLINE="$XVFB -a"46 XVFB_CMDLINE="$XVFB -a"
46fi47fi
4748
49# now fail on errors, after we tried to find xvfb:
50set -e
51
52SYSNAME=`uname -s`
53
54if [ "$SYSNAME" == "Darwin" ]; then
55 u1trial="python $u1trial"
56 u1lint="python $u1lint"
57 IGNORE_FILES="$WINDOWS_TESTS, $LINUX_TESTS"
58 IGNORE_DBUS="-p $DBUS_TESTS_PATH"
59 echo "*** Skipping DBus test suite ***"
60 REACTOR=qt4
61 PYTHONPATH=$PYTHONPATH:../ubuntu-sso-client:../ubuntuone-client:../ubuntuone-storage-protocol:.
62else
63 # Linux:
64 if [ "x$XVFB_CMDLINE" == "x" ]; then
65 echo "WARNING: Could not find xvfb-run, prepare for visual spam."
66 fi
67 u1trial=u1trial
68 u1lint=u1lint
69 IGNORE_FILES="$WINDOWS_TESTS, $DARWIN_TESTS"
70 IGNORE_DBUS=""
71 echo "*** Running DBus test suite ***"
72 $u1trial --reactor=glib "$DBUS_TESTS_PATH"
73 REACTOR=gi
74fi
75
48echo "*** Running test suite for ""$MODULE"" ***"76echo "*** Running test suite for ""$MODULE"" ***"
49u1trial --reactor=gi -p "$DBUS_TESTS_PATH, $QT_TESTS_PATH" -i "$WINDOWS_TESTS" "$MODULE"77$u1trial --reactor=$REACTOR -p "$DBUS_TESTS_PATH, $QT_TESTS_PATH" -i "$IGNORE_FILES" "$MODULE"
50
51echo "*** Running DBus test suite ***"
52u1trial --reactor=glib "$DBUS_TESTS_PATH"
5378
54echo "*** Running QT test suite for ""$MODULE"" ***"79echo "*** Running QT test suite for ""$MODULE"" ***"
55./setup.py build80./setup.py build
56$XVFB_CMDLINE u1trial -i "$WINDOWS_TESTS" --reactor=qt4 --gui "$MODULE"81$XVFB_CMDLINE $u1trial $IGNORE_DBUS -i "$IGNORE_FILES" --reactor=qt4 --gui "$MODULE"
57rm -rf _trial_temp82rm -rf _trial_temp
58rm -rf build83rm -rf build
5984
6085
=== modified file 'ubuntuone/controlpanel/gui/qt/folders.py'
--- ubuntuone/controlpanel/gui/qt/folders.py 2012-05-14 18:50:12 +0000
+++ ubuntuone/controlpanel/gui/qt/folders.py 2012-06-20 19:10:48 +0000
@@ -80,10 +80,15 @@
8080
81def _process_name(name):81def _process_name(name):
82 """Tweak 'name' with a translatable music folder name."""82 """Tweak 'name' with a translatable music folder name."""
83 if name == MUSIC_REAL_PATH:83 if name.startswith('~/'):
84 suggested = name[2:]
85 else:
86 suggested = name
87
88 if suggested == MUSIC_REAL_PATH:
84 result = MUSIC_DISPLAY_NAME89 result = MUSIC_DISPLAY_NAME
85 else:90 else:
86 result = name91 result = suggested
87 return result92 return result
8893
8994
@@ -132,6 +137,9 @@
132 headers.setResizeMode(SUBSCRIPTION_COL, headers.ResizeToContents)137 headers.setResizeMode(SUBSCRIPTION_COL, headers.ResizeToContents)
133 headers.setResizeMode(EXPLORE_COL, headers.ResizeToContents)138 headers.setResizeMode(EXPLORE_COL, headers.ResizeToContents)
134139
140 self.ui.folders.setSortingEnabled(True)
141 self.ui.folders.sortByColumn(FOLDER_NAME_COL, QtCore.Qt.AscendingOrder)
142
135 self.ui.share_publish_button.setText(FOLDERS_MANAGE_LABEL)143 self.ui.share_publish_button.setText(FOLDERS_MANAGE_LABEL)
136 self.ui.share_publish_button.uri = MANAGE_FILES_LINK144 self.ui.share_publish_button.uri = MANAGE_FILES_LINK
137 QtGui.QApplication.instance().focusChanged.connect(self.focus_changed)145 QtGui.QApplication.instance().focusChanged.connect(self.focus_changed)
@@ -203,7 +211,8 @@
203 child.volume_path = volume['path']211 child.volume_path = volume['path']
204 child.volume_id = volume['volume_id']212 child.volume_id = volume['volume_id']
205213
206 name = _process_name(volume[u'display_name'])214 name = _process_name(volume.get(u'suggested_path',
215 volume[u'display_name']))
207 child.setText(FOLDER_NAME_COL, name)216 child.setText(FOLDER_NAME_COL, name)
208 child.setToolTip(FOLDER_NAME_COL, name)217 child.setToolTip(FOLDER_NAME_COL, name)
209 child.setToolTip(EXPLORE_COL, FOLDERS_COLUMN_EXPLORE)218 child.setToolTip(EXPLORE_COL, FOLDERS_COLUMN_EXPLORE)
@@ -505,21 +514,25 @@
505 for volume in volumes:514 for volume in volumes:
506 if (volume[u'type'] == self.backend.FOLDER_TYPE and515 if (volume[u'type'] == self.backend.FOLDER_TYPE and
507 bool(volume['subscribed'])):516 bool(volume['subscribed'])):
508 folders.append((volume['path'], volume['volume_id']))517 suggested = volume.get(u'suggested_path',
518 volume[u'display_name'])
519 folders.append((volume['path'], volume['volume_id'],
520 suggested))
509521
510 # add local folders only if they are valid522 # add local folders only if they are valid
511 for folder in default_folders(user_home=self.user_home):523 for folder in default_folders(user_home=self.user_home):
512 is_valid = yield self.backend.validate_path_for_folder(folder)524 is_valid = yield self.backend.validate_path_for_folder(folder)
513 if is_valid:525 if is_valid:
514 folders.append((folder, None))526 folders.append((folder, None, None))
515527
516 # always clear the items dict first, since clearing the folders528 # always clear the items dict first, since clearing the folders
517 # list will trigger "underlying C/C++ object has been deleted"529 # list will trigger "underlying C/C++ object has been deleted"
518 self.items.clear()530 self.items.clear()
519 self.ui.folders.clear()531 self.ui.folders.clear()
520532
521 for path, volume_id in folders:533 for path, volume_id, suggested in folders:
522 self.add_folder(folder_path=path, volume_id=volume_id)534 self.add_folder(folder_path=path, volume_id=volume_id,
535 suggested=suggested)
523536
524 if folders and not self.timer.isActive():537 if folders and not self.timer.isActive():
525 self.timer.start(2000)538 self.timer.start(2000)
@@ -552,20 +565,23 @@
552 self.changesApplied.emit()565 self.changesApplied.emit()
553566
554 @handle_errors(logger=logger)567 @handle_errors(logger=logger)
555 def add_folder(self, folder_path, volume_id=None):568 def add_folder(self, folder_path, volume_id=None, suggested=None):
556 """Add a folder to the list."""569 """Add a folder to the list."""
557 if folder_path in self.items:570 if folder_path in self.items:
558 logger.warning('LocalFoldersPanel: already have an item for %r.',571 logger.warning('LocalFoldersPanel: already have an item for %r.',
559 folder_path)572 folder_path)
560 return573 return
561574
562 if self.user_home is None:575 if suggested is None:
563 logger.warning('LocalFoldersPanel: user home is None! '576 logger.warning('LocalFoldersPanel: user home is None! '
564 'paths will not be pretty.')577 'paths will not be pretty.')
565 display_name = folder_path578 if self.user_home is None:
566 else:579 user_home = ''
567 user_home = self.user_home + os.path.sep580 else:
581 user_home = self.user_home + os.path.sep
568 display_name = _process_name(folder_path.replace(user_home, ''))582 display_name = _process_name(folder_path.replace(user_home, ''))
583 else:
584 display_name = _process_name(suggested)
569585
570 item = FolderItem([display_name, ""], path=folder_path,586 item = FolderItem([display_name, ""], path=folder_path,
571 queue=self.queue, volume_id=volume_id)587 queue=self.queue, volume_id=volume_id)
572588
=== modified file 'ubuntuone/controlpanel/gui/qt/main/__init__.py'
--- ubuntuone/controlpanel/gui/qt/main/__init__.py 2012-05-14 22:27:07 +0000
+++ ubuntuone/controlpanel/gui/qt/main/__init__.py 2012-06-20 19:10:48 +0000
@@ -29,12 +29,12 @@
29from ubuntuone.controlpanel.gui.qt.uniqueapp import UniqueApplication29from ubuntuone.controlpanel.gui.qt.uniqueapp import UniqueApplication
3030
31# Invalid name "source", pylint: disable=C010331# Invalid name "source", pylint: disable=C0103
32if sys.platform == 'win32':32if sys.platform in ('win32', 'darwin'):
33 from ubuntuone.controlpanel.gui.qt.main import windows33 from ubuntuone.controlpanel.gui.qt.main import twisted_main
34 source = windows34 source = twisted_main
35else:35else:
36 from ubuntuone.controlpanel.gui.qt.main import linux36 from ubuntuone.controlpanel.gui.qt.main import dbus_main
37 source = linux37 source = dbus_main
38# pylint: enable=C010338# pylint: enable=C0103
3939
4040
4141
=== renamed file 'ubuntuone/controlpanel/gui/qt/main/linux.py' => 'ubuntuone/controlpanel/gui/qt/main/dbus_main.py'
=== renamed file 'ubuntuone/controlpanel/gui/qt/main/windows.py' => 'ubuntuone/controlpanel/gui/qt/main/twisted_main.py'
--- ubuntuone/controlpanel/gui/qt/main/windows.py 2012-04-05 14:52:55 +0000
+++ ubuntuone/controlpanel/gui/qt/main/twisted_main.py 2012-06-20 19:10:48 +0000
@@ -14,7 +14,7 @@
14# You should have received a copy of the GNU General Public License along14# You should have received a copy of the GNU General Public License along
15# with this program. If not, see <http://www.gnu.org/licenses/>.15# with this program. If not, see <http://www.gnu.org/licenses/>.
1616
17"""Main method to be used on windows."""17"""Main method to be used on platforms without dbus."""
1818
19from PyQt4 import QtGui19from PyQt4 import QtGui
2020
2121
=== modified file 'ubuntuone/controlpanel/gui/qt/tests/test_folders.py'
--- ubuntuone/controlpanel/gui/qt/tests/test_folders.py 2012-05-14 18:50:12 +0000
+++ ubuntuone/controlpanel/gui/qt/tests/test_folders.py 2012-06-20 19:10:48 +0000
@@ -24,7 +24,7 @@
24import shutil24import shutil
25import sys25import sys
2626
27from PyQt4 import QtGui27from PyQt4 import QtCore, QtGui
28from twisted.internet import defer28from twisted.internet import defer
29from ubuntuone.devtools.handlers import MementoHandler29from ubuntuone.devtools.handlers import MementoHandler
30from ubuntuone.devtools.testcases import skipIfOS30from ubuntuone.devtools.testcases import skipIfOS
@@ -37,6 +37,7 @@
37 FAKE_VOLUMES_ONLY_ROOT_INFO,37 FAKE_VOLUMES_ONLY_ROOT_INFO,
38 MUSIC_FOLDER, MUSIC_PATH, ROOT, USER_HOME,38 MUSIC_FOLDER, MUSIC_PATH, ROOT, USER_HOME,
39)39)
40from ubuntuone.controlpanel.gui import MUSIC_REAL_PATH
40from ubuntuone.controlpanel.gui.qt import folders as gui41from ubuntuone.controlpanel.gui.qt import folders as gui
41from ubuntuone.controlpanel.gui.qt.tests import (42from ubuntuone.controlpanel.gui.qt.tests import (
42 BaseTestCase,43 BaseTestCase,
@@ -243,28 +244,21 @@
243244
244 def test_process_info(self):245 def test_process_info(self):
245 """The volumes info is processed when ready."""246 """The volumes info is processed when ready."""
247 folders = self.ui.ui.folders
246 self.ui.process_info(FAKE_VOLUMES_INFO)248 self.ui.process_info(FAKE_VOLUMES_INFO)
247 folders = self.ui.ui.folders
248
249 root = folders.invisibleRootItem()249 root = folders.invisibleRootItem()
250 self.assertEqual(len(FAKE_VOLUMES_INFO), root.childCount())250 self.assertEqual(len(FAKE_VOLUMES_INFO), root.childCount())
251251
252 treeiter = gui.QtGui.QTreeWidgetItemIterator(folders)
253 for name, _, volumes in FAKE_VOLUMES_INFO:252 for name, _, volumes in FAKE_VOLUMES_INFO:
254 name = _build_name(name)253 name = _build_name(name)
255254 items = folders.findItems(name, QtCore.Qt.MatchFixedString
256 # get first child, matching "My Folders"255 | QtCore.Qt.MatchCaseSensitive | QtCore.Qt.MatchRecursive,
257 item = treeiter.value()256 gui.FOLDER_NAME_COL)
258 self.assertFalse(item.is_empty)257 self.assertEqual(1, len(items))
259258 item = items[0]
260 self.assert_folder_group_header_correct(item, name)259 self.assert_folder_group_header_correct(item, name)
261
262 self.assertEqual(len(volumes), item.childCount())260 self.assertEqual(len(volumes), item.childCount())
263 sorted_vols = sorted(volumes, key=operator.itemgetter('path'))261 for volume in volumes:
264 for volume in sorted_vols:
265 treeiter += 1
266 item = treeiter.value() # get child folder
267 self.assertTrue(item is not None)
268262
269 name = volume['path'].replace(USER_HOME + os.path.sep, '')263 name = volume['path'].replace(USER_HOME + os.path.sep, '')
270 expected_path = volume['path']264 expected_path = volume['path']
@@ -277,12 +271,14 @@
277 else:271 else:
278 icon_name = gui.SHARE_ICON_NAME272 icon_name = gui.SHARE_ICON_NAME
279273
274 items = folders.findItems(name, QtCore.Qt.MatchFixedString |
275 QtCore.Qt.MatchCaseSensitive | QtCore.Qt.MatchRecursive,
276 gui.FOLDER_NAME_COL)
277 self.assertEqual(1, len(items))
278 item = items[0]
280 self.assert_folder_row_correct(item, name, icon_name, volume,279 self.assert_folder_row_correct(item, name, icon_name, volume,
281 tweaked_path=expected_path)280 tweaked_path=expected_path)
282281
283 treeiter += 1
284 item = treeiter.value()
285
286 def test_process_info_clears_the_list(self):282 def test_process_info_clears_the_list(self):
287 """The old volumes info is cleared before updated."""283 """The old volumes info is cleared before updated."""
288 self.ui.process_info(FAKE_VOLUMES_INFO)284 self.ui.process_info(FAKE_VOLUMES_INFO)
@@ -304,9 +300,10 @@
304300
305 child_index = 0301 child_index = 0
306 root = self.ui.ui.folders.invisibleRootItem()302 root = self.ui.ui.folders.invisibleRootItem()
307 for name, _, _ in FAKE_VOLUMES_NO_FREE_SPACE_INFO:303 names = [_build_name(name) for name, _, _ in
308 name = _build_name(name)304 FAKE_VOLUMES_NO_FREE_SPACE_INFO]
309305 names.sort(key=lambda x: x.lower())
306 for name in names:
310 item = root.child(child_index)307 item = root.child(child_index)
311 self.assertFalse(item.is_empty)308 self.assertFalse(item.is_empty)
312 self.assert_folder_group_header_correct(item, name)309 self.assert_folder_group_header_correct(item, name)
@@ -413,34 +410,23 @@
413 """Ensure that the inner widgets are in the correct tab order."""410 """Ensure that the inner widgets are in the correct tab order."""
414 self.ui.process_info(FAKE_VOLUMES_INFO)411 self.ui.process_info(FAKE_VOLUMES_INFO)
415 folders = self.ui.ui.folders412 folders = self.ui.ui.folders
416
417 widget = self.ui.ui.folders.nextInFocusChain()413 widget = self.ui.ui.folders.nextInFocusChain()
418 treeiter = gui.QtGui.QTreeWidgetItemIterator(folders)414 treeiter = gui.QtGui.QTreeWidgetItemIterator(folders)
419 for name, _, volumes in FAKE_VOLUMES_INFO:415 while treeiter.value():
420 item = treeiter.value()416 if treeiter.value().parent() is None: # Top-levels
421 sorted_vols = sorted(volumes, key=operator.itemgetter('path'))
422 for volume in sorted_vols:
423 treeiter += 1417 treeiter += 1
424 item = treeiter.value() # get child folder418 continue
425419 if self.ui.remote_folders:
426 name = volume['path'].replace(USER_HOME + os.path.sep, '')420 self.assertIsInstance(widget, QtGui.QCheckBox)
427 if volume['type'] == self.ui.backend.SHARE_TYPE:421 # ROOT volume has no checkbox
428 name = volume['name']422 elif treeiter.value().text(1) or self.ui.remote_folders:
429 self.assertEqual(unicode(item.text(gui.FOLDER_NAME_COL)), name)423 self.assertIsInstance(widget, QtGui.QPushButton)
430424 else:
431 actual_name = unicode(self.ui.widget_items[widget].text(0))425 self.assertIsInstance(widget, QtGui.QCheckBox)
432 if volume['type'] != self.ui.backend.ROOT_TYPE:426 widget = widget.nextInFocusChain()
433 self.assertIsInstance(widget, QtGui.QCheckBox)427 self.assertIsInstance(widget, QtGui.QPushButton)
434 self.assertEqual(actual_name, name)428 widget = widget.nextInFocusChain()
435 widget = widget.nextInFocusChain()
436
437 if not self.ui.remote_folders:
438 self.assertIsInstance(widget, QtGui.QPushButton)
439 self.assertEqual(actual_name, name)
440 widget = widget.nextInFocusChain()
441
442 treeiter += 1429 treeiter += 1
443 item = treeiter.value()
444430
445 def test_widget_dict(self):431 def test_widget_dict(self):
446 """Ensure the widget_items dictionary is full."""432 """Ensure the widget_items dictionary is full."""
@@ -994,13 +980,17 @@
994 def assert_folder_added(self, path, volume_id=None, item=None):980 def assert_folder_added(self, path, volume_id=None, item=None):
995 """A entry for 'path' was added to the folder list."""981 """A entry for 'path' was added to the folder list."""
996 folders = self.ui.ui.folders982 folders = self.ui.ui.folders
997 if item is None: # grab the last one added
998 item = folders.topLevelItem(folders.topLevelItemCount() - 1)
999983
1000 if path == MUSIC_PATH:984 if path == MUSIC_PATH:
1001 display_name = gui.MUSIC_DISPLAY_NAME985 display_name = gui.MUSIC_DISPLAY_NAME
1002 else:986 else:
1003 display_name = path.replace(USER_HOME + os.path.sep, '')987 display_name = path.replace(USER_HOME + os.path.sep, '')
988 if item is None: # search for it
989 items = folders.findItems(display_name,
990 QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive,
991 gui.FOLDER_NAME_COL)
992 self.assertEqual(len(items), 1)
993 item = items[0]
1004 self.assertEqual(display_name,994 self.assertEqual(display_name,
1005 unicode(item.text(gui.LOCAL_SUBSCRIPTION_COL)))995 unicode(item.text(gui.LOCAL_SUBSCRIPTION_COL)))
1006996
@@ -1093,10 +1083,6 @@
1093 # the following will execute update_sizes once1083 # the following will execute update_sizes once
1094 # will fill in all the path sizes for the already added folders1084 # will fill in all the path sizes for the already added folders
1095 self.timer.timeout.emit()1085 self.timer.timeout.emit()
1096
1097 folders = self.ui.ui.folders
1098 treeiter = gui.QtGui.QTreeWidgetItemIterator(folders)
1099
1100 volumes = []1086 volumes = []
1101 for _, _, vols in volumes_info:1087 for _, _, vols in volumes_info:
1102 volumes.extend(vols)1088 volumes.extend(vols)
@@ -1107,28 +1093,14 @@
1107 not bool(volume['subscribed'])):1093 not bool(volume['subscribed'])):
1108 # non-folders or unsubscribed should not appear in the tree1094 # non-folders or unsubscribed should not appear in the tree
1109 continue1095 continue
1110
1111 item = treeiter.value()
1112 self.assertTrue(item is not None)
1113 self.assert_folder_added(volume['path'],1096 self.assert_folder_added(volume['path'],
1114 volume_id=volume['volume_id'], item=item)1097 volume_id=volume['volume_id'])
1115
1116 treeiter += 1
1117 item = treeiter.value()
1118
1119 for folder in gui.default_folders(USER_HOME):1098 for folder in gui.default_folders(USER_HOME):
1120 valid = yield self.validate_path(folder)1099 valid = yield self.validate_path(folder)
1121 if not valid:1100 if not valid:
1122 continue # invalid folders should not appear in the tree1101 continue # invalid folders should not appear in the tree
11231102 self.assert_folder_added(folder, volume_id=None, item=None)
1124 item = treeiter.value()1103
1125 self.assertTrue(item is not None)
1126 self.assert_folder_added(folder, volume_id=None, item=item)
1127
1128 treeiter += 1
1129 item = treeiter.value()
1130
1131 self.assertTrue(item is None)
1132 self.assert_space_header_correct(ACCOUNT_INFO['quota_used'])1104 self.assert_space_header_correct(ACCOUNT_INFO['quota_used'])
11331105
1134 @defer.inlineCallbacks1106 @defer.inlineCallbacks
@@ -1219,13 +1191,13 @@
1219class LocalFoldersPanelAddFolderTestCase(BaseLocalFoldersPanelTestCase):1191class LocalFoldersPanelAddFolderTestCase(BaseLocalFoldersPanelTestCase):
1220 """Test suite for the add_folder method from LocalFoldersPanel."""1192 """Test suite for the add_folder method from LocalFoldersPanel."""
12211193
1222 def test_folder_is_added(self, folder_path=None):1194 def test_folder_is_added(self, folder_path=None, suggested=None):
1223 """Adding a folder adds it to the folder list."""1195 """Adding a folder adds it to the folder list."""
1224 former_count = self.ui.ui.folders.topLevelItemCount()1196 former_count = self.ui.ui.folders.topLevelItemCount()
12251197
1226 if folder_path is None:1198 if folder_path is None:
1227 folder_path = self.path1199 folder_path = self.path
1228 self.ui.add_folder(folder_path)1200 self.ui.add_folder(folder_path, suggested=suggested)
12291201
1230 new_count = self.ui.ui.folders.topLevelItemCount()1202 new_count = self.ui.ui.folders.topLevelItemCount()
1231 self.assertEqual(new_count, former_count + 1)1203 self.assertEqual(new_count, former_count + 1)
@@ -1233,7 +1205,14 @@
12331205
1234 def test_add_music_folder_adds_the_folder(self):1206 def test_add_music_folder_adds_the_folder(self):
1235 """Adding the purchased music folder adds it to the folder list."""1207 """Adding the purchased music folder adds it to the folder list."""
1236 self.test_folder_is_added(folder_path=MUSIC_PATH)1208 self.test_folder_is_added(folder_path=MUSIC_PATH,
1209 suggested=MUSIC_REAL_PATH)
1210
1211 def test_add_music_folder_adds_the_folder_with_suggested_path(self):
1212 """Adding the purchased music folder adds it to the folder list."""
1213 suggested_path = '~/' + MUSIC_REAL_PATH
1214 self.test_folder_is_added(folder_path=MUSIC_PATH,
1215 suggested=suggested_path)
12371216
1238 def test_do_not_add_twice(self):1217 def test_do_not_add_twice(self):
1239 """The same folder will not be added twice."""1218 """The same folder will not be added twice."""

Subscribers

People subscribed via source and target branches

to all changes: