Complete test coverage of build settings module

This commit is contained in:
Veronica Berglyd Olsen
2023-06-18 19:22:42 +02:00
parent 73451faa31
commit 4b194752eb
2 changed files with 109 additions and 8 deletions
+6 -7
View File
@@ -450,14 +450,13 @@ class BuildCollection:
build.unpack(self._builds[buildID])
return build
def setBuild(self, build: BuildSettings) -> bool:
def setBuild(self, build: BuildSettings):
"""Set build settings data in the collection."""
if not isinstance(build, BuildSettings):
return False
buildID = build.buildID
self._builds[buildID] = build.pack()
self._saveCollection()
return True
if isinstance(build, BuildSettings):
buildID = build.buildID
self._builds[buildID] = build.pack()
self._saveCollection()
return
def removeBuild(self, buildID: str):
"""Remove the a build from the collection."""
+103 -1
View File
@@ -19,17 +19,21 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import json
import shutil
import uuid
import pytest
from pathlib import Path
from novelwriter.constants import nwFiles
from novelwriter.core.item import NWItem
from tests.mocked import causeOSError
from tools import C, buildTestProject
from novelwriter.enum import nwBuildFmt, nwItemClass
from novelwriter.core.project import NWProject
from novelwriter.core.buildsettings import BuildSettings, FilterMode
from novelwriter.core.buildsettings import BuildCollection, BuildSettings, FilterMode
def isUUID(value):
@@ -361,3 +365,101 @@ def testCoreBuildSettings_Filters(mockGUI, fncPath: Path, mockRnd):
assert build.buildItemFilter(None) == {} # type: ignore
# END Test testCoreBuildSettings_Filters
@pytest.mark.core
def testCoreBuildSettings_Collection(monkeypatch, mockGUI, fncPath: Path, mockRnd):
"""Test the collections class for builds."""
project = NWProject(mockGUI)
buildTestProject(project, fncPath)
buildsFile = project.storage.getMetaFile(nwFiles.BUILDS_FILE)
assert isinstance(buildsFile, Path)
# No initial builds in a fresh project
builds = BuildCollection(project)
assert len(builds) == 0
assert not buildsFile.exists()
# Greate a default build
buildOne = BuildSettings()
buildOne.setName("Build One")
buildIDOne = buildOne.buildID
# Check that invalid type is ahndled
builds.setBuild(None) # type: ignore
assert len(builds) == 0
assert not buildsFile.exists()
assert builds.getBuild(buildIDOne) is None
# Add the build
builds.setBuild(buildOne)
assert len(builds) == 1
assert buildsFile.exists()
assert builds.getBuild(buildIDOne).buildID == buildIDOne
# Create another build
buildTwo = BuildSettings()
buildTwo.setName("Build Two")
buildIDTwo = buildTwo.buildID
# Check that we can extract infor about the builds
builds.setBuild(buildTwo)
assert len(builds) == 2
assert buildsFile.exists()
assert builds.getBuild(buildIDTwo).buildID == buildIDTwo
assert list(builds.builds()) == [
(buildIDOne, "Build One"),
(buildIDTwo, "Build Two"),
]
# Check the file content
data = json.loads(buildsFile.read_text(encoding="utf-8"))
assert list(data["novelWriter.builds"].keys()) == [buildIDOne, buildIDTwo]
# Remove a build
builds.removeBuild(buildIDOne)
assert builds.getBuild(buildIDOne) is None
assert list(builds.builds()) == [
(buildIDTwo, "Build Two"),
]
# Check the file content
data = json.loads(buildsFile.read_text(encoding="utf-8"))
assert list(data["novelWriter.builds"].keys()) == [buildIDTwo]
builds.setBuild(buildOne)
assert list(builds.builds()) == [
(buildIDTwo, "Build Two"),
(buildIDOne, "Build One"),
]
# Check errors: No valid path
with monkeypatch.context() as mp:
mp.setattr("novelwriter.core.storage.NWStorage.getMetaFile", lambda *a: None)
assert builds._loadCollection() is False
assert builds._saveCollection() is False
# Check errors: I/O error
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert builds._loadCollection() is False
assert builds._saveCollection() is False
# Check errors: Can't parse json file
shutil.copy(buildsFile, buildsFile.with_suffix(".bak"))
buildsFile.write_text("foobar")
assert builds._loadCollection() is False
# Check errors: Valid jason file, but list instead of object
buildsFile.write_text("[]")
assert builds._loadCollection() is False
buildsFile.unlink()
shutil.copy(buildsFile.with_suffix(".bak"), buildsFile)
# Load builds file into new object
another = BuildCollection(project)
assert list(another.builds()) == [
(buildIDTwo, "Build Two"),
(buildIDOne, "Build One"),
]
# END Test testCoreBuildSettings_Collection