Merge lp:~canonical-platform-qa/gallery-app/fix1381259-launch_fixture into lp:~canonical-platform-qa/gallery-app/clean_autopilot_setup

Proposed by Leo Arias
Status: Needs review
Proposed branch: lp:~canonical-platform-qa/gallery-app/fix1381259-launch_fixture
Merge into: lp:~canonical-platform-qa/gallery-app/clean_autopilot_setup
Prerequisite: lp:~canonical-platform-qa/gallery-app/fix1381273-no_tmp
Diff against target: 484 lines (+230/-87)
10 files modified
debian/control (+4/-2)
tests/autopilot/gallery_app/fixture_setup.py (+203/-0)
tests/autopilot/gallery_app/tests/__init__.py (+22/-76)
tests/autopilot/gallery_app/tests/test_album_editor.py (+0/-1)
tests/autopilot/gallery_app/tests/test_album_view.py (+0/-1)
tests/autopilot/gallery_app/tests/test_albums_view.py (+0/-2)
tests/autopilot/gallery_app/tests/test_events_view.py (+0/-2)
tests/autopilot/gallery_app/tests/test_photo_viewer.py (+0/-1)
tests/autopilot/gallery_app/tests/test_photos_view.py (+0/-1)
tests/autopilot/gallery_app/tests/test_picker_mode.py (+1/-1)
To merge this branch: bzr merge lp:~canonical-platform-qa/gallery-app/fix1381259-launch_fixture
Reviewer Review Type Date Requested Status
Canonical Platform QA Team Pending
Review via email: mp+238382@code.launchpad.net

Commit message

Use a fixture to launch the app on autopilot tests.

To post a comment you must log in.
1104. By Leo Arias

Link to the bug.

1105. By Leo Arias

Reverted the po changes.

1106. By Leo Arias

Pass arguments to the app.

1107. By Leo Arias

Fixed the db backup.

1108. By Leo Arias

Fixed typo.

1109. By Leo Arias

Fixed the fixture.

1110. By Leo Arias

Always configure the db.

1111. By Leo Arias

Fixed the path.

1112. By Leo Arias

Do not hide the folders.

1113. By Leo Arias

Copy instead of move.

1114. By Leo Arias

Fixed the copy.

1115. By Leo Arias

Do not copy database and thumbs to pictures.

Unmerged revisions

1115. By Leo Arias

Do not copy database and thumbs to pictures.

1114. By Leo Arias

Fixed the copy.

1113. By Leo Arias

Copy instead of move.

1112. By Leo Arias

Do not hide the folders.

1111. By Leo Arias

Fixed the path.

1110. By Leo Arias

Always configure the db.

1109. By Leo Arias

Fixed the fixture.

1108. By Leo Arias

Fixed typo.

1107. By Leo Arias

Fixed the db backup.

1106. By Leo Arias

