Update tests for project class

This commit is contained in:
Veronica Berglyd Olsen
2023-12-01 18:02:29 +01:00
parent 8952bbab1d
commit ecaaffb029
+43 -25
View File
@@ -26,7 +26,6 @@ from shutil import copyfile
from zipfile import ZipFile from zipfile import ZipFile
from mocked import causeOSError from mocked import causeOSError
from novelwriter.core.item import NWItem
from tools import C, cmpFiles, buildTestProject, XML_IGNORE from tools import C, cmpFiles, buildTestProject, XML_IGNORE
from PyQt5.QtWidgets import QMessageBox from PyQt5.QtWidgets import QMessageBox
@@ -34,9 +33,10 @@ from PyQt5.QtWidgets import QMessageBox
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.enum import nwItemClass from novelwriter.enum import nwItemClass
from novelwriter.constants import nwFiles from novelwriter.constants import nwFiles
from novelwriter.core.item import NWItem
from novelwriter.core.tree import NWTree from novelwriter.core.tree import NWTree
from novelwriter.core.index import NWIndex from novelwriter.core.index import NWIndex
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject, NWProjectState
from novelwriter.core.options import OptionState from novelwriter.core.options import OptionState
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
@@ -169,79 +169,97 @@ def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd):
"""Test opening a project.""" """Test opening a project."""
project = NWProject() project = NWProject()
mockRnd.reset() mockRnd.reset()
# buildTestProject(project, fncPath)
# Unknown project file
fooBar = fncPath / "foobar.txt"
fooBar.touch()
caplog.clear()
assert project.openProject(fooBar) is False
assert "Not a known project file format." in caplog.text
# No project file
caplog.clear()
assert project.openProject(fncPath) is False
assert "Project file not found." in caplog.text
fooBar.unlink()
# Fail to open project location
projFile = fncPath / nwFiles.PROJ_FILE
metaFile = fncPath / "meta"
projFile.touch()
metaFile.touch()
caplog.clear()
assert project.openProject(fncPath) is False
assert "Failed to open project." in caplog.text
metaFile.unlink()
projFile.unlink()
# Create test project
buildTestProject(project, fncPath) buildTestProject(project, fncPath)
# Initialising the storage class fails # Open successfully
with monkeypatch.context() as mp: assert project.openProject(fncPath) is True
mp.setattr("novelwriter.core.storage.NWStorage.initProjectStorage", lambda *a, **k: False)
assert project.openProject(fncPath) is False
# Fail on lock file # Open again should fail on lock file
project.storage._lockFilePath = fncPath / nwFiles.PROJ_LOCK
assert project.storage._writeLockFile() is True
assert project.openProject(fncPath) is False assert project.openProject(fncPath) is False
assert isinstance(project.lockStatus, list) assert project.state == NWProjectState.LOCKED
# Force open with lockfile # Force re-open
project.storage._lockFilePath = fncPath / nwFiles.PROJ_LOCK
assert project.storage._writeLockFile() is True
assert project.openProject(fncPath, clearLock=True) is True assert project.openProject(fncPath, clearLock=True) is True
project.closeProject() assert project.state == NWProjectState.READY
assert project.lockStatus is None
# Fail getting xml reader # Fail getting xml reader
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr("novelwriter.core.storage.NWStorage.getXmlReader", lambda *a: None) mp.setattr("novelwriter.core.storage.NWStorage.getXmlReader", lambda *a: None)
assert project.openProject(fncPath) is False assert project.openProject(fncPath, clearLock=True) is False
# Not a novelwriter XML file # Not a novelwriter XML file
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(ProjectXMLReader, "read", lambda *a: False) mp.setattr(ProjectXMLReader, "read", lambda *a: False)
mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.NOT_NWX_FILE)) mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.NOT_NWX_FILE))
assert project.openProject(fncPath) is False assert project.openProject(fncPath, clearLock=True) is False
assert "Project file does not appear" in SHARED.lastAlert assert "Project file does not appear" in SHARED.lastAlert
# Unknown project file version # Unknown project file version
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(ProjectXMLReader, "read", lambda *a: False) mp.setattr(ProjectXMLReader, "read", lambda *a: False)
mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.UNKNOWN_VERSION)) mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.UNKNOWN_VERSION))
assert project.openProject(fncPath) is False assert project.openProject(fncPath, clearLock=True) is False
assert "Unknown or unsupported novelWriter project file" in SHARED.lastAlert assert "Unknown or unsupported novelWriter project file" in SHARED.lastAlert
# Other parse error # Other parse error
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(ProjectXMLReader, "read", lambda *a: False) mp.setattr(ProjectXMLReader, "read", lambda *a: False)
mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.CANNOT_PARSE)) mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.CANNOT_PARSE))
assert project.openProject(fncPath) is False assert project.openProject(fncPath, clearLock=True) is False
assert "Failed to parse project xml" in SHARED.lastAlert assert "Failed to parse project xml" in SHARED.lastAlert
# Won't convert legacy file # Won't convert legacy file
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.WAS_LEGACY)) mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.WAS_LEGACY))
mp.setattr(QMessageBox, "result", lambda *a: QMessageBox.No) mp.setattr(QMessageBox, "result", lambda *a: QMessageBox.No)
assert project.openProject(fncPath) is False assert project.openProject(fncPath, clearLock=True) is False
assert "The file format of your project is about to be" in SHARED.lastAlert assert "The file format of your project is about to be" in SHARED.lastAlert
# Won't open project from newer version # Won't open project from newer version
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(ProjectXMLReader, "hexVersion", property(lambda *a: 0x99999999)) mp.setattr(ProjectXMLReader, "hexVersion", property(lambda *a: 0x99999999))
mp.setattr(QMessageBox, "result", lambda *a: QMessageBox.No) mp.setattr(QMessageBox, "result", lambda *a: QMessageBox.No)
assert project.openProject(fncPath) is False assert project.openProject(fncPath, clearLock=True) is False
assert "This project was saved by a newer version" in SHARED.lastAlert assert "This project was saved by a newer version" in SHARED.lastAlert
# Fail checking items should still pass # Fail checking items should still pass
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr("novelwriter.core.tree.NWTree.updateItemData", lambda *a: False) mp.setattr("novelwriter.core.tree.NWTree.updateItemData", lambda *a: False)
assert project.openProject(fncPath) is True assert project.openProject(fncPath, clearLock=True) is True
project.closeProject()
# Trigger an index rebuild # Trigger an index rebuild
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.WAS_LEGACY)) mp.setattr(ProjectXMLReader, "state", property(lambda *a: XMLReadState.WAS_LEGACY))
mp.setattr("novelwriter.core.index.NWIndex.loadIndex", lambda *a: True) mp.setattr("novelwriter.core.index.NWIndex.loadIndex", lambda *a: True)
project.index._indexBroken = True project.index._indexBroken = True
assert project.openProject(fncPath) is True assert project.openProject(fncPath, clearLock=True) is True
assert "The file format of your project is about to be" in SHARED.lastAlert assert "The file format of your project is about to be" in SHARED.lastAlert
assert project.index._indexBroken is False assert project.index._indexBroken is False