Merge lp:~artmello/gallery-app/gallery-app-fix_autopilot_tests into lp:gallery-app

Proposed by Arthur Mello on 2015-04-14
Status: Merged
Approved by: Bill Filler on 2015-04-22
Approved revision: 1192
Merged at revision: 1191
Proposed branch: lp:~artmello/gallery-app/gallery-app-fix_autopilot_tests
Merge into: lp:gallery-app
Diff against target: 368 lines (+107/-78)
7 files modified
tests/autopilot/gallery_app/emulators/album_editor.py (+4/-4)
tests/autopilot/gallery_app/emulators/album_view.py (+10/-7)
tests/autopilot/gallery_app/emulators/gallery_utils.py (+6/-4)
tests/autopilot/gallery_app/emulators/photo_viewer.py (+59/-27)
tests/autopilot/gallery_app/emulators/picker_screen.py (+1/-0)
tests/autopilot/gallery_app/tests/test_album_editor.py (+0/-1)
tests/autopilot/gallery_app/tests/test_photo_viewer.py (+27/-35)
To merge this branch: bzr merge lp:~artmello/gallery-app/gallery-app-fix_autopilot_tests
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Needs Fixing on 2015-04-20
Federico Gimenez (community) 2015-04-15 Approve on 2015-04-15
Ubuntu Phablet Team 2015-04-14 Pending
Review via email: mp+256159@code.launchpad.net

Commit Message

Fix AP tests

Description of the Change

Fix AP tests

To post a comment you must log in.
1190. By Arthur Mello on 2015-04-15

Add another check to make sure remove from album dialog is fully open

Federico Gimenez (fgimenez) wrote :

Looks good in general and the tests are passing on krillin, someone else should check on mako.

You should double check the wait_select_single calls are used for elements that are not previously present in the ui (for those that are you should use select_single) and that the visible kwarg is used when needed (elements that appear eventually).

There are some flake8 minor issues (you can check them with 'python3 -m flake8.run .'), not a blocker.

Cheers!

review: Approve
1191. By Arthur Mello on 2015-04-15

Fix flake8 minor issues

1192. By Arthur Mello on 2015-04-20

