[pitivi] Get rid of sendFakeEvent methods



commit 1d7ae6687a1bf1ab4f137bba0d5a0110523918fd
Author: Alexandru Băluț <alexandru balut gmail com>
Date:   Thu Oct 6 20:13:29 2016 +0200

    Get rid of sendFakeEvent methods
    
    Use instead mocks, to avoid having testing code in the app.
    
    Reviewed-by: Thibault Saunier <tsaunier gnome org>
    Differential Revision: https://phabricator.freedesktop.org/D1375

 pitivi/timeline/elements.py     |   10 +----
 pitivi/timeline/timeline.py     |   47 ++++-----------------
 pitivi/utils/validate.py        |   86 ++++++++++++++++++++-------------------
 tests/common.py                 |   19 ++++-----
 tests/test_timeline_timeline.py |   37 +++++++++--------
 tests/test_undo_timeline.py     |   32 ++++++++------
 6 files changed, 101 insertions(+), 130 deletions(-)
---
diff --git a/pitivi/timeline/elements.py b/pitivi/timeline/elements.py
index dd6ddc7..766106d 100644
--- a/pitivi/timeline/elements.py
+++ b/pitivi/timeline/elements.py
@@ -887,7 +887,7 @@ class Clip(Gtk.EventBox, Zoomable, Loggable):
             self.__connectToChild(child)
 
         # Connect to Widget signals.
-        self.connect("button-release-event", self.__buttonReleaseEventCb)
+        self.connect("button-release-event", self._button_release_event_cb)
         self.connect("event", self._eventCb)
 
         # Connect to GES signals.
@@ -1005,17 +1005,11 @@ class Clip(Gtk.EventBox, Zoomable, Loggable):
         for handle in self.handles:
             handle.shrink()
 
-    def sendFakeEvent(self, event, event_widget):
-        if event.type == Gdk.EventType.BUTTON_RELEASE:
-            self.__buttonReleaseEventCb(event_widget, event)
-
-        self.timeline.sendFakeEvent(event, event_widget)
-
     def do_draw(self, cr):
         self.updatePosition()
         Gtk.EventBox.do_draw(self, cr)
 
-    def __buttonReleaseEventCb(self, unused_widget, event):
+    def _button_release_event_cb(self, unused_widget, event):
         if self.timeline.got_dragged:
             # This means a drag & drop operation just finished and
             # this button-release-event should be ignored.
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index e69cad9..e2ecbcf 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -128,15 +128,16 @@ class Marquee(Gtk.Box, Loggable):
         self.set_visible(False)
 
     def setStartPosition(self, event):
-        event_widget = self._timeline.get_event_widget(event)
+        event_widget = Gtk.get_event_widget(event)
         x, y = event_widget.translate_coordinates(self._timeline, event.x, event.y)
 
         self.start_x, self.start_y = self._timeline.adjustCoords(x=x, y=y)
 
     def move(self, event):
-        event_widget = self._timeline.get_event_widget(event)
+        event_widget = Gtk.get_event_widget(event)
 
-        x, y = self._timeline.adjustCoords(coords=event_widget.translate_coordinates(self._timeline, 
event.x, event.y))
+        coords = event_widget.translate_coordinates(self._timeline, event.x, event.y)
+        x, y = self._timeline.adjustCoords(coords=coords)
 
         start_x = min(x, self.start_x)
         start_y = min(y, self.start_y)
@@ -245,7 +246,6 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
         self.get_style_context().add_class("Timeline")
         self.props.expand = True
         self.get_accessible().set_name("timeline canvas")
-        self.__fake_event_widget = None
 
         # A lot of operations go through these callbacks.
         self.add_events(Gdk.EventType.BUTTON_PRESS | Gdk.EventType.BUTTON_RELEASE)
@@ -314,28 +314,6 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
     def controls_width(self):
         return self.__layers_controls_vbox.get_allocated_width()
 
-    def sendFakeEvent(self, event, event_widget=None):
-        # Member usefull for testsing
-        self.__fake_event_widget = event_widget
-
-        self.info("Faking %s", event)
-        if event.type == Gdk.EventType.BUTTON_PRESS:
-            self._button_press_event_cb(self, event)
-        elif event.type == Gdk.EventType.BUTTON_RELEASE:
-            self._button_release_event_cb(self, event)
-        elif event.type == Gdk.EventType.MOTION_NOTIFY:
-            self._motion_notify_event_cb(self, event)
-        else:
-            self.parent.sendFakeEvent(event)
-
-        self.__fake_event_widget = None
-
-    def get_event_widget(self, event):
-        if self.__fake_event_widget:
-            return self.__fake_event_widget
-
-        return Gtk.get_event_widget(event)
-
     def resetSelectionGroup(self):
         self.debug("Reset selection group")
         if self.current_group:
