Fix doc merge dialog test
This commit is contained in:
@@ -19,17 +19,14 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from mock import causeOSError
|
from tools import buildTestProject
|
||||||
from tools import getGuiItem, readFile, writeFile, buildTestProject
|
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QAction, QMessageBox
|
from PyQt5.QtCore import Qt
|
||||||
|
from PyQt5.QtWidgets import QMessageBox
|
||||||
|
|
||||||
from novelwriter.enum import nwItemType, nwWidget
|
from novelwriter.dialogs import GuiDocMerge
|
||||||
from novelwriter.dialogs import GuiDocMerge, GuiEditLabel
|
|
||||||
from novelwriter.core.tree import NWTree
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gui
|
@pytest.mark.gui
|
||||||
@@ -39,142 +36,63 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
|
|||||||
# Block message box
|
# Block message box
|
||||||
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
|
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
|
||||||
monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Ok)
|
monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Ok)
|
||||||
monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True))
|
|
||||||
|
|
||||||
# Create a new project
|
# Create a new project
|
||||||
buildTestProject(nwGUI, fncProj)
|
buildTestProject(nwGUI, fncProj)
|
||||||
|
|
||||||
# Handles for new objects
|
hInvalid = "0000000000000"
|
||||||
hNovelRoot = "0000000000008"
|
|
||||||
hChapterDir = "000000000000d"
|
hChapterDir = "000000000000d"
|
||||||
hChapterOne = "000000000000e"
|
hChapterDoc = "000000000000e"
|
||||||
hSceneOne = "000000000000f"
|
hSceneDoc = "000000000000f"
|
||||||
hSceneTwo = "0000000000010"
|
|
||||||
hSceneThree = "0000000000011"
|
|
||||||
hSceneFour = "0000000000012"
|
|
||||||
hMergedDoc = "0000000000023"
|
|
||||||
|
|
||||||
# Add Project Content
|
# Check that the dialog kan handle invalid items
|
||||||
nwGUI.switchFocus(nwWidget.TREE)
|
nwMerge = GuiDocMerge(nwGUI, hInvalid, [hInvalid])
|
||||||
nwGUI.projView.projTree.clearSelection()
|
qtbot.addWidget(nwMerge)
|
||||||
nwGUI.projView.projTree._getTreeItem(hChapterDir).setSelected(True)
|
|
||||||
nwGUI.projView.projTree.newTreeItem(nwItemType.FILE)
|
|
||||||
nwGUI.projView.projTree.newTreeItem(nwItemType.FILE)
|
|
||||||
nwGUI.projView.projTree.newTreeItem(nwItemType.FILE)
|
|
||||||
|
|
||||||
assert nwGUI.saveProject() is True
|
|
||||||
assert nwGUI.closeProject() is True
|
|
||||||
|
|
||||||
tChapterOne = "## Chapter One\n\n% Chapter one comment\n"
|
|
||||||
tSceneOne = "### Scene One\n\nThere once was a man from Nantucket"
|
|
||||||
tSceneTwo = "### Scene Two\n\nWho kept all his cash in a bucket."
|
|
||||||
tSceneThree = "### Scene Three\n\n\tBut his daughter, named Nan, \n\tRan away with a man"
|
|
||||||
tSceneFour = "### Scene Four\n\nAnd as for the bucket, Nantucket."
|
|
||||||
|
|
||||||
contentDir = os.path.join(fncProj, "content")
|
|
||||||
writeFile(os.path.join(contentDir, hChapterOne+".nwd"), tChapterOne)
|
|
||||||
writeFile(os.path.join(contentDir, hSceneOne+".nwd"), tSceneOne)
|
|
||||||
writeFile(os.path.join(contentDir, hSceneTwo+".nwd"), tSceneTwo)
|
|
||||||
writeFile(os.path.join(contentDir, hSceneThree+".nwd"), tSceneThree)
|
|
||||||
writeFile(os.path.join(contentDir, hSceneFour+".nwd"), tSceneFour)
|
|
||||||
|
|
||||||
assert nwGUI.openProject(fncProj) is True
|
|
||||||
|
|
||||||
# Open the Merge tool
|
|
||||||
nwGUI.switchFocus(nwWidget.TREE)
|
|
||||||
nwGUI.projView.projTree.clearSelection()
|
|
||||||
nwGUI.projView.projTree._getTreeItem(hChapterDir).setSelected(True)
|
|
||||||
|
|
||||||
monkeypatch.setattr(GuiDocMerge, "exec_", lambda *a: None)
|
|
||||||
nwGUI.mainMenu.aMergeDocs.activate(QAction.Trigger)
|
|
||||||
qtbot.waitUntil(lambda: getGuiItem("GuiDocMerge") is not None, timeout=1000)
|
|
||||||
|
|
||||||
nwMerge = getGuiItem("GuiDocMerge")
|
|
||||||
assert isinstance(nwMerge, GuiDocMerge)
|
|
||||||
nwMerge.show()
|
nwMerge.show()
|
||||||
qtbot.wait(50)
|
|
||||||
|
|
||||||
# Populate List
|
|
||||||
# =============
|
|
||||||
|
|
||||||
nwMerge.listBox.clear()
|
|
||||||
assert nwMerge.listBox.count() == 0
|
assert nwMerge.listBox.count() == 0
|
||||||
|
nwMerge.reject()
|
||||||
|
|
||||||
# No item selected
|
# Load items from chapter dir
|
||||||
nwGUI.projView.projTree.clearSelection()
|
nwMerge = GuiDocMerge(nwGUI, hChapterDir, [hChapterDir, hChapterDoc, hSceneDoc])
|
||||||
assert nwMerge._populateList() is False
|
qtbot.addWidget(nwMerge)
|
||||||
assert nwMerge.listBox.count() == 0
|
nwMerge.show()
|
||||||
|
|
||||||
# Non-existing item
|
assert nwMerge.listBox.count() == 2
|
||||||
with monkeypatch.context() as mp:
|
|
||||||
mp.setattr(NWTree, "__getitem__", lambda *a: None)
|
|
||||||
nwGUI.projView.projTree.clearSelection()
|
|
||||||
nwGUI.projView.projTree._getTreeItem(hChapterDir).setSelected(True)
|
|
||||||
assert nwMerge._populateList() is False
|
|
||||||
assert nwMerge.listBox.count() == 0
|
|
||||||
|
|
||||||
# Select a non-folder
|
itemOne = nwMerge.listBox.item(0)
|
||||||
nwGUI.projView.projTree.clearSelection()
|
itemTwo = nwMerge.listBox.item(1)
|
||||||
nwGUI.projView.projTree._getTreeItem(hChapterOne).setSelected(True)
|
|
||||||
assert nwMerge._populateList() is False
|
|
||||||
assert nwMerge.listBox.count() == 0
|
|
||||||
|
|
||||||
# Select the chapter folder
|
assert itemOne.data(Qt.UserRole) == hChapterDoc
|
||||||
nwGUI.projView.projTree.clearSelection()
|
assert itemTwo.data(Qt.UserRole) == hSceneDoc
|
||||||
nwGUI.projView.projTree._getTreeItem(hChapterDir).setSelected(True)
|
|
||||||
assert nwMerge._populateList() is True
|
|
||||||
assert nwMerge.listBox.count() == 5
|
|
||||||
|
|
||||||
# Merge Documents
|
assert itemOne.checkState() == Qt.Checked
|
||||||
# ===============
|
assert itemTwo.checkState() == Qt.Checked
|
||||||
|
|
||||||
# First, a successful merge
|
data = nwMerge.getData()
|
||||||
with monkeypatch.context() as mp:
|
assert data["sHandle"] == hChapterDir
|
||||||
mp.setattr(GuiDocMerge, "_doClose", lambda *a: None)
|
assert data["origItems"] == [hChapterDir, hChapterDoc, hSceneDoc]
|
||||||
assert nwMerge._doMerge() is True
|
assert data["moveToTrash"] is False
|
||||||
assert nwGUI.saveProject() is True
|
assert data["finalItems"] == [hChapterDoc, hSceneDoc]
|
||||||
mergedFile = os.path.join(contentDir, hMergedDoc+".nwd")
|
|
||||||
assert os.path.isfile(mergedFile)
|
|
||||||
assert readFile(mergedFile) == (
|
|
||||||
"%%%%~name: New Chapter\n"
|
|
||||||
"%%%%~path: %s/%s\n"
|
|
||||||
"%%%%~kind: NOVEL/DOCUMENT\n"
|
|
||||||
"%s\n\n"
|
|
||||||
"%s\n\n"
|
|
||||||
"%s\n\n"
|
|
||||||
"%s\n\n"
|
|
||||||
"%s\n\n"
|
|
||||||
) % (
|
|
||||||
hNovelRoot,
|
|
||||||
hMergedDoc,
|
|
||||||
tChapterOne.strip(),
|
|
||||||
tSceneOne.strip(),
|
|
||||||
tSceneTwo.strip(),
|
|
||||||
tSceneThree.strip(),
|
|
||||||
tSceneFour.strip(),
|
|
||||||
)
|
|
||||||
|
|
||||||
# OS error
|
# Uncheck second item and toggle trash switch
|
||||||
with monkeypatch.context() as mp:
|
itemTwo.setCheckState(Qt.Unchecked)
|
||||||
mp.setattr("builtins.open", causeOSError)
|
nwMerge.trashSwitch.setChecked(True)
|
||||||
assert nwMerge._doMerge() is False
|
|
||||||
|
|
||||||
# Can't find the source item
|
data = nwMerge.getData()
|
||||||
with monkeypatch.context() as mp:
|
assert data["sHandle"] == hChapterDir
|
||||||
mp.setattr(NWTree, "__getitem__", lambda *a: None)
|
assert data["origItems"] == [hChapterDir, hChapterDoc, hSceneDoc]
|
||||||
assert nwMerge._doMerge() is False
|
assert data["moveToTrash"] is True
|
||||||
|
assert data["finalItems"] == [hChapterDoc]
|
||||||
|
|
||||||
# No source handle set
|
# Restore default values
|
||||||
nwMerge.sourceItem = None
|
nwMerge._resetList()
|
||||||
assert nwMerge._doMerge() is False
|
|
||||||
|
|
||||||
# No documents to merge
|
data = nwMerge.getData()
|
||||||
nwMerge.listBox.clear()
|
assert data["sHandle"] == hChapterDir
|
||||||
assert nwMerge._doMerge() is False
|
assert data["origItems"] == [hChapterDir, hChapterDoc, hSceneDoc]
|
||||||
|
assert data["moveToTrash"] is True
|
||||||
|
assert data["finalItems"] == [hChapterDoc, hSceneDoc]
|
||||||
|
|
||||||
# Close up
|
# qtbot.stop()
|
||||||
nwMerge._doClose()
|
|
||||||
|
|
||||||
# qtbot.stopForInteraction()
|
|
||||||
|
|
||||||
# END Test testDlgMerge_Main
|
# END Test testDlgMerge_Main
|
||||||
|
|||||||
Reference in New Issue
Block a user