Merge changes from lp:~canonical-platform-qa/gallery-app/clean_delete_autopilot_tests

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/autopilot/gallery_app/emulators/album_editor.py'
2--- tests/autopilot/gallery_app/emulators/album_editor.py 2015-02-17 10:23:02 +0000
3+++ tests/autopilot/gallery_app/emulators/album_editor.py 2015-04-20 20:01:35 +0000
4@@ -35,8 +35,8 @@
5 def album_title_entry_field(self):
6 """Returns the album title input box."""
7 editor = self.album_editor()
8- return editor.select_single("TextEditOnClick",
9- objectName="albumTitleField")
10+ return editor.wait_select_single("TextEditOnClick",
11+ objectName="albumTitleField")
12
13 def click_title_field(self):
14 self.pointing_device.click_object(self.album_title_entry_field())
15@@ -44,8 +44,8 @@
16 def album_subtitle_entry_field(self):
17 """Returns the album subtitle input box."""
18 editor = self.album_editor()
19- return editor.select_single("TextEditOnClick",
20- objectName="albumSubtitleField")
21+ return editor.wait_select_single("TextEditOnClick",
22+ objectName="albumSubtitleField")
23
24 def click_subtitle_field(self):
25 self.pointing_device.click_object(self.album_subtitle_entry_field())
26
27=== modified file 'tests/autopilot/gallery_app/emulators/album_view.py'
28--- tests/autopilot/gallery_app/emulators/album_view.py 2015-02-27 19:33:20 +0000
29+++ tests/autopilot/gallery_app/emulators/album_view.py 2015-04-20 20:01:35 +0000
30@@ -146,25 +146,28 @@
31
32 def _get_remove_from_album_popover_remove_item(self):
33 """Returns remove button of the remove from album popover."""
34- return self.app.select_single("Button",
35- objectName="removeFromAlbumButton",
36- visible=True)
37+ return self.app.wait_select_single("Button",
38+ objectName="removeFromAlbumButton",
39+ visible=True)
40
41 def _get_remove_from_album_popover_delete_item(self):
42 """Returns delete button of the remove from album popover."""
43- return self.app.select_single(
44+ return self.app.wait_select_single(
45 "Button",
46 objectName="removeFromAlbumAndDeleteButton",
47 visible=True)
48
49 def _get_remove_from_album_popover_cancel_item(self):
50 """Returns cancel button of the remove from album popover."""
51- return self.app.select_single("Button",
52- objectName="removeFromAlbumCancelButton",
53- visible=True)
54+ return self.app.wait_select_single(
55+ "Button",
56+ objectName="removeFromAlbumCancelButton",
57+ visible=True)
58
59 def _ensure_remove_from_album_dialog_is_open(self):
60 """Ensure that the remove from album dialog is fully opened."""
61+ self.assertThat(self._remove_from_album_dialog_shown,
62+ Eventually(Is(True)))
63 remove_dialog = self._get_remove_from_album_dialog()
64 self.assertThat(remove_dialog.visible, Eventually(Equals(True)))
65 self.assertThat(remove_dialog.opacity, Eventually(Equals(1)))
66
67=== modified file 'tests/autopilot/gallery_app/emulators/gallery_utils.py'
68--- tests/autopilot/gallery_app/emulators/gallery_utils.py 2015-02-16 22:52:55 +0000
69+++ tests/autopilot/gallery_app/emulators/gallery_utils.py 2015-04-20 20:01:35 +0000
70@@ -69,13 +69,15 @@
71
72 def get_delete_dialog_delete_button(self):
73 """Returns the delete button of the delete popover."""
74- return self.app.select_single("Button", objectName="deleteDialogYes",
75- visible=True)
76+ return self.app.wait_select_single("Button",
77+ objectName="deleteDialogYes",
78+ visible=True)
79
80 def get_delete_dialog_cancel_button(self):
81 """Returns the cancel button of the delete popover."""
82- return self.app.select_single("Button", objectName="deleteDialogNo",
83- visible=True)
84+ return self.app.wait_select_single("Button",
85+ objectName="deleteDialogNo",
86+ visible=True)
87
88 def get_all_albums(self):
89 """Returns all albums in the albums view"""
90
91=== modified file 'tests/autopilot/gallery_app/emulators/photo_viewer.py'
92--- tests/autopilot/gallery_app/emulators/photo_viewer.py 2015-03-02 14:55:22 +0000
93+++ tests/autopilot/gallery_app/emulators/photo_viewer.py 2015-04-20 20:01:35 +0000
94@@ -5,7 +5,54 @@
95 # under the terms of the GNU General Public License version 3, as published
96 # by the Free Software Foundation.
97
98-from gallery_app.emulators.gallery_utils import GalleryUtils
99+import logging
100+
101+import autopilot.logging
102+import ubuntuuitoolkit
103+
104+from gallery_app.emulators import main_screen
105+from gallery_app.emulators.gallery_utils import(
106+ GalleryAppException,
107+ GalleryUtils
108+)
109+
110+
111+logger = logging.getLogger(__name__)
112+
113+
114+class PopupPhotoViewer(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
115+
116+ @autopilot.logging.log_action(logger.info)
117+ def delete_current_photo(self, confirm=True):
118+ header = self.get_root_instance().select_single(
119+ main_screen.MainScreen).get_header()
120+ header.click_action_button("deleteButton")
121+ if confirm:
122+ self.confirm_delete_photo()
123+ else:
124+ self.cancel_delete_photo()
125+
126+ @autopilot.logging.log_action(logger.debug)
127+ def confirm_delete_photo(self):
128+ self._click_delete_dialog_button("Yes")
129+
130+ def _click_delete_dialog_button(self, name):
131+ delete_dialog = self._get_delete_dialog()
132+ button = delete_dialog.wait_select_single(
133+ "Button", objectName="deletePhotoDialog" + name, visible=True)
134+ self.pointing_device.click_object(button)
135+ delete_dialog.wait_until_destroyed()
136+
137+ def _get_delete_dialog(self):
138+ delete_dialog = self.get_root_instance().wait_select_single(
139+ objectName="deletePhotoDialog")
140+ delete_dialog.visible.wait_for(True)
141+ delete_dialog.opacity.wait_for(1)
142+ return delete_dialog
143+
144+ @autopilot.logging.log_action(logger.debug)
145+ def cancel_delete_photo(self):
146+ self._click_delete_dialog_button('No')
147
148
149 class PhotoViewer(GalleryUtils):
150@@ -14,16 +61,6 @@
151 super(PhotoViewer, self).__init__(self)
152 self.app = app
153
154- def get_delete_dialog(self):
155- """Returns the photo viewer delete dialog."""
156- return self.app.wait_select_single("Dialog",
157- objectName="deletePhotoDialog")
158-
159- def delete_dialog_shown(self):
160- dialog = self.app.select_many("Dialog",
161- objectName="deletePhotoDialog")
162- return len(dialog) >= 1
163-
164 def get_popup_album_picker(self):
165 """Returns the photo viewer album pickers."""
166 return self.app.wait_select_single("PopupAlbumPicker",
167@@ -54,16 +91,16 @@
168 def get_cancel_revert_to_original_button(self):
169 """Returns the revert to original cancel button."""
170 return self.get_revert_to_original_dialog().wait_select_single(
171- "Button",
172- objectName="cancelRevertButton",
173- visible=True)
174+ "Button",
175+ objectName="cancelRevertButton",
176+ visible=True)
177
178 def get_confirm_revert_to_original_button(self):
179 """Returns the revert to original confirm button."""
180 return self.get_revert_to_original_dialog().wait_select_single(
181- "Button",
182- objectName="confirmRevertButton",
183- visible=True)
184+ "Button",
185+ objectName="confirmRevertButton",
186+ visible=True)
187
188 def get_photo_component(self):
189 # Was using a list index (lp:1247711). Still needs fixing, I'm not
190@@ -78,7 +115,8 @@
191
192 def get_editor_actions_bar(self):
193 """Returns the actions bar for the editor."""
194- return self.app.select_single("ActionsBar", objectName="editorActionsBar")
195+ return self.app.select_single("ActionsBar",
196+ objectName="editorActionsBar")
197
198 def get_editor_action_button_by_text(self, button_text):
199 """Returns the action button from the editor by text."""
200@@ -114,17 +152,11 @@
201 """Returns the 'auto enhance' menu item in the edit dialog."""
202 return self.app.select_single("Standard", objectName='enhanceListItem')
203
204- def get_delete_popover_delete_item(self):
205- """Returns the delete button of the delete popover."""
206- return self.app.select_single("Button",
207- objectName="deletePhotoDialogYes",
208- visible=True)
209-
210 def get_delete_popover_cancel_item(self):
211 """Returns the cancel button of the delete popover."""
212- return self.app.select_single("Button",
213- objectName="deletePhotoDialogNo",
214- visible=True)
215+ return self.app.wait_select_single("Button",
216+ objectName="deletePhotoDialogNo",
217+ visible=True)
218
219 def get_opened_photo(self):
220 """Returns the first opened photo."""
221
222=== modified file 'tests/autopilot/gallery_app/emulators/picker_screen.py'
223--- tests/autopilot/gallery_app/emulators/picker_screen.py 2015-04-08 16:42:43 +0000
224+++ tests/autopilot/gallery_app/emulators/picker_screen.py 2015-04-20 20:01:35 +0000
225@@ -6,6 +6,7 @@
226 # by the Free Software Foundation.
227
228 from ubuntuuitoolkit import emulators as toolkit_emulators
229+from gallery_app.emulators.gallery_utils import GalleryAppException
230
231
232 class PickerScreen(toolkit_emulators.MainView):
233
234=== modified file 'tests/autopilot/gallery_app/tests/test_album_editor.py'
235--- tests/autopilot/gallery_app/tests/test_album_editor.py 2015-02-17 10:23:02 +0000
236+++ tests/autopilot/gallery_app/tests/test_album_editor.py 2015-04-20 20:01:35 +0000
237@@ -56,7 +56,6 @@
238 text = "Ubuntu"
239 self.assertThat(subtitle_field.text, Eventually(Equals(text)))
240
241- sleep(5)
242 editor.click_title_field()
243 self.assertThat(title_field.activeFocus, Eventually(Equals(True)))
244 self.keyboard.press_and_release("Ctrl+a")
245
246=== modified file 'tests/autopilot/gallery_app/tests/test_photo_viewer.py'
247--- tests/autopilot/gallery_app/tests/test_photo_viewer.py 2015-04-08 05:16:08 +0000
248+++ tests/autopilot/gallery_app/tests/test_photo_viewer.py 2015-04-20 20:01:35 +0000
249@@ -8,12 +8,12 @@
250
251 """Tests the Photo editor of the gallery app."""
252
253-from testtools.matchers import Equals, NotEquals, GreaterThan, Is
254+from testtools.matchers import Equals, NotEquals, GreaterThan
255 from autopilot.matchers import Eventually
256 from testtools import skipIf
257 from autopilot.platform import model
258
259-from gallery_app.emulators.photo_viewer import PhotoViewer
260+from gallery_app.emulators import photo_viewer
261 from gallery_app.emulators.media_viewer import MediaViewer
262 from gallery_app.emulators.events_view import EventsView
263 from gallery_app.tests import GalleryTestCase
264@@ -31,7 +31,7 @@
265 class TestMediaViewerBase(GalleryTestCase):
266 @property
267 def photo_viewer(self):
268- return PhotoViewer(self.app)
269+ return photo_viewer.PhotoViewer(self.app)
270
271 @property
272 def events_view(self):
273@@ -93,16 +93,6 @@
274 photo_viewer_loader = self.photo_viewer.get_main_photo_viewer_loader()
275 self.assertThat(photo_viewer_loader.source, Equals(""))
276
277- def get_delete_dialog(self):
278- delete_dialog = self.photo_viewer.get_delete_dialog()
279- self.assertThat(delete_dialog.visible, Eventually(Equals(True)))
280- self.assertThat(delete_dialog.opacity, Eventually(Equals(1)))
281- return delete_dialog
282-
283- def ensure_closed_delete_dialog(self):
284- self.assertThat(self.photo_viewer.delete_dialog_shown,
285- Eventually(Is(False)))
286-
287 def test_nav_bar_back_button(self):
288 """Clicking the back button must close the photo."""
289 self.main_view.get_header().click_custom_back_button()
290@@ -120,38 +110,40 @@
291 self.click_item(cancel_button)
292 self.assertThat(share_picker.visible, Eventually(Equals(False)))
293
294- def delete_one_picture(self):
295- self.main_view.get_header().click_action_button("deleteButton")
296- self.get_delete_dialog()
297- delete_item = self.photo_viewer.get_delete_popover_delete_item()
298- self.click_item(delete_item)
299- self.ensure_closed_delete_dialog()
300+ def test_delete_photo_must_remove_it_from_filesystem(self):
301+ photo_component = self.main_view.select_single('GalleryPhotoComponent')
302+ source = photo_component.source
303+ file_path = source[len('image://thumbnailer/file://'):]
304+ self.assertTrue(os.path.exists(file_path))
305+
306+ photo_viewer_popup = self.main_view.select_single(
307+ photo_viewer.PopupPhotoViewer)
308+ photo_viewer_popup.delete_current_photo()
309+
310+ self.assertFalse(os.path.exists(file_path))
311
312 def test_photo_delete_works(self):
313 """Clicking the trash button must show the delete dialog."""
314- self.main_view.get_header().click_action_button("deleteButton")
315- self.get_delete_dialog()
316-
317- photo_viewer = self.photo_viewer.get_main_photo_viewer()
318-
319- cancel_item = self.photo_viewer.get_delete_popover_cancel_item()
320- self.click_item(cancel_item)
321- self.ensure_closed_delete_dialog()
322+ # XXX This test must be split into multiple QML tests.
323+ # --elopio - 2015-14-16
324+ photo_viewer_popup = self.main_view.select_single(
325+ photo_viewer.PopupPhotoViewer)
326+ photo_viewer_popup.delete_current_photo(confirm=False)
327
328 self.assertThat(lambda: os.path.exists(self.sample_file),
329 Eventually(Equals(True)))
330
331- self.delete_one_picture()
332+ photo_viewer_popup.delete_current_photo()
333 self.assertThat(lambda: os.path.exists(self.sample_file),
334 Eventually(Equals(False)))
335
336 # Delete all other pictures and make sure the photo viewer closes
337- self.delete_one_picture()
338- self.delete_one_picture()
339- self.delete_one_picture()
340- self.delete_one_picture()
341+ photo_viewer_popup.delete_current_photo()
342+ photo_viewer_popup.delete_current_photo()
343+ photo_viewer_popup.delete_current_photo()
344+ photo_viewer_popup.delete_current_photo()
345
346- self.assertThat(photo_viewer.visible, Eventually(Equals(False)))
347+ self.assertThat(photo_viewer_popup.visible, Eventually(Equals(False)))
348
349 def test_nav_bar_album_picker_button(self):
350 """Clicking the album picker must show the picker dialog."""
351@@ -208,7 +200,7 @@
352 video_file = "video.mp4"
353 shutil.copyfile(self.sample_dir+"/option01/"+video_file,
354 self.sample_destination_dir+"/"+video_file)
355-
356+
357 self.assertThat(
358 lambda: self.events_view.number_of_events(),
359 Eventually(Equals(num_events + 1))
360@@ -221,7 +213,7 @@
361 sleep(1)
362 photo_viewer = self.photo_viewer.get_main_photo_viewer()
363 self.assertThat(photo_viewer.visible, Eventually(Equals(True)))
364- photo_component = self.photo_viewer.get_photo_component()
365+ photo_component = self.photo_viewer.get_photo_component()
366 self.assertThat(photo_component.imageReady, Eventually(Equals(True)))
367
368 os.remove(self.sample_destination_dir+"/"+video_file)

Subscribers

People subscribed via source and target branches