@@ -567,7 +545,7 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
                 self.error("Could not handle %s scroll event", direction)
                 return False
 
-        event_widget = self.get_event_widget(event)
+        event_widget = Gtk.get_event_widget(event)
         x, y = event_widget.translate_coordinates(self, event.x, event.y)
         if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
             if delta_y > 0:
@@ -628,7 +606,7 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
         self.debug("PRESSED %s", event)
         self.app.gui.focusTimeline()
 
-        event_widget = self.get_event_widget(event)
+        event_widget = Gtk.get_event_widget(event)
 
         res, button = event.get_button()
         if res and button == 1:
@@ -702,10 +680,10 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
                 return False
 
             if self.got_dragged or self.__drag_start_x != event.x:
-                self.__dragUpdate(self.get_event_widget(event), event.x, event.y)
+                self.__dragUpdate(Gtk.get_event_widget(event), event.x, event.y)
                 self.got_dragged = True
         elif self.__moving_layer:
-            event_widget = self.get_event_widget(event)
+            event_widget = Gtk.get_event_widget(event)
             unused_x, y = event_widget.translate_coordinates(self, event.x, event.y)
             layer, unused_on_sep = self._get_layer_at(
                 y, prefer_ges_layer=self.__moving_layer,
@@ -723,7 +701,7 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
         return False
 
     def _seek(self, event):
-        event_widget = self.get_event_widget(event)
+        event_widget = Gtk.get_event_widget(event)
         x, unused_y = event_widget.translate_coordinates(self, event.x, event.y)
         x -= self.controls_width
         x += self.hadj.get_value()
@@ -1724,13 +1702,6 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
 
     # Gtk widget virtual methods
 
-    def sendFakeEvent(self, event):
-        self.info("Faking %s", event)
-        if event.type == Gdk.EventType.KEY_PRESS:
-            self.do_key_press_event(event)
-        elif event.type == Gdk.EventType.KEY_RELEASE:
-            self.do_key_release_event(event)
-
     def do_key_press_event(self, event):
         # This is used both for changing the selection modes and for affecting
         # the seek keyboard shortcuts further below
diff --git a/pitivi/utils/validate.py b/pitivi/utils/validate.py
index e54be74..a6b1cee 100644
--- a/pitivi/utils/validate.py
+++ b/pitivi/utils/validate.py
@@ -18,6 +18,7 @@
 # Boston, MA 02110-1301, USA.
 import locale
 import subprocess
+from unittest import mock
 
 import gi
 from gi.repository import Gdk
@@ -26,9 +27,7 @@ from gi.repository import GLib
 from gi.repository import Gst
 from gi.repository import Gtk
 
-from pitivi.utils import timeline as timelineUtils
-from pitivi.utils import ui
-
+from pitivi.utils.timeline import Zoomable
 
 CAT = "validate"
 
@@ -47,16 +46,16 @@ has_validate = False
 
 def Event(event_type, **kwargs):
     event_types_constructors = {
-        Gdk.EventType.BUTTON_PRESS: Gdk.EventButton.new,
-        Gdk.EventType.BUTTON_RELEASE: Gdk.EventButton.new,
-        Gdk.EventType.MOTION_NOTIFY: Gdk.EventMotion.new
+        Gdk.EventType.BUTTON_PRESS: Gdk.EventButton,
+        Gdk.EventType.BUTTON_RELEASE: Gdk.EventButton,
+        Gdk.EventType.KEY_PRESS: Gdk.EventKey,
+        Gdk.EventType.KEY_RELEASE: Gdk.EventKey,
+        Gdk.EventType.MOTION_NOTIFY: Gdk.EventMotion
     }
 
-    try:
-        event = event_types_constructors[event_type](event_type)
-    except KeyError:
-        event = Gdk.Event.new(event_type)
-
+    constructor = event_types_constructors[event_type]
+    event = constructor()
+    event.type = event_type
     for arg, value in kwargs.items():
         setattr(event, arg, value)
 
@@ -220,11 +219,11 @@ def _releaseButtonIfNeeded(scenario, action, timeline, container, edge, layer_pr
 
     if next_action is None or need_release:
         scenario.dragging = False
-        event = Gdk.EventButton.new(Gdk.EventType.BUTTON_RELEASE)
-        event.button = 1
-        event.x = timelineUtils.Zoomable.nsToPixelAccurate(position)
-        event.y = y
-        container.ui.sendFakeEvent(event, container.ui)
+        x = Zoomable.nsToPixelAccurate(position)
+        event = Event(Gdk.EventType.BUTTON_RELEASE, button=1, x=x, y=y)
+        with mock.patch.object(Gtk, "get_event_widget") as get_event_widget:
+            get_event_widget.return_value = container.ui
+            container.ui._button_release_event_cb(None, event)
 
         if layer_prio > 0 and container.get_layer().get_priority() != layer_prio:
             scenario.report_simple(GLib.quark_from_string("scenario::execution-error"),
@@ -238,18 +237,17 @@ def _releaseButtonIfNeeded(scenario, action, timeline, container, edge, layer_pr
 
 def cleanEditModes(timeline, scenario):
     if scenario.last_mode == GES.EditMode.EDIT_RIPPLE:
-        timeline.ui.sendFakeEvent(Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Shift_L))
+        event = Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Shift_L)
+        timeline.ui.get_parent().do_key_release_event(event)
     elif scenario.last_mode == GES.EditMode.EDIT_ROLL:
-        timeline.ui.sendFakeEvent(Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Control_L))
+        event = Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Control_L)
+        timeline.ui.get_parent().do_key_release_event(event)
 
     scenario.last_mode = None
 
 
 def setEditingMode(timeline, scenario, action):
