Files
novelWriter/tests/test_tools/test_tools_manusbuild.py
T
2025-10-25 22:37:19 +02:00

158 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
novelWriter Manuscript Build Dialog Tester
============================================
This file is a part of novelWriter
Copyright (C) 2023 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
from pathlib import Path
import pytest
from PyQt6.QtCore import QUrl
from PyQt6.QtGui import QDesktopServices
from PyQt6.QtWidgets import QFileDialog, QListWidgetItem
from pytestqt.qtbot import QtBot
from novelwriter.constants import nwLabels
from novelwriter.core.buildsettings import BuildSettings
from novelwriter.enum import nwBuildFmt
from novelwriter.guimain import GuiMain
from novelwriter.shared import _GuiAlert
from novelwriter.tools.manusbuild import GuiManuscriptBuild
from novelwriter.types import QtDialogClose
from tests.tools import buildTestProject
@pytest.mark.gui
def testToolManuscriptBuild_Main(
monkeypatch, qtbot: QtBot, nwGUI: GuiMain, fncPath: Path, projPath: Path, mockRnd
):
"""Test the GuiManuscriptBuild dialog."""
buildTestProject(nwGUI, projPath)
nwGUI.openProject(projPath)
build = BuildSettings()
build.setLastBuildPath(fncPath)
manus = GuiManuscriptBuild(nwGUI, build)
manus.show()
# Check initial values
assert manus.buildPath.text() == str(fncPath)
assert manus.buildName.text() == "New Project - "
assert manus.listContent.count() == 3 # All novel docs
# Reset build name to default
build.setName("Test Build")
manus.btnReset.click()
assert manus.buildName.text() == "New Project - Test Build"
# Change path
with monkeypatch.context() as mp:
mp.setattr(QFileDialog, "getExistingDirectory", lambda *a: str(projPath))
manus.btnBrowse.click()
assert manus.buildPath.text() == str(projPath)
# Builds
# ======
# Reset values
manus.buildPath.setText(str(fncPath))
manus.buildName.setText("TestBuild")
# Helper function
def selectFormat(fmt):
for i in range(manus.listFormats.count()):
item = manus.listFormats.item(i)
assert isinstance(item, QListWidgetItem)
if item.data(manus.D_KEY) == fmt:
manus.listFormats.setCurrentItem(item)
return
raise ValueError("No such key in format list")
# Build documents
lastFmt = None
for fmt in nwBuildFmt:
selectFormat(fmt)
assert manus._getSelectedFormat() == fmt
manus.btnBuild.click()
assert (fncPath / "TestBuild").with_suffix(nwLabels.BUILD_EXT[fmt]).exists()
lastFmt = fmt
button = manus.buttonBox.button(QtDialogClose)
assert button is not None
manus._dialogButtonClicked(button)
manus.deleteLater()
assert build.lastBuildName == "TestBuild"
assert build.lastFormat == lastFmt
assert build.lastBuildPath == fncPath
# Error Handling
# ==============
manus = GuiManuscriptBuild(nwGUI, build)
manus.show()
# Name, path and format should be remembered
assert manus.buildPath.text() == str(fncPath)
assert manus.buildName.text() == "TestBuild"
assert manus._getSelectedFormat() == lastFmt
# Check handling of no selected build
manus.listFormats.clearSelection()
assert manus._getSelectedFormat() is None
assert manus._runBuild() is False
# Check ODT build with no name set, which should just reset it
selectFormat(nwBuildFmt.ODT)
manus.buildName.clear()
assert manus._runBuild() is True
assert manus.buildName.text() == "New Project - Test Build"
assert (fncPath / "New Project - Test Build.odt").exists()
# But invalid path should fail
manus.buildPath.setText(str(fncPath / "blabla"))
assert manus._runBuild() is False
# Blocking overwrite should also fail
manus.buildPath.setText(str(fncPath))
manus.buildName.setText("TestBuild")
with monkeypatch.context() as mp:
mp.setattr(_GuiAlert, "finalState", False)
assert manus._runBuild() is False
# Test that the open button works
lastUrl = ""
def mockOpenUrl(url: QUrl) -> None:
nonlocal lastUrl
lastUrl = url.toString()
with monkeypatch.context() as mp:
mp.setattr(QDesktopServices, "openUrl", mockOpenUrl)
manus.btnOpen.click()
assert lastUrl.startswith("file://")
# Finish
button = manus.buttonBox.button(QtDialogClose)
assert button is not None
manus._dialogButtonClicked(button)
# qtbot.stop()