Skip to content

Commit

Permalink
Merge pull request #25 from flowkeeper-org/rc-0.6.2
Browse files Browse the repository at this point in the history
Rc 0.6.2
  • Loading branch information
co-stig authored Aug 1, 2024
2 parents 2a5f83b + 6a6b7f8 commit 6bb682e
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 67 deletions.
2 changes: 1 addition & 1 deletion requirements-run.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PySide6
PySide6==6.7.1
semantic-version
cryptography
keyring
3 changes: 3 additions & 0 deletions res/CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
### v0.6.2 (1 August 2024)
- [Bugfix] OAuth login on Windows (QTBUG-124333).

### v0.6.1 (31 July 2024)
- Brand new interactive tutorial.
- The window loses its frame in Focus mode, with double-click and move.
Expand Down
76 changes: 26 additions & 50 deletions src/fk/e2e/abstract_e2e_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@

from PySide6.QtCore import QTimer, QPoint, QEvent, Qt
from PySide6.QtGui import QWindow, QMouseEvent, QKeyEvent, QFocusEvent
from PySide6.QtWidgets import QWidget, QAbstractButton, QAbstractItemView, QMainWindow
from PySide6.QtWidgets import QWidget, QAbstractItemView, QMainWindow

from fk.desktop.application import Application
from fk.e2e.screenshot import Screenshot
from fk.qt.actions import Actions

INSTANT_DURATION = 0.2 # seconds
STARTUP_DURATION = 2 # seconds
STARTUP_DURATION = 1 # seconds
WINDOW_GALLERY_FILENAME = 'test-results/screenshots.html'
SCREEN_GALLERY_FILENAME = 'test-results/screenshots-full.html'

Expand Down Expand Up @@ -179,60 +179,46 @@ def error(self, e: Exception):
self._append_to_system_out_for_method(f'ERROR: {e}')
self._errors += 1

def do(self, what: Callable[[], None], delay: int = 1) -> AbstractE2eTest:
self._timer.timeout.disconnect()
self._timer.timeout.connect(lambda: self._do_once(what))
self._timer.start(delay)
return self

def _do_once(self, what: Callable[[], None]):
self._timer.stop()
what()

def _get_row_position(self, widget: QAbstractItemView, row: int, col: int) -> QPoint:
row_rect = widget.visualRect(widget.model().index(row, col))
row_rect.setTop(row_rect.top() + 5)
row_rect.setLeft(row_rect.left() + 5)
return row_rect.topLeft()
return widget.visualRect(widget.model().index(row, col)).center()

def mouse_click_row(self, widget: QAbstractItemView, row: int, col: int = 0):
self.mouse_click(widget, self._get_row_position(widget, row, col))
async def mouse_click_row(self, widget: QAbstractItemView, row: int, col: int = 0):
await self.mouse_click(widget, self._get_row_position(widget, row, col))

def mouse_doubleclick_row(self, widget: QAbstractItemView, row: int, col: int = 0):
self.mouse_doubleclick(widget, self._get_row_position(widget, row, col))
async def mouse_doubleclick_row(self, widget: QAbstractItemView, row: int, col: int = 0):
await self.mouse_doubleclick(widget, self._get_row_position(widget, row, col))

def mouse_click(self, widget: QWidget, pos: QPoint = QPoint(5, 5), left_button: bool = True):
self.do(lambda: widget.focusInEvent(QFocusEvent(
async def mouse_click(self, widget: QWidget, pos: QPoint, left_button: bool = True):
widget.focusInEvent(QFocusEvent(
QEvent.Type.FocusIn,
)))
self.do(lambda: widget.mousePressEvent(QMouseEvent(
))
await self.instant_pause()
widget.mousePressEvent(QMouseEvent(
QEvent.Type.MouseButtonPress,
pos,
Qt.MouseButton.LeftButton if left_button else Qt.MouseButton.RightButton,
None,
Qt.MouseButton.NoButton,
Qt.KeyboardModifier.NoModifier,
)))
self.do(lambda: widget.mousePressEvent(QMouseEvent(
))
await self.instant_pause()
widget.mousePressEvent(QMouseEvent(
QEvent.Type.MouseButtonRelease,
pos,
Qt.MouseButton.LeftButton if left_button else Qt.MouseButton.RightButton,
None,
Qt.MouseButton.NoButton,
Qt.KeyboardModifier.NoModifier,
)))
))
await self.instant_pause()

def mouse_doubleclick(self, widget: QWidget, pos: QPoint = QPoint(5, 5)):
self.do(lambda: widget.mouseDoubleClickEvent(QMouseEvent(
async def mouse_doubleclick(self, widget: QWidget, pos: QPoint = QPoint(5, 5)):
widget.mouseDoubleClickEvent(QMouseEvent(
QEvent.Type.MouseButtonDblClick,
pos,
Qt.MouseButton.LeftButton,
Qt.MouseButton.NoButton,
Qt.KeyboardModifier.NoModifier,
)))

def button_click(self, button_id: str):
# noinspection PyTypeChecker
button: QAbstractButton = self._app.activeWindow().findChild(QAbstractButton, button_id)
self.do(lambda: button.click())
))
await self.instant_pause()

def keypress(self, key: int, ctrl: bool = False, widget: QWidget = None):
if widget is None:
Expand Down Expand Up @@ -267,22 +253,12 @@ def get_application(self) -> Application:
def window(self) -> QWidget:
win = self._app.activeWindow()
if win is None:
win = self._app.focusWindow()
win = self._main_window
if win is None:
raise Exception('Cannot find active window')
return win

def main_window(self) -> QMainWindow:
win = self._app.activeWindow()
if win is None:
raise Exception('Cannot find main window')
return win
if self._main_window is None:
win = self._app.activeWindow()
if win is None:
raise Exception('Cannot find main window')
else:
self._main_window = win
return self._main_window
return win

def execute_action(self, name: str) -> None:
Actions.ALL[name].trigger()
Expand Down
25 changes: 11 additions & 14 deletions src/fk/e2e/backlog_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ async def _find_workitem(self, name: str) -> None:
self.type_text(name)
await self.instant_pause()
# noinspection PyTypeChecker
search: SearchBar = self.main_window().findChild(SearchBar, "search")
search: SearchBar = self.window().findChild(SearchBar, "search")
completer = search.completer()
popup = completer.popup()
self.keypress(Qt.Key.Key_Down, False, popup)
Expand All @@ -100,12 +100,11 @@ async def _find_workitem(self, name: str) -> None:

async def _select_backlog(self, name: str) -> int:
# noinspection PyTypeChecker
backlogs_table: BacklogTableView = self.main_window().findChild(BacklogTableView, "backlogs_table")
backlogs_table: BacklogTableView = self.window().findChild(BacklogTableView, "backlogs_table")
backlogs_model = backlogs_table.model()
for i in range(backlogs_model.rowCount()):
if backlogs_model.index(i, 0).data() == name:
self.mouse_click_row(backlogs_table, i)
await self.instant_pause()
await self.mouse_click_row(backlogs_table, i)
return i
return -1

Expand All @@ -122,15 +121,15 @@ async def test_01_create_backlogs(self):
# General checks #
##################
self.info('General checks')
assert_that(self.main_window().windowTitle()).is_equal_to('Flowkeeper')
assert_that(self.window().windowTitle()).is_equal_to('Flowkeeper')

# noinspection PyTypeChecker
backlogs_table: BacklogTableView = self.main_window().findChild(BacklogTableView, "backlogs_table")
backlogs_table: BacklogTableView = self.window().findChild(BacklogTableView, "backlogs_table")
backlogs_model = backlogs_table.model()
assert_that(backlogs_model.rowCount()).is_equal_to(0)

# noinspection PyTypeChecker
workitems_table: WorkitemTableView = self.main_window().findChild(WorkitemTableView, "workitems_table")
workitems_table: WorkitemTableView = self.window().findChild(WorkitemTableView, "workitems_table")
workitems_model = workitems_table.model()
assert_that(workitems_model.rowCount()).is_equal_to(0)

Expand Down Expand Up @@ -219,7 +218,7 @@ async def test_01_create_backlogs(self):

async def test_02_actions_visibility(self):
# noinspection PyTypeChecker
workitems_table: WorkitemTableView = self.main_window().findChild(WorkitemTableView, "workitems_table")
workitems_table: WorkitemTableView = self.window().findChild(WorkitemTableView, "workitems_table")

############################################################
# Check actions on a new workitem with available pomodoros #
Expand Down Expand Up @@ -370,9 +369,9 @@ def assert_backlog_actions_enabled():

async def test_03_renames(self):
# noinspection PyTypeChecker
backlogs_table: BacklogTableView = self.main_window().findChild(BacklogTableView, "backlogs_table")
backlogs_table: BacklogTableView = self.window().findChild(BacklogTableView, "backlogs_table")
# noinspection PyTypeChecker
workitems_table: WorkitemTableView = self.main_window().findChild(WorkitemTableView, "workitems_table")
workitems_table: WorkitemTableView = self.window().findChild(WorkitemTableView, "workitems_table")

##################
# Rename backlog #
Expand All @@ -392,8 +391,7 @@ async def test_03_renames(self):
assert_that(backlog_index, 'Backlog rename via Ctrl+R').is_greater_than(-1)

# Then via double-clicking
self.mouse_doubleclick_row(backlogs_table, backlog_index)
await self.instant_pause()
await self.mouse_doubleclick_row(backlogs_table, backlog_index)
self.type_text('Long-term tasks')
await self.instant_pause()
self.keypress(Qt.Key.Key_Enter, False)
Expand All @@ -417,8 +415,7 @@ async def test_03_renames(self):
assert_that(workitems_table.get_current().get_name(), 'Workitem rename via F6').is_equal_to('Rename 32')

# Then via double-clicking
self.mouse_doubleclick_row(workitems_table, workitems_table.currentIndex().row(), 1)
await self.instant_pause()
await self.mouse_doubleclick_row(workitems_table, workitems_table.currentIndex().row(), 1)
self.type_text('Update 32')
await self.instant_pause()
self.keypress(Qt.Key.Key_Enter, False)
Expand Down
4 changes: 2 additions & 2 deletions src/fk/e2e/screenshots_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def custom_settings(self) -> dict[str, str]:
return {
'FileEventSource.filename': TEMP_FILENAME,
'Application.show_tutorial': 'False',
'Application.show_window_title': 'True',
'Application.check_updates': 'False',
'Pomodoro.default_work_duration': str(POMODORO_WORK_DURATION),
'Pomodoro.default_rest_duration': str(POMODORO_REST_DURATION),
Expand Down Expand Up @@ -117,8 +118,7 @@ async def _select_backlog(self, name: str) -> int:
backlogs_model = backlogs_table.model()
for i in range(backlogs_model.rowCount()):
if backlogs_model.index(i, 0).data() == name:
self.mouse_click_row(backlogs_table, i)
await self.instant_pause()
await self.mouse_click_row(backlogs_table, i)
return i
return -1

Expand Down

0 comments on commit 6bb682e

Please sign in to comment.