-    try:
-        mode = scenario.last_mode
-        mode
-    except AttributeError:
+    if not hasattr(scenario, "last_mode"):
         scenario.last_mode = None
 
     try:
@@ -262,16 +260,16 @@ def setEditingMode(timeline, scenario, action):
         mode = GES.EditMode.EDIT_NORMAL
 
     if mode == GES.EditMode.EDIT_RIPPLE:
-        timeline.ui.sendFakeEvent(Event(Gdk.EventType.KEY_PRESS, keyval=Gdk.KEY_Shift_L))
+        timeline.ui.get_parent().do_key_press_event(Event(Gdk.EventType.KEY_PRESS, keyval=Gdk.KEY_Shift_L))
 
         if scenario.last_mode == GES.EditMode.EDIT_ROLL:
-            timeline.ui.sendFakeEvent(Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Control_L))
+            timeline.ui.get_parent().do_key_release_event(Event(Gdk.EventType.KEY_RELEASE, 
keyval=Gdk.KEY_Control_L))
 
     elif mode == GES.EditMode.EDIT_ROLL:
-        timeline.ui.sendFakeEvent(Event(Gdk.EventType.KEY_PRESS, keyval=Gdk.KEY_Control_L))
+        timeline.ui.do_key_press_event(Event(Gdk.EventType.KEY_PRESS, keyval=Gdk.KEY_Control_L))
 
         if scenario.last_mode == GES.EditMode.EDIT_RIPPLE:
-            timeline.ui.sendFakeEvent(Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Shift_L))
+            timeline.ui.do_key_release_event(Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Shift_L))
     else:
         cleanEditModes(timeline, scenario)
 
@@ -332,25 +330,26 @@ def editContainer(scenario, action):
 
     if not hasattr(scenario, "dragging") or scenario.dragging is False \
             or scenario.last_edge != edge:
-        widget = container.ui
         event_widget = container.ui
         if isinstance(container, GES.SourceClip):
             if edge == GES.Edge.EDGE_START:
                 event_widget = container.ui.leftHandle
-                event = timeline
             elif edge == GES.Edge.EDGE_END:
                 event_widget = container.ui.rightHandle
-                event = timeline
 
         scenario.dragging = True
         event = Event(Gdk.EventType.BUTTON_PRESS, button=1, y=y)
-        widget.sendFakeEvent(event, event_widget)
+        with mock.patch.object(Gtk, "get_event_widget") as get_event_widget:
+            get_event_widget.return_value = event_widget
+            timeline.ui._button_press_event_cb(event_widget, event)
 
     event = Event(Gdk.EventType.MOTION_NOTIFY, button=1,
-                  x=timelineUtils.Zoomable.nsToPixelAccurate(position) -
-                  container_ui.translate_coordinates(timeline.ui, 0, 0)[0] + ui.CONTROL_WIDTH,
+                  x=Zoomable.nsToPixelAccurate(position) -
+                  container_ui.translate_coordinates(timeline.ui, 0, 0)[0] + timeline.ui.controls_width,
                   y=y, state=Gdk.ModifierType.BUTTON1_MASK)
