# -*- coding: utf-8 -*- """novelWriter Test Config """ import sys import pytest import shutil import os from nwdummy import DummyMain from PyQt5.QtWidgets import QMessageBox sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) from nw.config import Config # noqa: E402 ## # Core Test Folders ## @pytest.fixture(scope="session") def nwTemp(): """A temporary folder for the test session. This folder is presistent after the test so that the status of generated files can be checked. The folder is instead cleared before a new test session. """ testDir = os.path.dirname(__file__) tempDir = os.path.join(testDir, "temp") if os.path.isdir(tempDir): shutil.rmtree(tempDir) if not os.path.isdir(tempDir): os.mkdir(tempDir) return tempDir @pytest.fixture(scope="session") def nwRef(): """The folder where all the reference files are stored for verifying the results of tests. """ testDir = os.path.dirname(__file__) refDir = os.path.join(testDir, "reference") return refDir ## # novelWriter Objects ## @pytest.fixture(scope="session") def tmpConf(nwTemp): """Create a temporary novelWriter configuration object. """ theConf = Config() theConf.initConfig(nwTemp, nwTemp) theConf.setLastPath("") return theConf @pytest.fixture(scope="session") def nwConf(nwRef, nwTemp): """Temporary novelWriter configuration used for the dummy instance of novelWriter's main GUI. """ theConf = Config() theConf.initConfig(nwRef, nwTemp) return theConf @pytest.fixture(scope="session") def nwDummy(nwRef, nwTemp, nwConf): """Create a dummy instance of novelWriter's main GUI class. """ theDummy = DummyMain() theDummy.mainConf = nwConf return theDummy ## # Temporary Test Folders ## @pytest.fixture(scope="session") def nwTempProj(nwTemp): """A temporary folder for project tests. """ projDir = os.path.join(nwTemp, "proj") if not os.path.isdir(projDir): os.mkdir(projDir) return projDir @pytest.fixture(scope="session") def nwTempGUI(nwTemp): """A temporary folder for GUI tests. """ guiDir = os.path.join(nwTemp, "gui") if not os.path.isdir(guiDir): os.mkdir(guiDir) return guiDir @pytest.fixture(scope="session") def nwTempBuild(nwTemp): """A temporary folder for build tests. """ buildDir = os.path.join(nwTemp, "build") if not os.path.isdir(buildDir): os.mkdir(buildDir) return buildDir @pytest.fixture(scope="function") def nwFuncTemp(nwTemp): """A temporary folder for a single test function. """ funcDir = os.path.join(nwTemp, "ftemp") if os.path.isdir(funcDir): shutil.rmtree(funcDir) if not os.path.isdir(funcDir): os.mkdir(funcDir) yield funcDir if os.path.isdir(funcDir): shutil.rmtree(funcDir) return ## # Temp Folders for Projects ## @pytest.fixture(scope="function") def nwMinimal(nwTemp): """A minimal novelWriter example project. """ testDir = os.path.dirname(__file__) minimalStore = os.path.join(testDir, "minimal") minimalDir = os.path.join(nwTemp, "minimal") if os.path.isdir(minimalDir): shutil.rmtree(minimalDir) shutil.copytree(minimalStore, minimalDir) cacheDir = os.path.join(minimalDir, "cache") if os.path.isdir(cacheDir): shutil.rmtree(cacheDir) metaDir = os.path.join(minimalDir, "meta") if os.path.isdir(metaDir): shutil.rmtree(metaDir) yield minimalDir if os.path.isdir(minimalDir): shutil.rmtree(minimalDir) return @pytest.fixture(scope="function") def nwLipsum(nwTemp): """A medium sized novelWriter example project with a lot of Lorem Ipsum dummy text. """ testDir = os.path.dirname(__file__) lipsumStore = os.path.join(testDir, "lipsum") lipsumDir = os.path.join(nwTemp, "lipsum") if os.path.isdir(lipsumDir): shutil.rmtree(lipsumDir) shutil.copytree(lipsumStore, lipsumDir) cacheDir = os.path.join(lipsumDir, "cache") if os.path.isdir(cacheDir): shutil.rmtree(cacheDir) metaDir = os.path.join(lipsumDir, "meta") if os.path.isdir(metaDir): shutil.rmtree(metaDir) yield lipsumDir if os.path.isdir(lipsumDir): shutil.rmtree(lipsumDir) return @pytest.fixture(scope="function") def nwOldProj(nwTemp): """A minimal movelWriter project using the old folder structure. """ testDir = os.path.dirname(__file__) oldProjStore = os.path.join(testDir, "oldproj") oldProjDir = os.path.join(nwTemp, "oldproj") if os.path.isdir(oldProjDir): shutil.rmtree(oldProjDir) shutil.copytree(oldProjStore, oldProjDir) yield oldProjDir if os.path.isdir(oldProjDir): shutil.rmtree(oldProjDir) return ## # Monkey Patch Dialogs ## @pytest.fixture(scope="function") def yesToAll(monkeypatch): """Make the message boxes/questions always say yes. """ monkeypatch.setattr( QMessageBox, "question", lambda *args, **kwargs: QMessageBox.Yes ) monkeypatch.setattr( QMessageBox, "information", lambda *args, **kwargs: QMessageBox.Yes ) monkeypatch.setattr( QMessageBox, "warning", lambda *args, **kwargs: QMessageBox.Yes ) monkeypatch.setattr( QMessageBox, "critical", lambda *args, **kwargs: QMessageBox.Yes ) return