Add test coverage of splitter function in project tree

This commit is contained in:
Veronica Berglyd Olsen
2022-10-13 23:48:52 +02:00
parent 84af87b155
commit d619f4a012
3 changed files with 139 additions and 31 deletions
+1 -3
View File
@@ -27,9 +27,7 @@ from shutil import copyfile
from mock import causeOSError
from tools import C, buildTestProject, cmpFiles
from novelwriter.core.project import NWProject
from novelwriter.core.doctools import DocMerger, DocSplitter
from novelwriter.core.document import NWDoc
from novelwriter.core import NWProject, DocMerger, DocSplitter, NWDoc
@pytest.mark.core
+20 -25
View File
@@ -45,22 +45,17 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
docText = (
"Text\n\n"
"##! Prologue\n\n"
"Text\n\n"
"## Chapter One\n\n"
"### Scene One\n\n"
"Text\n\n"
"### Scene Two\n\n"
"Text\n\n"
"## Chapter Two\n\n"
"### Scene Three\n\n"
"Text\n\n"
"### Scene Four\n\n"
"Text\n\n"
"#! New Title\n\n"
"## New Chapter\n\n"
"### New Scene\n\n"
"#### New Section\n\n"
"##! Prologue\n\nText\n\n"
"## Chapter One\n\nText\n\n"
"### Scene One\n\nText\n\n"
"### Scene Two\n\nText\n\n"
"## Chapter Two\n\nText\n\n"
"### Scene Three\n\nText\n\n"
"### Scene Four\n\nText\n\n"
"#! New Title\n\nText\n\n"
"## New Chapter\n\nText\n\n"
"### New Scene\n\nText\n\n"
"#### New Section\n\nText\n\n"
)
hSplitDoc = theProject.newFile("Split Doc", C.hNovelRoot)
@@ -90,15 +85,15 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
assert data["headerList"][0] == (0, 1, "Split Doc")
assert data["headerList"][1] == (4, 2, "Prologue")
assert data["headerList"][2] == (8, 2, "Chapter One")
assert data["headerList"][3] == (10, 3, "Scene One")
assert data["headerList"][4] == (14, 3, "Scene Two")
assert data["headerList"][5] == (18, 2, "Chapter Two")
assert data["headerList"][6] == (20, 3, "Scene Three")
assert data["headerList"][7] == (24, 3, "Scene Four")
assert data["headerList"][8] == (28, 1, "New Title")
assert data["headerList"][9] == (30, 2, "New Chapter")
assert data["headerList"][10] == (32, 3, "New Scene")
assert data["headerList"][11] == (34, 4, "New Section")
assert data["headerList"][3] == (12, 3, "Scene One")
assert data["headerList"][4] == (16, 3, "Scene Two")
assert data["headerList"][5] == (20, 2, "Chapter Two")
assert data["headerList"][6] == (24, 3, "Scene Three")
assert data["headerList"][7] == (28, 3, "Scene Four")
assert data["headerList"][8] == (32, 1, "New Title")
assert data["headerList"][9] == (36, 2, "New Chapter")
assert data["headerList"][10] == (40, 3, "New Scene")
assert data["headerList"][11] == (44, 4, "New Section")
# Loading the dialog on a non-file item produces an empty list
nwSplit._loadContent(C.hNovelRoot)
+118 -3
View File
@@ -30,7 +30,7 @@ from PyQt5.QtWidgets import QMessageBox, QMenu, QTreeWidgetItem, QDialog
from novelwriter.enum import nwItemLayout, nwItemType, nwItemClass
from novelwriter.core import NWDoc
from novelwriter.dialogs import GuiEditLabel, GuiDocMerge
from novelwriter.dialogs import GuiEditLabel, GuiDocMerge, GuiDocSplit
from novelwriter.gui.projtree import GuiProjectTree
@@ -675,7 +675,7 @@ def testGuiProjTree_ContextMenu(qtbot, monkeypatch, nwGUI, fncDir, mockRnd):
@pytest.mark.gui
def testGuiProjTree_MergeDocument(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ipsumText):
def testGuiProjTree_MergeDocuments(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ipsumText):
"""Test the merge document function.
"""
mergeData = {}
@@ -780,7 +780,122 @@ def testGuiProjTree_MergeDocument(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ip
# qtbot.stop()
# END Test testGuiProjTree_MergeDocument
# END Test testGuiProjTree_MergeDocuments
@pytest.mark.gui
def testGuiProjTree_SplitDocument(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ipsumText):
"""Test the split document function.
"""
splitData = {}
splitText = []
# Block message box
monkeypatch.setattr(QMessageBox, "warning", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(GuiDocSplit, "__init__", lambda *a: None)
monkeypatch.setattr(GuiDocSplit, "exec_", lambda *a: None)
monkeypatch.setattr(GuiDocSplit, "result", lambda *a: QDialog.Accepted)
monkeypatch.setattr(GuiDocSplit, "getData", lambda *a: (splitData, splitText))
# Create a project
prjDir = os.path.join(fncDir, "project")
buildTestProject(nwGUI, prjDir)
theProject = nwGUI.theProject
projTree = nwGUI.projView.projTree
docText = (
"Text\n\n"
"##! Prologue\n\nText\n\n"
"## Chapter One\n\nText\n\n"
"### Scene One\n\nText\n\n"
"### Scene Two\n\nText\n\n"
"## Chapter Two\n\nText\n\n"
"### Scene Three\n\nText\n\n"
"### Scene Four\n\nText\n\n"
"#! New Title\n\nText\n\n"
"## New Chapter\n\nText\n\n"
"### New Scene\n\nText\n\n"
"#### New Section\n\nText\n\n"
)
hSplitDoc = theProject.newFile("Split Doc", C.hNovelRoot)
theProject.writeNewFile(hSplitDoc, 1, True, docText)
projTree.revealNewTreeItem(hSplitDoc, nHandle=C.hNovelRoot, wordCount=True)
docText = f"# Split Doc\n\n{docText}"
splitData["headerList"] = [
(0, 1, "Split Doc"),
(4, 2, "Prologue"),
(8, 2, "Chapter One"),
(12, 3, "Scene One"),
(16, 3, "Scene Two"),
(20, 2, "Chapter Two"),
(24, 3, "Scene Three"),
(28, 3, "Scene Four"),
(32, 1, "New Title"),
(36, 2, "New Chapter"),
(40, 3, "New Scene"),
(44, 4, "New Section"),
]
fstSet = [
"0000000000011", "0000000000012", "0000000000013", "0000000000014",
"0000000000015", "0000000000016", "0000000000017", "0000000000018",
"0000000000019", "000000000001a", "000000000001b", "000000000001c",
]
sndSet = [
"000000000001d", "000000000001e", "000000000001f", "0000000000020",
"0000000000021", "0000000000022", "0000000000023", "0000000000024",
"0000000000025", "0000000000026", "0000000000027", "0000000000028",
]
trdSet = [
"000000000002a", "000000000002b", "000000000002c", "000000000002d",
"000000000002e", "000000000002f", "0000000000030", "0000000000031",
"0000000000032", "0000000000033", "0000000000034", "0000000000035",
]
# Try to split an invalid document and a non-document
assert projTree._splitDocument(C.hInvalid) is False
assert projTree._splitDocument(C.hNovelRoot) is False
# Split into same root folder
splitData["intoFolder"] = False
# Writing fails
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert projTree._splitDocument(hSplitDoc) is True
for tHandle in fstSet:
assert tHandle in theProject.tree
assert not os.path.isfile(os.path.join(prjDir, "content", f"{tHandle}.nwd"))
# Writing succeeds
assert projTree._splitDocument(hSplitDoc) is True
for tHandle in sndSet:
assert tHandle in theProject.tree
assert os.path.isfile(os.path.join(prjDir, "content", f"{tHandle}.nwd"))
# Add to a folder
splitData["intoFolder"] = True
assert projTree._splitDocument(hSplitDoc) is True
assert "0000000000029" in theProject.tree # The folder
for tHandle in trdSet:
assert tHandle in theProject.tree
assert os.path.isfile(os.path.join(prjDir, "content", f"{tHandle}.nwd"))
# Cancelled by user
with monkeypatch.context() as mp:
mp.setattr(GuiDocSplit, "result", lambda *a: QDialog.Rejected)
assert projTree._splitDocument(hSplitDoc) is False
# qtbot.stop()
# END Test testGuiProjTree_SplitDocument
@pytest.mark.gui