-    container.ui.sendFakeEvent(event, container.ui)
+    with mock.patch.object(Gtk, "get_event_widget") as get_event_widget:
+        get_event_widget.return_value = container.ui
+        timeline.ui._motion_notify_event_cb(None, event)
 
     GstValidate.print_action(action, "Editing %s to %s in %s mode, edge: %s "
                              "with new layer prio: %d\n" % (action.structure["container-name"],
@@ -384,14 +383,14 @@ def zoom(scenario, action):
     GstValidate.print_action(action, action.type.replace('-', ' ') + "\n")
 
     {"zoom-fit": timeline.parent.zoomFit,
-     "zoom-out": timelineUtils.Zoomable.zoomOut,
-     "zoom-in": timelineUtils.Zoomable.zoomIn}[action.type]()
+     "zoom-out": Zoomable.zoomOut,
+     "zoom-in": Zoomable.zoomIn}[action.type]()
 
     return True
 
 
 def setZoomLevel(scenario, action):
-    timelineUtils.Zoomable.setZoomLevel(action.structure["level"])
+    Zoomable.setZoomLevel(action.structure["level"])
 
     return True
 
@@ -446,11 +445,13 @@ def select_clips(scenario, action):
         if clip.ui.get_state_flags() & Gtk.StateFlags.SELECTED:
             should_select = False
 
-        timeline.ui.sendFakeEvent(Event(event_type=Gdk.EventType.KEY_PRESS,
-                                        keyval=Gdk.KEY_Control_L))
+        event = Event(Gdk.EventType.KEY_PRESS, keyval=Gdk.KEY_Control_L)
+        timeline.ui.get_parent().do_key_press_event(event)
 
-    event = Gdk.EventButton.new(Gdk.EventType.BUTTON_RELEASE)
-    clip.ui.sendFakeEvent(event, clip.ui)
+    event = Event(Gdk.EventType.BUTTON_RELEASE, button=1)
+    with mock.patch.object(Gtk, "get_event_widget") as get_event_widget:
+        get_event_widget.return_value = clip.ui
+        clip.ui._button_release_event_cb(None, event)
 
     selection = action.structure["selection"]
     if not selection:
@@ -478,7 +479,8 @@ def select_clips(scenario, action):
                                                " but it is" % (selection, clip.get_name()))
 
     if mode == "ctrl":
-        timeline.ui.sendFakeEvent(Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Control_L))
+        event = Event(Gdk.EventType.KEY_RELEASE, keyval=Gdk.KEY_Control_L)
+        timeline.ui.get_parent().do_key_release_event(event)
 
     return 1
 
@@ -522,7 +524,7 @@ def init():
 
         GstValidate.register_action_type("set-state", "pitivi",
                                          set_state, None,
-                                         "Pitivi override for the pause action",
+                                         "Pitivi override for the set-state action",
                                          GstValidate.ActionTypeFlags.NONE)
 
         GstValidate.register_action_type("edit-container", "pitivi",
diff --git a/tests/common.py b/tests/common.py
index d2b6b02..1afe84a 100644
--- a/tests/common.py
+++ b/tests/common.py
@@ -26,7 +26,6 @@ import tempfile
 import unittest
 from unittest import mock
 
-from gi.repository import Gdk
 from gi.repository import GLib
 from gi.repository import Gst
 from gi.repository import Gtk
@@ -39,7 +38,6 @@ from pitivi.utils.loggable import Loggable
 from pitivi.utils.proxy import ProxyingStrategy
 from pitivi.utils.proxy import ProxyManager
 from pitivi.utils.timeline import Selected
-from pitivi.utils.validate import Event
 
 detect_leaks = os.environ.get("PITIVI_TEST_DETECT_LEAKS", "0") not in ("0", "")
 os.environ["PITIVI_USER_CACHE_DIR"] = tempfile.mkdtemp("pitiviTestsuite")
@@ -179,17 +177,18 @@ class TestCase(unittest.TestCase, Loggable):
         self._result = result
         unittest.TestCase.run(self, result)
 
-    def toggleClipSelection(self, ges_clip, expect_selected):
-        '''
-        Toggle selection state of @ges_clip.
-        '''
+    def toggle_clip_selection(self, ges_clip, expect_selected):
+        """Toggles the selection state of @ges_clip."""
         selected = bool(ges_clip.ui.get_state_flags() & Gtk.StateFlags.SELECTED)
         self.assertEqual(ges_clip.selected.selected, selected)
 
-        ges_clip.ui.sendFakeEvent(
-            Event(Gdk.EventType.BUTTON_PRESS, button=1), ges_clip.ui)
-        ges_clip.ui.sendFakeEvent(
-            Event(Gdk.EventType.BUTTON_RELEASE, button=1), ges_clip.ui)
+        # Simulate a click on the clip.
+        event = mock.Mock()
+        event.get_button.return_value = (True, 1)
+        with mock.patch.object(Gtk, "get_event_widget") as get_event_widget:
+            get_event_widget.return_value = ges_clip.ui
+            ges_clip.ui.timeline._button_press_event_cb(None, event)
+        ges_clip.ui._button_release_event_cb(None, event)
 
         self.assertEqual(bool(ges_clip.ui.get_state_flags() & Gtk.StateFlags.SELECTED),
                          expect_selected)
diff --git a/tests/test_timeline_timeline.py b/tests/test_timeline_timeline.py
index dc87c03..0469670 100644
--- a/tests/test_timeline_timeline.py
+++ b/tests/test_timeline_timeline.py
@@ -25,7 +25,6 @@ from gi.repository import Gtk
 from pitivi.project import ProjectManager
 from pitivi.timeline.timeline import TimelineContainer
 from pitivi.utils import ui
-from pitivi.utils.validate import Event
 from tests import common
 
 
@@ -165,12 +164,13 @@ class TestGrouping(BaseTestTimeline):
         timeline.app.settings.leftClickAlsoSeeks = False
 
         # Press <ctrl> so selecting in ADD mode
-        timeline.sendFakeEvent(Event(event_type=Gdk.EventType.KEY_PRESS,
-                                     keyval=Gdk.KEY_Control_L))
+        event = mock.Mock()
+        event.keyval = Gdk.KEY_Control_L
+        timeline.parent.do_key_press_event(event)
 
         # Select the 2 clips
         for clip in clips:
-            self.toggleClipSelection(clip, expect_selected=True)
+            self.toggle_clip_selection(clip, expect_selected=True)
 
         before_grouping_timeline_group = timeline.current_group
 
@@ -211,7 +211,7 @@ class TestGrouping(BaseTestTimeline):
         self.assertEqual(len(clips), num_clips)
 
         # Deselect one grouped clip clips
-        self.toggleClipSelection(clips[0], expect_selected=False)
+        self.toggle_clip_selection(clips[0], expect_selected=False)
 
         # Make sure all the clips have been deselected
         for clip in clips:
@@ -239,7 +239,7 @@ class TestGrouping(BaseTestTimeline):
 
         timeline = self.createTimeline()
         clips = self.addClipsSimple(timeline, 1)
-        self.toggleClipSelection(clips[0], expect_selected=True)
+        self.toggle_clip_selection(clips[0], expect_selected=True)
 
         timeline.ges_timeline.get_asset().pipeline.getPosition = mock.Mock(return_value=position)
         layer = timeline.ges_timeline.get_layers()[0]
@@ -254,11 +254,11 @@ class TestGrouping(BaseTestTimeline):
         self.assertTrue(clips[0].selected.selected)
         self.assertFalse(clips[1].selected.selected)
 
-        timeline.sendFakeEvent(Event(event_type=Gdk.EventType.KEY_PRESS,
-                                     keyval=Gdk.KEY_Control_L))
-        self.toggleClipSelection(clips[1], expect_selected=True)
-        timeline.sendFakeEvent(Event(event_type=Gdk.EventType.KEY_RELEASE,
-                                     keyval=Gdk.KEY_Control_L))
+        event = mock.Mock()
+        event.keyval = Gdk.KEY_Control_L
+        timeline.parent.do_key_press_event(event)
+        self.toggle_clip_selection(clips[1], expect_selected=True)
+        timeline.parent.do_key_release_event(event)
 
         for clip in clips:
             self.assertTrue(clip.selected.selected)
@@ -266,13 +266,13 @@ class TestGrouping(BaseTestTimeline):
         # Group the two parts
         timeline.parent.group_action.emit("activate", None)
 
-        self.toggleClipSelection(clips[1], expect_selected=True)
+        self.toggle_clip_selection(clips[1], expect_selected=True)
 
     def testUngroupClip(self):
         timeline = self.createTimeline()
         ges_clip, = self.addClipsSimple(timeline, 1)
 
-        self.toggleClipSelection(ges_clip, expect_selected=True)
+        self.toggle_clip_selection(ges_clip, expect_selected=True)
 
         timeline.parent.ungroup_action.emit("activate", None)
         layer = timeline.ges_timeline.get_layers()[0]
@@ -312,7 +312,7 @@ class TestGrouping(BaseTestTimeline):
         self.group_clips(timeline, [clip1, clip2])
 
         # Click the first clip in the group.
-        with mock.patch.object(timeline, 'get_event_widget') as get_event_widget:
+        with mock.patch.object(Gtk, 'get_event_widget') as get_event_widget:
             event = mock.Mock()
             event.x = 0
             event.get_button.return_value = True, 1
@@ -346,12 +346,13 @@ class TestCopyPaste(BaseTestTimeline):
         clips = self.addClipsSimple(timeline, num_clips)
 
         # Press <ctrl> so selecting in ADD mode
-        timeline.sendFakeEvent(Event(event_type=Gdk.EventType.KEY_PRESS,
-                                     keyval=Gdk.KEY_Control_L))
+        event = mock.Mock()
+        event.keyval = Gdk.KEY_Control_L
+        timeline.parent.do_key_press_event(event)
 
         # Select the 2 clips
         for clip in clips:
-            self.toggleClipSelection(clip, expect_selected=True)
+            self.toggle_clip_selection(clip, expect_selected=True)
 
         self.assertTrue(timeline.parent.copy_action.props.enabled)
         self.assertFalse(timeline.parent.paste_action.props.enabled)
@@ -393,7 +394,7 @@ class TestEditing(BaseTestTimeline):
         layer = clip.get_layer()
 
         # Click the right trim handle of the clip.
-        with mock.patch.object(timeline, 'get_event_widget') as get_event_widget:
+        with mock.patch.object(Gtk, 'get_event_widget') as get_event_widget:
             event = mock.Mock()
             event.get_button.return_value = True, 1
             get_event_widget.return_value = clip.ui.rightHandle
diff --git a/tests/test_undo_timeline.py b/tests/test_undo_timeline.py
index 830762f..1ddcfe1 100644
--- a/tests/test_undo_timeline.py
+++ b/tests/test_undo_timeline.py
@@ -167,7 +167,7 @@ class TestLayerObserver(BaseTestUndoTimeline):
         timeline_ui.setProject(self.app.project_manager.current_project)
 
         # Click and drag a layer control box to move the layer.
-        with mock.patch.object(timeline_ui, 'get_event_widget') as get_event_widget:
+        with mock.patch.object(Gtk, 'get_event_widget') as get_event_widget:
             event = mock.Mock()
             event.get_button.return_value = True, 1
 
@@ -687,19 +687,23 @@ class TestDragDropUndo(BaseTestUndoTimeline):
         self.layer.add_clip(clip)
 
         # Drag a clip on a separator to create a layer.
-        timeline_ui.get_event_widget = mock.Mock(return_value=clip.ui)
-        event = mock.Mock()
-        event.x = 0
-        event.get_button.return_value = True, 1
-        timeline_ui._button_press_event_cb(None, event)
-
-        def translate_coordinates(widget, x, y):
-            return x, y
-        clip.ui.translate_coordinates = translate_coordinates
-        event.get_state.return_value = Gdk.ModifierType.BUTTON1_MASK
-        event.x = 1
-        event.y = LAYER_HEIGHT * 2
-        timeline_ui._motion_notify_event_cb(None, event)
+        with mock.patch.object(Gtk, 'get_event_widget') as get_event_widget:
+            get_event_widget.return_value = clip.ui
+
+            event = mock.Mock()
+            event.x = 0
+            event.get_button.return_value = True, 1
+            timeline_ui._button_press_event_cb(None, event)
+
+            def translate_coordinates(widget, x, y):
+                return x, y
+            clip.ui.translate_coordinates = translate_coordinates
+            event = mock.Mock()
+            event.get_state.return_value = Gdk.ModifierType.BUTTON1_MASK
+            event.x = 1
+            event.y = LAYER_HEIGHT * 2
+            event.get_button.return_value = True, 1
+            timeline_ui._motion_notify_event_cb(None, event)
 
         timeline_ui._button_release_event_cb(None, event)
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]