def testCoreTree_ToCFile(monkeypatch, mockGUI, mockItems, tmpDir): """Test writing the ToC.txt file. """ theProject = NWProject(mockGUI) theTree = NWTree(theProject) for tHandle, pHandle, nwItem in mockItems: theTree.append(tHandle, pHandle, nwItem) theTree.updateItemData(tHandle) assert len(theTree) == len(mockItems) theTree._treeOrder.append("stuff") def mockIsFile(fileName): """Return True for items that are files in novelWriter and should thus also be files in the project folder structure. """ dItem = theTree[fileName[8:21]] assert dItem is not None return dItem.itemType == nwItemType.FILE monkeypatch.setattr("os.path.isfile", mockIsFile) theProject.projContent = "content" theProject.projPath = None assert not theTree.writeToCFile() theProject.projPath = tmpDir assert theTree.writeToCFile() pathA = os.path.join("content", "c000000000001.nwd") pathB = os.path.join("content", "c000000000002.nwd") pathC = os.path.join("content", "b000000000002.nwd") assert readFile(os.path.join(tmpDir, nwFiles.TOC_TXT)) == ( "\n" "Table of Contents\n" "=================\n" "\n" "File Name Class Layout Document Label\n" "--------------------------------------------------------------\n" f"{pathA} NOVEL DOCUMENT Chapter One\n" f"{pathB} NOVEL DOCUMENT Scene One\n" f"{pathC} CHARACTER NOTE Jane Doe\n")
def testCoreProject_LockFile(monkeypatch, fncDir, mockGUI): """Test lock file functions for the project folder. """ theProject = NWProject(mockGUI) lockFile = os.path.join(fncDir, nwFiles.PROJ_LOCK) # No project assert theProject._writeLockFile() is False assert theProject._readLockFile() == ["ERROR"] assert theProject._clearLockFile() is False theProject.projPath = fncDir theProject.mainConf.hostName = "TestHost" theProject.mainConf.osType = "TestOS" theProject.mainConf.kernelVer = "1.0" # Block open with monkeypatch.context() as mp: mp.setattr("builtins.open", causeOSError) assert theProject._writeLockFile() is False # Write lock file with monkeypatch.context() as mp: mp.setattr("novelwriter.core.project.time", lambda: 123.4) assert theProject._writeLockFile() is True assert readFile(lockFile) == "TestHost\nTestOS\n1.0\n123\n" # Block open 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 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) assert theProject._clearLockFile() is True assert not os.path.isfile(lockFile) # Read again, no file assert theProject._readLockFile() == [] # Read an invalid lock file writeFile(lockFile, "A\nB") assert theProject._readLockFile() == ["ERROR"] assert theProject._clearLockFile() is True
def testCoreProject_Helpers(monkeypatch, fncDir, mockGUI): """Test helper functions for the project folder. """ theProject = NWProject(mockGUI) # No path assert theProject.ensureFolderStructure() is False # Set the correct dir theProject.projPath = fncDir # Block user's home folder with monkeypatch.context() as mp: mp.setattr("os.path.expanduser", lambda *a, **k: fncDir) assert theProject.ensureFolderStructure() is False # Create a file to block meta folder metaDir = os.path.join(fncDir, "meta") writeFile(metaDir, "stuff") assert theProject.ensureFolderStructure() is False os.unlink(metaDir) # Create a file to block cache folder cacheDir = os.path.join(fncDir, "cache") writeFile(cacheDir, "stuff") assert theProject.ensureFolderStructure() is False os.unlink(cacheDir) # Create a file to block content folder contentDir = os.path.join(fncDir, "content") writeFile(contentDir, "stuff") assert theProject.ensureFolderStructure() is False os.unlink(contentDir) # Now, do it right assert theProject.ensureFolderStructure() is True assert os.path.isdir(metaDir) assert os.path.isdir(cacheDir) assert os.path.isdir(contentDir)