Pass arguments to the app.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/control'
--- debian/control 2014-07-26 03:12:53 +0000
+++ debian/control 2014-10-22 17:53:30 +0000
@@ -49,10 +49,12 @@
49 gallery-app (>= ${source:Version}),49 gallery-app (>= ${source:Version}),
50 libautopilot-qt (>= 1.4),50 libautopilot-qt (>= 1.4),
51 libqt5test5,51 libqt5test5,
52 python3-autopilot,
53 python3-enum34,
54 python3-fixtures,
55 python3-pkg-resources,
52 ubuntu-ui-toolkit-autopilot,56 ubuntu-ui-toolkit-autopilot,
53 unity8-autopilot,57 unity8-autopilot,
54 python3-pkg-resources,
55 python3-autopilot,
56Description: Autopilot tests for the photo gallery for Ubuntu58Description: Autopilot tests for the photo gallery for Ubuntu
57 gallery-app is a photo gallery for the Ubuntu platform. This package contains59 gallery-app is a photo gallery for the Ubuntu platform. This package contains
58 autopilot tests for it.60 autopilot tests for it.
5961
=== renamed directory 'tests/autopilot/gallery_app/data/default/.database' => 'tests/autopilot/gallery_app/data/database'
=== renamed directory 'tests/autopilot/gallery_app/data/default/.thumbnails' => 'tests/autopilot/gallery_app/data/thumbnails'
=== added file 'tests/autopilot/gallery_app/fixture_setup.py'
--- tests/autopilot/gallery_app/fixture_setup.py 1970-01-01 00:00:00 +0000
+++ tests/autopilot/gallery_app/fixture_setup.py 2014-10-22 17:53:30 +0000
@@ -0,0 +1,203 @@
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2#
3# Copyright (C) 2014 Canonical Ltd.
4#
5# This file is part of gallery-app.
6#
7# gallery-app is free software: you can redistribute it and/or modify it under
8# the terms of the GNU General Public License as published by the Free Software
9# Foundation; version 3.
10#
11# gallery-app is distributed in the hope that it will be useful, but WITHOUT
12# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14# details.
15#
16# You should have received a copy of the GNU General Public License along with
17# this program. If not, see <http://www.gnu.org/licenses/>.
18
19import enum
20import logging
21import os
22import shutil
23
24import fixtures
25import ubuntuuitoolkit
26from autopilot import application
27
28
29logger = logging.getLogger(__name__)
30
31
32_BASE_CLASS = ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase
33
34
35class Launcher(enum.Enum):
36 local_binary = 1
37 installed_binary = 2
38 installed_click = 3
39
40
41class LaunchGalleryApp(fixtures.Fixture):
42
43 """Fixture to launch the Gallery App."""
44
45 def __init__(self, type_, binary_path=None, arguments=None):
46 """Initialize the fixture.
47
48 :param type_: The type of the launcher to use.
49 :type type_: One of the values of the Launcher enum.
50 :param string binary_path: The path to use with the
51 Launcher.installed_binary type. Not used for the other types.
52 :param arguments: The arguments to pass to the gallery.
53 :type arguments: A list of strings.
54
55 """
56 super().__init__()
57 arguments = [] if arguments is None else arguments
58 if type_ is Launcher.local_binary:
59 self.launcher = _LaunchLocalBinaryGalleryApp(
60 binary_path, arguments)
61 elif type_ is Launcher.installed_binary:
62 self.launcher = _LaunchInstalledBinaryGalleryApp(arguments)
63 elif type_ is Launcher.installed_click:
64 self.launcher = _LaunchInstalledClickGalleryApp(arguments)
65 else:
66 raise TypeError('Unknown launcher type: {}.'.format(type_))
67
68 def setUp(self):
69 super().setUp()
70 self.useFixture(self.launcher)
71 self.application_proxy = self.launcher.application_proxy
72
73
74class _LaunchLocalBinaryGalleryApp(fixtures.Fixture):
75
76 """Fixture to launch the Gallery App from the local binary."""
77
78 def __init__(self, binary_path, arguments):
79 super().__init__()
80 self.binary_path = binary_path
81 self.arguments = arguments
82
83 def setUp(self):
84 """Launch the application when the fixture is used."""
85 super().setUp()
86 self._copy_binary_to_right_location()
87 self.application_proxy = self._launch_application()
88
89 def _copy_binary_to_right_location(self):
90 # XXX workaround for bug http://pad.lv/1381312
91 workaround_binary_directory = os.path.abspath(os.path.join('..', '..'))
92 workaround_binary_path = os.path.join(
93 workaround_binary_directory, os.path.basename(self.binary_path))
94 shutil.copy(self.binary_path, workaround_binary_directory)
95 self.addCleanup(os.remove, workaround_binary_path)
96 self.binary_path = workaround_binary_path
97
98 def _launch_application(self):
99 logger.info('Launching gallery-app using the binary at {}.'.format(
100 self.binary_path))
101 application_launcher = self.useFixture(
102 application.NormalApplicationLauncher(emulator_base=_BASE_CLASS))
103 application_proxy = application_launcher.launch(
104 self.binary_path,
105 *self.arguments,
106 app_type='qt',
107 launch_dir=os.path.dirname(self.binary_path)
108 )
109 return application_proxy
110
111
112class _LaunchInstalledBinaryGalleryApp(fixtures.Fixture):
113
114 """Fixture to launch the Gallery App from the installed binary."""
115
116 def __init__(self, arguments):
117 super().__init__()
118 self.arguments = arguments
119
120 def setUp(self):
121 super().setUp()
122 """Launch the application when the fixture is used."""
123 self.application_proxy = self._launch_application()
124
125 def _launch_application(self):
126 logger.info('Launching gallery-app using the installed binary.')
127 application_launcher = self.useFixture(
128 application.UpstartApplicationLauncher(emulator_base=_BASE_CLASS))
129 application_proxy = application_launcher.launch(
130 'gallery-app', self.arguments)
131 return application_proxy
132
133
134class _LaunchInstalledClickGalleryApp(fixtures.Fixture):
135
136 """Fixture to launch the Gallery App from the installed click package."""
137
138 def __init__(self, arguments):
139 super().__init__()
140 self.arguments = arguments
141
142 def setUp(self):
143 super().setUp()
144 self.application_proxy = self._launch_application()
145
146 def _launch_application(self):
147 logger.info('Launching gallery-app using the installed click package.')
148 application_launcher = self.useFixture(
149 application.ClickApplicationLauncher(emulator_base=_BASE_CLASS))
150 if not arguments:
151 application_proxy = application_launcher.launch(
152 'com.ubuntu.gallery')
153 else:
154 application_proxy = self._launch_application_with_arguments(
155 application_launcher)
156
157 return application_proxy
158
159 def _launch_application_with_arguments(self, application_laucher):
160 # XXX We need a better way to start click packages with arguments.
161 # More discussion is required. --elopio - 2014-10-21
162 desktop_file_path = self.write_sandbox_desktop_file()
163 desktop_file_name = os.path.basename(desktop_file_path)
164 application_name, _ = os.path.splitext(desktop_file_name)
165 return application_launcher.launch(application_name)
166
167 def write_sandbox_desktop_file(self):
168 desktop_file_dir = self.get_local_desktop_file_directory()
169 desktop_file = tempfile.NamedTemporaryFile(
170 dir=desktop_file_dir, suffix='.desktop', mode='w+t', delete=False)
171 desktop_file.write('[Desktop Entry]\n')
172 version, installed_path = self.get_installed_version_and_directory()
173 gallery_exec = './gallery-app ' + ' '.join(arguments)
174 desktop_file_dict = {
175 'Type': 'Application',
176 'Name': 'gallery',
177 'Exec': gallery_exec,
178 'Icon': 'Not important',
179 'Path': installed_path
180 }
181 for key, value in desktop_file_dict.items():
182 desktop_file.write('{key}={value}\n'.format(key=key, value=value))
183 desktop_file.close()
184 return desktop_file.name
185
186 def get_local_desktop_file_directory(self):
187 return os.path.join(
188 os.environ.get('HOME'), '.local', 'share', 'applications')
189
190 def get_named_temporary_file(
191 self, dir=None, mode='w+t', delete=False, suffix=''):
192 # See https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1329141
193 return
194
195 def get_installed_version_and_directory(self):
196 db = Click.DB()
197 db.read()
198 package_name = 'com.ubuntu.gallery'
199 registry = Click.User.for_user(db, name=os.environ.get('USER'))
200 version = registry.get_version(package_name)
201 directory = registry.get_path(package_name)
202 return version, directory
203
0204
=== modified file 'tests/autopilot/gallery_app/tests/__init__.py'
--- tests/autopilot/gallery_app/tests/__init__.py 2014-10-15 04:39:20 +0000
+++ tests/autopilot/gallery_app/tests/__init__.py 2014-10-22 17:53:30 +0000
@@ -29,8 +29,9 @@
29from autopilot.testcase import AutopilotTestCase29from autopilot.testcase import AutopilotTestCase
30from autopilot.introspection import get_proxy_object_for_existing_process30from autopilot.introspection import get_proxy_object_for_existing_process
31from pkg_resources import resource_filename31from pkg_resources import resource_filename
32
33from ubuntuuitoolkit import emulators as toolkit_emulators32from ubuntuuitoolkit import emulators as toolkit_emulators
33
34from gallery_app import fixture_setup
34from gallery_app.emulators import main_screen35from gallery_app.emulators import main_screen
35from gallery_app.emulators.gallery_utils import GalleryUtils36from gallery_app.emulators.gallery_utils import GalleryUtils
3637
@@ -39,27 +40,21 @@
39logger = logging.getLogger(__name__)40logger = logging.getLogger(__name__)
4041
4142
42class EnvironmentTypes:
43 installed = "installed"
44 local = "local"
45 click = "click"
46
47
48class GalleryTestCase(AutopilotTestCase):43class GalleryTestCase(AutopilotTestCase):
4944
50 """A common test case class that provides several useful methods for45 """A common test case class that provides several useful methods for
51 gallery tests."""46 gallery tests."""
5247
48 arguments = []
49
53 sample_file_source = "/sample01.jpg"50 sample_file_source = "/sample01.jpg"
54 tap_press_time = 151 tap_press_time = 1
55 local_location = "../../src/gallery-app"52 local_location = os.path.abspath('../../src/gallery-app')
5653
57 _db = '~/.local/share/com.ubuntu.gallery/' \54 _db = '~/.local/share/com.ubuntu.gallery/' \
58 'database/gallery.sqlite'55 'database/gallery.sqlite'
59 _thumbs = '~/.cache/com.ubuntu.gallery/thumbnails'56 _thumbs = '~/.cache/com.ubuntu.gallery/thumbnails'
6057
61 ARGS = []
62
63 @property58 @property
64 def gallery_utils(self):59 def gallery_utils(self):
65 return GalleryUtils(self.app)60 return GalleryUtils(self.app)
@@ -73,17 +68,12 @@
73 gallery-app.68 gallery-app.
7469
75 """70 """
76 # Lets assume we are installed system wide if this file is somewhere71 if os.path.exists(self.local_location):
77 # in /usr72 return fixture_setup.Launcher.local_binary
78 if os.path.realpath(__file__).startswith("/usr/"):73 elif model() == 'Desktop':
79 return EnvironmentTypes.installed74 return fixture_setup.Launcher.installed_binary
80 if model() == 'Desktop':
81 return EnvironmentTypes.installed
82 else:75 else:
83 if os.path.exists(self.local_location):76 return fixture_setup.Launcher.installed_click
84 return EnvironmentTypes.local
85 else:
86 return EnvironmentTypes.click
8777
88 def _get_sample_destination_dir(self):78 def _get_sample_destination_dir(self):
89 pic_dir = os.path.expanduser("~/Pictures")79 pic_dir = os.path.expanduser("~/Pictures")
@@ -105,9 +95,9 @@
105 self.addCleanup(shutil.move, db_bak, db)95 self.addCleanup(shutil.move, db_bak, db)
106 if not os.path.exists(os.path.dirname(db)):96 if not os.path.exists(os.path.dirname(db)):
107 os.makedirs(os.path.dirname(db))97 os.makedirs(os.path.dirname(db))
108 mock_db = os.path.join(self.sample_destination_dir, '.database',98 mock_db = os.path.join(
109 'gallery_confined.sqlite')99 self.sample_dir, 'database', 'gallery_confined.sqlite')
110 shutil.move(mock_db, db)100 shutil.copy(mock_db, db)
111101
112 def configure_thumbnails(self):102 def configure_thumbnails(self):
113 thumbs = os.path.expanduser(self._thumbs)103 thumbs = os.path.expanduser(self._thumbs)
@@ -118,13 +108,13 @@
118 self.addCleanup(shutil.move, thumbs_bak, thumbs)108 self.addCleanup(shutil.move, thumbs_bak, thumbs)
119 if not os.path.exists(os.path.dirname(thumbs)):109 if not os.path.exists(os.path.dirname(thumbs)):
120 os.makedirs(os.path.dirname(thumbs))110 os.makedirs(os.path.dirname(thumbs))
121 mock_thumbs = os.path.join(self.sample_destination_dir, '.thumbnails')111 mock_thumbs = os.path.join(self.sample_dir, 'thumbnails')
122 shutil.move(mock_thumbs, thumbs)112 shutil.copytree(mock_thumbs, thumbs)
123113
124 def configure_sample_files(self, env_type):114 def configure_sample_files(self, env_type):
125 self.sample_dir = resource_filename('gallery_app', 'data')115 self.sample_dir = resource_filename('gallery_app', 'data')
126 self.sample_destination_dir = self._get_sample_destination_dir()116 self.sample_destination_dir = self._get_sample_destination_dir()
127 if (os.path.exists(self.sample_destination_dir)):117 if os.path.exists(self.sample_destination_dir):
128 shutil.rmtree(self.sample_destination_dir)118 shutil.rmtree(self.sample_destination_dir)
129 self.assertFalse(os.path.exists(self.sample_destination_dir))119 self.assertFalse(os.path.exists(self.sample_destination_dir))
130120
@@ -142,9 +132,8 @@
142 self.sample_file_source = \132 self.sample_file_source = \
143 default_data_dir + self.sample_file_source133 default_data_dir + self.sample_file_source
144134
145 if env_type == EnvironmentTypes.click:135 self.configure_db()
146 self.configure_db()136 self.configure_thumbnails()
147 self.configure_thumbnails()
148137
149 def do_reset_config(self):138 def do_reset_config(self):
150 config = os.path.expanduser(139 config = os.path.expanduser(
@@ -174,53 +163,10 @@
174 sleep(2)163 sleep(2)
175164
176 def launch_gallery_app(self, env_type):165 def launch_gallery_app(self, env_type):
177 if env_type == EnvironmentTypes.installed:166 launch_fixture = fixture_setup.LaunchGalleryApp(
178 self.launch_test_installed()167 env_type, self.local_location, self.arguments)
179 elif env_type == EnvironmentTypes.local:168 self.useFixture(launch_fixture)
180 self.launch_test_local()169 self.app = launch_fixture.application_proxy
181 elif env_type == EnvironmentTypes.click:
182 self.launch_test_click()
183 else:
184 raise ValueError("Unknown environment type: %s", env_type)
185
186 def launch_test_local(self):
187 logger.debug("Launching local gallery-app binary.")
188 self.app = self.launch_test_application(
189 self.local_location,
190 *self.ARGS,
191 emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase)
192
193 def launch_test_installed(self):
194 if model() == 'Desktop':
195 logger.debug(
196 "Launching installed gallery-app binary for desktop."
197 )
198 self.app = self.launch_test_application(
199 "gallery-app",
200 *self.ARGS,
201 emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase)
202 else:
203 logger.debug(
204 "Launching installed gallery-app binary for device."
205 )
206 self.ARGS.append("--desktop_file_hint="
207 "/usr/share/applications/gallery-app.desktop")
208 self.app = self.launch_test_application(
209 "gallery-app",
210 *self.ARGS,
211 app_type='qt',
212 emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase)
213
214 def launch_test_click(self):
215 '''
216 Since this test runs under confinement, the only location photos
217 are searchable in is ~/Pictures.
218 '''
219 logger.debug("Launching gallery-app via click package.")
220 self.app = self.launch_click_package(
221 package_id="com.ubuntu.gallery",
222 app_uris=' '.join(self.ARGS),
223 emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase)
224170
225 def ui_update(self):171 def ui_update(self):
226 """ Gives the program the time to update the UI"""172 """ Gives the program the time to update the UI"""
227173
=== modified file 'tests/autopilot/gallery_app/tests/test_album_editor.py'
--- tests/autopilot/gallery_app/tests/test_album_editor.py 2014-09-01 18:24:23 +0000
+++ tests/autopilot/gallery_app/tests/test_album_editor.py 2014-10-22 17:53:30 +0000
@@ -30,7 +30,6 @@
30 return MediaSelector(self.app)30 return MediaSelector(self.app)
3131
32 def setUp(self):32 def setUp(self):
33 self.ARGS = []
34 super(TestAlbumEditor, self).setUp()33 super(TestAlbumEditor, self).setUp()
35 self.switch_to_albums_tab()34 self.switch_to_albums_tab()
36 self.edit_first_album()35 self.edit_first_album()
3736
=== modified file 'tests/autopilot/gallery_app/tests/test_album_view.py'
--- tests/autopilot/gallery_app/tests/test_album_view.py 2014-09-03 21:13:03 +0000
+++ tests/autopilot/gallery_app/tests/test_album_view.py 2014-10-22 17:53:30 +0000
@@ -43,7 +43,6 @@
43 return PhotoViewer(self.app)43 return PhotoViewer(self.app)
4444
45 def setUp(self):45 def setUp(self):
46 self.ARGS = []
47 super(TestAlbumView, self).setUp()46 super(TestAlbumView, self).setUp()
48 self.switch_to_albums_tab()47 self.switch_to_albums_tab()
4948
5049
=== modified file 'tests/autopilot/gallery_app/tests/test_albums_view.py'
--- tests/autopilot/gallery_app/tests/test_albums_view.py 2014-08-27 02:41:33 +0000
+++ tests/autopilot/gallery_app/tests/test_albums_view.py 2014-10-22 17:53:30 +0000
@@ -28,8 +28,6 @@
28 return AlbumsView(self.app)28 return AlbumsView(self.app)
2929
30 def setUp(self):30 def setUp(self):
31 self.ARGS = []
32
33 self.envDesktopMode = env.get("DESKTOP_MODE")31 self.envDesktopMode = env.get("DESKTOP_MODE")
3432
35 if model() == "Desktop":33 if model() == "Desktop":
3634
=== modified file 'tests/autopilot/gallery_app/tests/test_events_view.py'
--- tests/autopilot/gallery_app/tests/test_events_view.py 2014-09-17 13:37:15 +0000
+++ tests/autopilot/gallery_app/tests/test_events_view.py 2014-10-22 17:53:30 +0000
@@ -30,8 +30,6 @@
30 return EventsView(self.app)30 return EventsView(self.app)
3131
32 def setUp(self):32 def setUp(self):
33 self.ARGS = []
34
35 self.envDesktopMode = env.get("DESKTOP_MODE")33 self.envDesktopMode = env.get("DESKTOP_MODE")
3634
37 if model() == "Desktop":35 if model() == "Desktop":
3836
=== modified file 'tests/autopilot/gallery_app/tests/test_photo_viewer.py'
--- tests/autopilot/gallery_app/tests/test_photo_viewer.py 2014-09-03 00:14:45 +0000
+++ tests/autopilot/gallery_app/tests/test_photo_viewer.py 2014-10-22 17:53:30 +0000
@@ -37,7 +37,6 @@
37 return EventsView(self.app)37 return EventsView(self.app)
3838
39 def setUp(self):39 def setUp(self):
40 self.ARGS = []
41 super(TestPhotoViewerBase, self).setUp()40 super(TestPhotoViewerBase, self).setUp()
42 self.main_view.switch_to_tab("eventsTab")41 self.main_view.switch_to_tab("eventsTab")
43 self.open_first_photo()42 self.open_first_photo()
4443
=== modified file 'tests/autopilot/gallery_app/tests/test_photos_view.py'
--- tests/autopilot/gallery_app/tests/test_photos_view.py 2014-08-26 21:54:25 +0000
+++ tests/autopilot/gallery_app/tests/test_photos_view.py 2014-10-22 17:53:30 +0000
@@ -30,7 +30,6 @@
30 return PhotosView(self.app)30 return PhotosView(self.app)
3131
32 def setUp(self):32 def setUp(self):
33 self.ARGS = []
34 self.envDesktopMode = env.get("DESKTOP_MODE")33 self.envDesktopMode = env.get("DESKTOP_MODE")
3534
36 if model() == "Desktop":35 if model() == "Desktop":
3736
=== modified file 'tests/autopilot/gallery_app/tests/test_picker_mode.py'
--- tests/autopilot/gallery_app/tests/test_picker_mode.py 2014-07-15 09:16:18 +0000
+++ tests/autopilot/gallery_app/tests/test_picker_mode.py 2014-10-22 17:53:30 +0000
@@ -23,7 +23,7 @@
23 return self.app.wait_select_single(PickerScreen)23 return self.app.wait_select_single(PickerScreen)
2424
25 def setUp(self):25 def setUp(self):
26 self.ARGS = ['--pick-mode']26 self.arguments = ['--pick-mode']
27 super(TestPickerMode, self).setUp()27 super(TestPickerMode, self).setUp()
2828
29 def select_first_event_media(self):29 def select_first_event_media(self):

Subscribers

People subscribed via source and target branches

to all changes: