Fix multiple tools dialog issue (#1921)
This commit is contained in:
@@ -797,7 +797,8 @@ class GuiMain(QMainWindow):
|
|||||||
def showBuildManuscriptDialog(self) -> None:
|
def showBuildManuscriptDialog(self) -> None:
|
||||||
"""Open the build manuscript dialog."""
|
"""Open the build manuscript dialog."""
|
||||||
if SHARED.hasProject:
|
if SHARED.hasProject:
|
||||||
dialog = GuiManuscript(self)
|
if not (dialog := SHARED.findTopLevelWidget(GuiManuscript)):
|
||||||
|
dialog = GuiManuscript(self)
|
||||||
dialog.activateDialog()
|
dialog.activateDialog()
|
||||||
dialog.loadContent()
|
dialog.loadContent()
|
||||||
return
|
return
|
||||||
@@ -815,7 +816,8 @@ class GuiMain(QMainWindow):
|
|||||||
def showWritingStatsDialog(self) -> None:
|
def showWritingStatsDialog(self) -> None:
|
||||||
"""Open the session stats dialog."""
|
"""Open the session stats dialog."""
|
||||||
if SHARED.hasProject:
|
if SHARED.hasProject:
|
||||||
dialog = GuiWritingStats(self)
|
if not (dialog := SHARED.findTopLevelWidget(GuiWritingStats)):
|
||||||
|
dialog = GuiWritingStats(self)
|
||||||
dialog.activateDialog()
|
dialog.activateDialog()
|
||||||
dialog.populateGUI()
|
dialog.populateGUI()
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -22,8 +22,6 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QAction, QFileDialog
|
from PyQt5.QtWidgets import QAction, QFileDialog
|
||||||
@@ -43,10 +41,8 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
# Create a project to work on
|
# Create a project to work on
|
||||||
buildTestProject(nwGUI, projPath)
|
buildTestProject(nwGUI, projPath)
|
||||||
project = SHARED.project
|
project = SHARED.project
|
||||||
|
|
||||||
qtbot.wait(100)
|
|
||||||
assert nwGUI.saveProject()
|
assert nwGUI.saveProject()
|
||||||
sessFile: Path = projPath / "meta" / nwFiles.SESS_FILE
|
sessFile = projPath / "meta" / nwFiles.SESS_FILE
|
||||||
|
|
||||||
# Open the Writing Stats dialog
|
# Open the Writing Stats dialog
|
||||||
nwGUI.mainMenu.aWritingStats.activate(QAction.Trigger)
|
nwGUI.mainMenu.aWritingStats.activate(QAction.Trigger)
|
||||||
@@ -62,6 +58,16 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
assert not sessFile.is_file()
|
assert not sessFile.is_file()
|
||||||
assert list(project.session.iterRecords()) == []
|
assert list(project.session.iterRecords()) == []
|
||||||
|
|
||||||
|
# Make an invalid logfile
|
||||||
|
data = (
|
||||||
|
'{"type": "initial", "offset": 123}\n'
|
||||||
|
'{"type": "record", "start": "foo", "end": "bar", "novel": 840, "notes": 376, "idle": 394}'
|
||||||
|
)
|
||||||
|
sessFile.write_text(data, encoding="utf-8")
|
||||||
|
sessLog._loadLogFile()
|
||||||
|
assert sessLog.wordOffset == 123
|
||||||
|
assert len(sessLog.logData) == 0
|
||||||
|
|
||||||
# Make a test log file
|
# Make a test log file
|
||||||
data = [
|
data = [
|
||||||
project.session.createInitial(123),
|
project.session.createInitial(123),
|
||||||
@@ -75,8 +81,17 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
assert sessLog.wordOffset == 123
|
assert sessLog.wordOffset == 123
|
||||||
assert len(sessLog.logData) == 4
|
assert len(sessLog.logData) == 4
|
||||||
|
|
||||||
# Test Exporting
|
|
||||||
# ==============
|
@pytest.mark.gui
|
||||||
|
def testToolWritingStats_Export(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
||||||
|
"""Test the export feature."""
|
||||||
|
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda ss, tt, pp, options: (pp, ""))
|
||||||
|
|
||||||
|
buildTestProject(nwGUI, projPath)
|
||||||
|
project = SHARED.project
|
||||||
|
assert nwGUI.saveProject()
|
||||||
|
sessFile = projPath / "meta" / nwFiles.SESS_FILE
|
||||||
|
sessLog = GuiWritingStats(nwGUI)
|
||||||
|
|
||||||
data = [
|
data = [
|
||||||
project.session.createInitial(1075),
|
project.session.createInitial(1075),
|
||||||
@@ -95,13 +110,13 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
sessLog.populateGUI()
|
sessLog.populateGUI()
|
||||||
|
|
||||||
# Make the saving fail
|
# Make the saving fail
|
||||||
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda *a, **k: ("", ""))
|
with monkeypatch.context() as mp:
|
||||||
assert not sessLog._saveData(sessLog.FMT_CSV)
|
mp.setattr(QFileDialog, "getSaveFileName", lambda *a, **k: ("", ""))
|
||||||
assert not sessLog._saveData(sessLog.FMT_JSON)
|
assert not sessLog._saveData(sessLog.FMT_CSV)
|
||||||
assert not sessLog._saveData(None) # type: ignore
|
assert not sessLog._saveData(sessLog.FMT_JSON)
|
||||||
|
assert not sessLog._saveData(None) # type: ignore
|
||||||
|
|
||||||
# Make the save succeed
|
# Sort by time
|
||||||
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda ss, tt, pp, options: (pp, ""))
|
|
||||||
sessLog.listBox.sortByColumn(sessLog.C_TIME, 0) # type: ignore
|
sessLog.listBox.sortByColumn(sessLog.C_TIME, 0) # type: ignore
|
||||||
|
|
||||||
assert sessLog.novelWords.text() == "{:n}".format(600)
|
assert sessLog.novelWords.text() == "{:n}".format(600)
|
||||||
@@ -153,8 +168,49 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
# Test Filters
|
# I/O Error
|
||||||
# ============
|
with monkeypatch.context() as mp:
|
||||||
|
mp.setattr("builtins.open", causeOSError)
|
||||||
|
assert not sessLog._loadLogFile()
|
||||||
|
assert not sessLog._saveData(sessLog.FMT_CSV)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.gui
|
||||||
|
def testToolWritingStats_Filters(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
||||||
|
"""Test the filters."""
|
||||||
|
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda ss, tt, pp, options: (pp, ""))
|
||||||
|
|
||||||
|
buildTestProject(nwGUI, projPath)
|
||||||
|
project = SHARED.project
|
||||||
|
assert nwGUI.saveProject()
|
||||||
|
sessFile = projPath / "meta" / nwFiles.SESS_FILE
|
||||||
|
sessLog = GuiWritingStats(nwGUI)
|
||||||
|
|
||||||
|
data = [
|
||||||
|
project.session.createInitial(1075),
|
||||||
|
project.session.createRecord("2021-01-31 19:00:00", "2021-01-31 19:30:00", 700, 375, 0),
|
||||||
|
project.session.createRecord("2021-02-01 19:00:00", "2021-02-01 19:30:00", 700, 375, 10),
|
||||||
|
project.session.createRecord("2021-02-01 20:00:00", "2021-02-01 20:30:00", 600, 275, 20),
|
||||||
|
project.session.createRecord("2021-02-02 19:00:00", "2021-02-02 19:30:00", 750, 425, 30),
|
||||||
|
project.session.createRecord("2021-02-02 20:00:00", "2021-02-02 20:30:00", 690, 365, 40),
|
||||||
|
project.session.createRecord("2021-02-03 19:00:00", "2021-02-03 19:30:00", 680, 355, 50),
|
||||||
|
project.session.createRecord("2021-02-04 19:00:00", "2021-02-04 19:30:00", 700, 375, 60),
|
||||||
|
project.session.createRecord("2021-02-05 19:00:00", "2021-02-05 19:30:00", 500, 175, 70),
|
||||||
|
project.session.createRecord("2021-02-06 19:00:00", "2021-02-06 19:30:00", 600, 275, 80),
|
||||||
|
project.session.createRecord("2021-02-07 19:00:00", "2021-02-07 19:30:00", 600, 275, 90),
|
||||||
|
]
|
||||||
|
sessFile.write_text("".join(data), encoding="utf-8")
|
||||||
|
sessLog.populateGUI()
|
||||||
|
sessLog.listBox.sortByColumn(sessLog.C_TIME, 0) # type: ignore
|
||||||
|
|
||||||
|
assert sessLog.listBox.topLevelItem(0).text(sessLog.C_COUNT) == "{:n}".format(1)
|
||||||
|
assert sessLog.listBox.topLevelItem(1).text(sessLog.C_COUNT) == "{:n}".format(-200)
|
||||||
|
assert sessLog.listBox.topLevelItem(2).text(sessLog.C_COUNT) == "{:n}".format(300)
|
||||||
|
assert sessLog.listBox.topLevelItem(3).text(sessLog.C_COUNT) == "{:n}".format(-120)
|
||||||
|
assert sessLog.listBox.topLevelItem(4).text(sessLog.C_COUNT) == "{:n}".format(-20)
|
||||||
|
assert sessLog.listBox.topLevelItem(5).text(sessLog.C_COUNT) == "{:n}".format(40)
|
||||||
|
assert sessLog.listBox.topLevelItem(6).text(sessLog.C_COUNT) == "{:n}".format(-400)
|
||||||
|
assert sessLog.listBox.topLevelItem(7).text(sessLog.C_COUNT) == "{:n}".format(200)
|
||||||
|
|
||||||
# No Novel Files
|
# No Novel Files
|
||||||
qtbot.mouseClick(sessLog.incNovel, QtMouseLeft)
|
qtbot.mouseClick(sessLog.incNovel, QtMouseLeft)
|
||||||
@@ -252,8 +308,6 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
qtbot.mouseClick(sessLog.hideNegative, QtMouseLeft)
|
qtbot.mouseClick(sessLog.hideNegative, QtMouseLeft)
|
||||||
assert sessLog._saveData(sessLog.FMT_JSON)
|
assert sessLog._saveData(sessLog.FMT_JSON)
|
||||||
|
|
||||||
# qtbot.stop()
|
|
||||||
|
|
||||||
jsonStats = tstPaths.tmpDir / "sessionStats.json"
|
jsonStats = tstPaths.tmpDir / "sessionStats.json"
|
||||||
with open(jsonStats, mode="r", encoding="utf-8") as inFile:
|
with open(jsonStats, mode="r", encoding="utf-8") as inFile:
|
||||||
jsonData = json.load(inFile)
|
jsonData = json.load(inFile)
|
||||||
@@ -333,6 +387,11 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Toggle Idle Time
|
||||||
|
assert sessLog.listBox.topLevelItem(7).text(sessLog.C_IDLE) == "4 %"
|
||||||
|
qtbot.mouseClick(sessLog.showIdleTime, QtMouseLeft)
|
||||||
|
assert sessLog.listBox.topLevelItem(7).text(sessLog.C_IDLE) == "00:01:10"
|
||||||
|
|
||||||
# Group by Day
|
# Group by Day
|
||||||
qtbot.mouseClick(sessLog.groupByDay, QtMouseLeft)
|
qtbot.mouseClick(sessLog.groupByDay, QtMouseLeft)
|
||||||
assert sessLog._saveData(sessLog.FMT_JSON)
|
assert sessLog._saveData(sessLog.FMT_JSON)
|
||||||
@@ -378,14 +437,7 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
# IOError
|
|
||||||
# =======
|
|
||||||
with monkeypatch.context() as mp:
|
|
||||||
mp.setattr("builtins.open", causeOSError)
|
|
||||||
assert not sessLog._loadLogFile()
|
|
||||||
assert not sessLog._saveData(sessLog.FMT_CSV)
|
|
||||||
|
|
||||||
# qtbot.stop()
|
# qtbot.stop()
|
||||||
|
|
||||||
sessLog._doClose()
|
sessLog._doClose()
|
||||||
assert nwGUI.closeProject() is True
|
nwGUI.closeProject()
|
||||||
|
|||||||
Reference in New Issue
Block a user