Fix tests for variable change, and change monkeypatches to use the context manager

This commit is contained in:
Veronica K. B. Olsen
2021-02-18 19:21:46 +01:00
parent 8b0ac6e81e
commit e4d03f9581
28 changed files with 274 additions and 296 deletions
+9 -9
View File
@@ -50,9 +50,9 @@ def testCoreDocument_LoadSave(monkeypatch, dummyGUI, nwMinimal):
def dummyOpen(*args, **kwargs):
raise OSError
monkeypatch.setattr("builtins.open", dummyOpen)
assert theDoc.openDocument(sHandle) is None
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", dummyOpen)
assert theDoc.openDocument(sHandle) is None
# Load the text
assert theDoc.openDocument(sHandle) == "### New Scene\n\n"
@@ -95,9 +95,9 @@ def testCoreDocument_LoadSave(monkeypatch, dummyGUI, nwMinimal):
assert inFile.read() == theText
# Cause open() to fail while saving
monkeypatch.setattr("builtins.open", causeOSError)
assert not theDoc.saveDocument(theText)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert not theDoc.saveDocument(theText)
# Saving with no handle
theDoc.clearDocument()
@@ -108,9 +108,9 @@ def testCoreDocument_LoadSave(monkeypatch, dummyGUI, nwMinimal):
assert os.path.isfile(docPath)
# Cause the delete to fail
monkeypatch.setattr("os.unlink", causeOSError)
assert not theDoc.deleteDocument(xHandle)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.unlink", causeOSError)
assert not theDoc.deleteDocument(xHandle)
# Make the delete pass
assert theDoc.deleteDocument(xHandle)
+7 -10
View File
@@ -26,6 +26,7 @@ import json
from shutil import copyfile
from dummy import causeException
from tools import cmpFiles
from nw.core.project import NWProject
@@ -61,16 +62,12 @@ def testCoreIndex_LoadSave(monkeypatch, nwLipsum, dummyGUI, outDir, refDir):
assert not theIndex.reIndexHandle(None)
# Dummy exception function
def doPanic(*arg, **kwargs):
raise Exception
# Make the save fail
monkeypatch.setattr(json, "dump", doPanic)
assert not theIndex.saveIndex()
with monkeypatch.context() as mp:
mp.setattr(json, "dump", causeException)
assert not theIndex.saveIndex()
# Make the save pass
monkeypatch.undo()
assert theIndex.saveIndex()
# Take a copy of the index
@@ -100,11 +97,11 @@ def testCoreIndex_LoadSave(monkeypatch, nwLipsum, dummyGUI, outDir, refDir):
assert not theIndex._textCounts
# Make the load fail
monkeypatch.setattr(json, "load", doPanic)
assert not theIndex.loadIndex()
with monkeypatch.context() as mp:
mp.setattr(json, "load", causeException)
assert not theIndex.loadIndex()
# Make the load pass
monkeypatch.undo()
assert theIndex.loadIndex()
assert str(theIndex._tagIndex) == tagIndex
+4 -4
View File
@@ -64,10 +64,10 @@ def testCoreOptions_LoadSave(monkeypatch, dummyGUI, tmpDir):
assert theProject.projMeta == tmpDir
# Cause open() to fail
monkeypatch.setattr("builtins.open", causeOSError)
assert not theOpts.loadSettings()
assert not theOpts.saveSettings()
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert not theOpts.loadSettings()
assert not theOpts.saveSettings()
# Load proper
assert theOpts.loadSettings()
+75 -77
View File
@@ -180,7 +180,6 @@ def testCoreProject_NewSampleA(fncDir, tmpConf, dummyGUI, tmpDir):
}
theProject = NWProject(dummyGUI)
theProject.projTree.setSeed(42)
theProject.mainConf = tmpConf
# Sample set, but no path
assert not theProject.newProject({"popSample": True})
@@ -229,7 +228,6 @@ def testCoreProject_NewSampleB(monkeypatch, fncDir, tmpConf, dummyGUI, tmpDir):
}
theProject = NWProject(dummyGUI)
theProject.projTree.setSeed(42)
theProject.mainConf = tmpConf
# Make sure we do not pick up the nw/assets/sample.zip file
tmpConf.assetPath = tmpDir
@@ -330,9 +328,9 @@ def testCoreProject_Open(monkeypatch, nwMinimal, dummyGUI):
os.rename(wName, rName)
# Fail on folder structure check
monkeypatch.setattr("os.mkdir", causeOSError)
assert theProject.openProject(nwMinimal) is False
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.mkdir", causeOSError)
assert theProject.openProject(nwMinimal) is False
# Fail on lock file
theProject.setProjectPath(nwMinimal)
@@ -340,9 +338,9 @@ def testCoreProject_Open(monkeypatch, nwMinimal, dummyGUI):
assert theProject.openProject(nwMinimal) is False
# Fail to read lockfile (which still opens the project)
monkeypatch.setattr("builtins.open", causeOSError)
assert theProject.openProject(nwMinimal) is True
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert theProject.openProject(nwMinimal) is True
assert theProject.closeProject()
# Force open with lockfile
@@ -452,14 +450,14 @@ def testCoreProject_Save(monkeypatch, nwMinimal, dummyGUI, refDir):
assert theProject.openProject(nwMinimal)
# Fail on folder structure check
monkeypatch.setattr("os.path.isdir", lambda *args: False)
assert theProject.saveProject() is False
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.path.isdir", lambda *args: False)
assert theProject.saveProject() is False
# Fail on open file
monkeypatch.setattr("builtins.open", causeOSError)
assert theProject.saveProject() is False
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert theProject.saveProject() is False
# Successful save
saveCount = theProject.saveCount
@@ -501,30 +499,30 @@ def testCoreProject_LockFile(monkeypatch, fncDir, dummyGUI):
theProject.mainConf.kernelVer = "1.0"
# Block open
monkeypatch.setattr("builtins.open", causeOSError)
assert theProject._writeLockFile() is False
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert theProject._writeLockFile() is False
# Write lock file
monkeypatch.setattr("nw.core.project.time", lambda: 123.4)
assert theProject._writeLockFile() is True
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("nw.core.project.time", lambda: 123.4)
assert theProject._writeLockFile() is True
assert readFile(lockFile) == "TestHost\nTestOS\n1.0\n123\n"
# Block open
monkeypatch.setattr("builtins.open", causeOSError)
assert theProject._readLockFile() == ["ERROR"]
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert theProject._readLockFile() == ["ERROR"]
# Read lock file
assert theProject._readLockFile() == ["TestHost", "TestOS", "1.0", "123"]
# Block unlink
monkeypatch.setattr("os.unlink", causeOSError)
assert os.path.isfile(lockFile)
assert theProject._clearLockFile() is False
assert os.path.isfile(lockFile)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.unlink", causeOSError)
assert os.path.isfile(lockFile)
assert theProject._clearLockFile() is False
assert os.path.isfile(lockFile)
# Clear file
assert os.path.isfile(lockFile)
@@ -554,9 +552,9 @@ def testCoreProject_Helpers(monkeypatch, fncDir, dummyGUI):
theProject.projPath = fncDir
# Block user's home folder
monkeypatch.setattr("os.path.expanduser", lambda *args, **kwargs: fncDir)
assert theProject.ensureFolderStructure() is False
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.path.expanduser", lambda *args, **kwargs: fncDir)
assert theProject.ensureFolderStructure() is False
# Create a file to block meta folder
metaDir = os.path.join(fncDir, "meta")
@@ -702,9 +700,9 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, dummyGUI, tmpDir):
# Edit Time
theProject.editTime = 1234
theProject.projOpened = 1600000000
monkeypatch.setattr("nw.core.project.time", lambda: 1600005600)
assert theProject.getCurrentEditTime() == 6834
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("nw.core.project.time", lambda: 1600005600)
assert theProject.getCurrentEditTime() == 6834
# Trash folder
# Should create on first call, and just returned on later calls
@@ -735,11 +733,11 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, dummyGUI, tmpDir):
# Spell language
theProject.projChanged = False
assert theProject.setSpellLang(None)
assert theProject.projLang is None
assert theProject.projSpell is None
assert theProject.setSpellLang("None")
assert theProject.projLang is None
assert theProject.projSpell is None
assert theProject.setSpellLang("en_GB")
assert theProject.projLang == "en_GB"
assert theProject.projSpell == "en_GB"
assert theProject.projChanged
# Automatic outline update
@@ -839,14 +837,14 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, dummyGUI, tmpDir):
assert theProject.getSessionWordCount() == 100
# Session stats
monkeypatch.setattr("os.path.isdir", lambda *args, **kwargs: False)
assert not theProject._appendSessionStats(idleTime=0)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.path.isdir", lambda *args, **kwargs: False)
assert not theProject._appendSessionStats(idleTime=0)
# Block open
monkeypatch.setattr("builtins.open", causeOSError)
assert not theProject._appendSessionStats(idleTime=0)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert not theProject._appendSessionStats(idleTime=0)
# Write entry
assert theProject.projMeta == os.path.join(nwMinimal, "meta")
@@ -856,9 +854,9 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, dummyGUI, tmpDir):
theProject.novelWCount = 200
theProject.notesWCount = 100
monkeypatch.setattr("nw.core.project.time", lambda: 1600005600)
assert theProject._appendSessionStats(idleTime=99)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("nw.core.project.time", lambda: 1600005600)
assert theProject._appendSessionStats(idleTime=99)
assert readFile(statsFile) == (
"# Offset 100\n"
@@ -1076,9 +1074,9 @@ def testCoreProject_LegacyData(monkeypatch, dummyGUI, fncDir):
writeFile(tstFile, "dummy")
assert os.path.isfile(tstFile)
monkeypatch.setattr("os.unlink", causeOSError)
assert not theProject._deprecatedFiles()
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.unlink", causeOSError)
assert not theProject._deprecatedFiles()
assert theProject._deprecatedFiles()
assert not os.path.isfile(tstFile)
@@ -1101,18 +1099,18 @@ def testCoreProject_LegacyData(monkeypatch, dummyGUI, fncDir):
assert os.path.isdir(errItem)
# This causes a failure to create the 'junk' folder
monkeypatch.setattr("os.mkdir", causeOSError)
errList = []
errList = theProject._legacyDataFolder(tstData, errList)
assert len(errList) > 0
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.mkdir", causeOSError)
errList = []
errList = theProject._legacyDataFolder(tstData, errList)
assert len(errList) > 0
# This causes a failure to move 'stuff' to 'junk'
monkeypatch.setattr("os.rename", causeOSError)
errList = []
errList = theProject._legacyDataFolder(tstData, errList)
assert len(errList) > 0
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.rename", causeOSError)
errList = []
errList = theProject._legacyDataFolder(tstData, errList)
assert len(errList) > 0
# This should be successful
errList = []
@@ -1138,18 +1136,18 @@ def testCoreProject_LegacyData(monkeypatch, dummyGUI, fncDir):
writeFile(tstDoc3b, "dummy")
# Make the above fail
monkeypatch.setattr("os.rename", causeOSError)
monkeypatch.setattr("os.unlink", causeOSError)
errList = []
errList = theProject._legacyDataFolder(tstData, errList)
assert len(errList) > 0
assert os.path.isfile(tstDoc1m)
assert os.path.isfile(tstDoc1b)
assert os.path.isfile(tstDoc2m)
assert os.path.isfile(tstDoc2b)
assert os.path.isfile(tstDoc3m)
assert os.path.isfile(tstDoc3b)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.rename", causeOSError)
mp.setattr("os.unlink", causeOSError)
errList = []
errList = theProject._legacyDataFolder(tstData, errList)
assert len(errList) > 0
assert os.path.isfile(tstDoc1m)
assert os.path.isfile(tstDoc1b)
assert os.path.isfile(tstDoc2m)
assert os.path.isfile(tstDoc2b)
assert os.path.isfile(tstDoc3m)
assert os.path.isfile(tstDoc3b)
# And succeed ...
errList = []
@@ -1203,14 +1201,14 @@ def testCoreProject_Backup(monkeypatch, dummyGUI, nwMinimal, tmpDir):
theProject.mainConf.backupPath = tmpDir
# Can't make folder
monkeypatch.setattr("os.mkdir", causeOSError)
assert not theProject.zipIt(doNotify=False)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("os.mkdir", causeOSError)
assert not theProject.zipIt(doNotify=False)
# Can't write archive
monkeypatch.setattr("shutil.make_archive", causeOSError)
assert not theProject.zipIt(doNotify=False)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("shutil.make_archive", causeOSError)
assert not theProject.zipIt(doNotify=False)
# Test correct settings
assert theProject.zipIt(doNotify=True)
+26 -30
View File
@@ -30,14 +30,13 @@ from tools import readFile, writeFile
from nw.core.spellcheck import NWSpellCheck, NWSpellEnchant, NWSpellSimple
@pytest.mark.core
def testCoreSpell_Super(monkeypatch, tmpDir, tmpConf):
def testCoreSpell_Super(monkeypatch, tmpDir):
"""Test the spell checker super class
"""
wList = os.path.join(tmpDir, "wordlist.txt")
writeFile(wList, "a_word\nb_word\nc_word\n")
spChk = NWSpellCheck()
spChk.mainConf = tmpConf
# Check that dummy functions return results that reflects that spell
# checking is effectively disabled
@@ -49,16 +48,16 @@ def testCoreSpell_Super(monkeypatch, tmpDir, tmpConf):
# Add a word to the user's dictionary
assert spChk._readProjectDictionary("dummy") is False
monkeypatch.setattr("builtins.open", causeOSError)
assert spChk._readProjectDictionary(wList) is False
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert spChk._readProjectDictionary(wList) is False
assert spChk._readProjectDictionary(wList) is True
assert spChk.projectDict == wList
# Cannot write to file
monkeypatch.setattr("builtins.open", causeOSError)
assert spChk.addWord("d_word") is False
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert spChk.addWord("d_word") is False
assert readFile(wList) == "a_word\nb_word\nc_word\n"
# First time, OK
@@ -72,28 +71,26 @@ def testCoreSpell_Super(monkeypatch, tmpDir, tmpConf):
# END Test testCoreSpell_Super
@pytest.mark.core
def testCoreSpell_Enchant(monkeypatch, tmpDir, tmpConf):
def testCoreSpell_Enchant(monkeypatch, tmpDir):
"""Test the pyenchant spell checker
"""
wList = os.path.join(tmpDir, "wordlist.txt")
writeFile(wList, "a_word\nb_word\nc_word\n")
# Block the enchant package (and trigger the dummy class)
monkeypatch.setitem(sys.modules, "enchant", None)
spChk = NWSpellEnchant()
with monkeypatch.context() as mp:
mp.setitem(sys.modules, "enchant", None)
spChk = NWSpellEnchant()
spChk.setLanguage("en", wList)
assert spChk.setLanguage("", "") is None
assert spChk.checkWord("")
assert spChk.suggestWords("") == []
assert spChk.listDictionaries() == []
assert spChk.describeDict() == ("", "")
monkeypatch.undo()
spChk.setLanguage("en", wList)
assert spChk.setLanguage("", "") is None
assert spChk.checkWord("")
assert spChk.suggestWords("") == []
assert spChk.listDictionaries() == []
assert spChk.describeDict() == ("", "")
# Load the proper enchant package
spChk = NWSpellEnchant()
spChk.mainConf = tmpConf
spChk.setLanguage("en", wList)
assert spChk.checkWord("a_word")
@@ -118,7 +115,7 @@ def testCoreSpell_Enchant(monkeypatch, tmpDir, tmpConf):
# END Test testCoreSpell_Enchant
@pytest.mark.core
def testCoreSpell_Simple(monkeypatch, tmpDir, tmpConf):
def testCoreSpell_Simple(monkeypatch, tmpDir):
"""Test the fallback simple spell checker
"""
wList = os.path.join(tmpDir, "wordlist.txt")
@@ -127,15 +124,14 @@ def testCoreSpell_Simple(monkeypatch, tmpDir, tmpConf):
writeFile(wDict, "# Comment\ne_word\nf_word\ng_word\n")
spChk = NWSpellSimple()
spChk.mainConf = tmpConf
spChk.mainConf.dictPath = tmpDir
# Load dictionary, but fail
monkeypatch.setattr("builtins.open", causeOSError)
spChk.setLanguage("en", wList)
assert spChk.spellLanguage is None
assert spChk.theWords == set(spChk.projDict)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
spChk.setLanguage("en", wList)
assert spChk.spellLanguage is None
assert spChk.theWords == set(spChk.projDict)
# Load dictionary properly
spChk.setLanguage("en", wList)
@@ -163,9 +159,9 @@ def testCoreSpell_Simple(monkeypatch, tmpDir, tmpConf):
assert "d_word" in wSuggest
# Break the matching
monkeypatch.setattr("difflib.get_close_matches", lambda *args, **kwargs: [""])
assert spChk.suggestWords("word") == []
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("difflib.get_close_matches", lambda *args, **kwargs: [""])
assert spChk.suggestWords("word") == []
# Capitalisation
wSuggest = spChk.suggestWords("D_wrod")
+9 -11
View File
@@ -112,11 +112,10 @@ def testCoreToken_Setters(dummyGUI):
# END Test testCoreToken_Setters
@pytest.mark.core
def testCoreToken_TextOps(monkeypatch, nwMinimal, dummyGUI, tmpConf):
def testCoreToken_TextOps(monkeypatch, nwMinimal, dummyGUI):
"""Test handling files and text in the Tokenizer class.
"""
theProject = NWProject(dummyGUI)
theProject.mainConf = tmpConf
theProject.projTree.setSeed(42)
theProject.loadProjectLocalisation("en")
@@ -157,13 +156,13 @@ def testCoreToken_TextOps(monkeypatch, nwMinimal, dummyGUI, tmpConf):
assert theToken.setText(sHandle) is True
assert theToken.theText == docText
monkeypatch.setattr("nw.constants.nwConst.MAX_DOCSIZE", 100)
assert theToken.setText(sHandle, docText) is True
assert theToken.theText == (
"# ERROR\n\n"
"Document 'New Scene' is too big (0.00 MB). Skipping.\n\n"
)
monkeypatch.undo()
with monkeypatch.context() as mp:
mp.setattr("nw.constants.nwConst.MAX_DOCSIZE", 100)
assert theToken.setText(sHandle, docText) is True
assert theToken.theText == (
"# ERROR\n\n"
"Document 'New Scene' is too big (0.00 MB). Skipping.\n\n"
)
assert theToken.setText(sHandle, docText) is True
assert theToken.theText == docText
@@ -411,11 +410,10 @@ def testCoreToken_Tokenize(dummyGUI):
# END Test testCoreToken_Tokenize
@pytest.mark.core
def testCoreToken_Headers(dummyGUI, tmpConf):
def testCoreToken_Headers(dummyGUI):
"""Test the header and page parser of the Tokenizer class.
"""
theProject = NWProject(dummyGUI)
theProject.mainConf = tmpConf
theProject.loadProjectLocalisation("en")
theToken = Tokenizer(theProject, dummyGUI)
+1 -3
View File
@@ -45,11 +45,9 @@ def xmlToText(xElem):
return rTxt
@pytest.mark.core
def testCoreToOdt_Convert(tmpConf, dummyGUI):
def testCoreToOdt_Convert(dummyGUI):
"""Test the converter of the ToHtml class.
"""
nw.CONFIG = tmpConf
theProject = NWProject(dummyGUI)
dummyGUI.theIndex = NWIndex(theProject, dummyGUI)
theDoc = ToOdt(theProject, dummyGUI, isFlat=True)
-2
View File
@@ -410,8 +410,6 @@ def testCoreTree_MakeHandles(monkeypatch, dummyGUI):
theTree._projTree[tHandle] = None
assert tHandle == "a79acf4c634a7"
monkeypatch.undo()
# END Test testCoreTree_MakeHandles
@pytest.mark.core