Add test coverage of session log class
This commit is contained in:
@@ -112,7 +112,7 @@ class NWSessionLog:
|
|||||||
def iterRecords(self) -> Iterator[dict]:
|
def iterRecords(self) -> Iterator[dict]:
|
||||||
"""Iterate through all records in the log."""
|
"""Iterate through all records in the log."""
|
||||||
sessFile = self._project.storage.getMetaFile(nwFiles.SESS_FILE)
|
sessFile = self._project.storage.getMetaFile(nwFiles.SESS_FILE)
|
||||||
if isinstance(sessFile, Path):
|
if isinstance(sessFile, Path) and sessFile.is_file():
|
||||||
try:
|
try:
|
||||||
with open(sessFile, mode="r", encoding="utf-8") as fObj:
|
with open(sessFile, mode="r", encoding="utf-8") as fObj:
|
||||||
for line in fObj:
|
for line in fObj:
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
"""
|
||||||
|
novelWriter – NWSessionLog Class Tester
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
This file is a part of novelWriter
|
||||||
|
Copyright 2018–2023, Veronica Berglyd Olsen
|
||||||
|
|
||||||
|
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/>.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from time import sleep
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from tools import buildTestProject
|
||||||
|
from mocked import causeOSError
|
||||||
|
|
||||||
|
from novelwriter.constants import nwFiles
|
||||||
|
from novelwriter.core.project import NWProject
|
||||||
|
from novelwriter.core.sessions import NWSessionLog
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.core
|
||||||
|
def testCoreSessions_Main(monkeypatch, mockGUI, fncPath):
|
||||||
|
"""Test log file handling of the NWSessionLog class."""
|
||||||
|
project = NWProject(mockGUI)
|
||||||
|
buildTestProject(project, fncPath)
|
||||||
|
|
||||||
|
logFile = project.storage.getMetaFile(nwFiles.SESS_FILE)
|
||||||
|
assert isinstance(logFile, Path)
|
||||||
|
|
||||||
|
# Set some moch word counts
|
||||||
|
project.data.setInitCounts(50, 60)
|
||||||
|
project.data.setCurrCounts(160, 150)
|
||||||
|
|
||||||
|
# The project init should already have created the session
|
||||||
|
sessLog = project.session
|
||||||
|
assert isinstance(sessLog, NWSessionLog)
|
||||||
|
assert sessLog.start > 0.0
|
||||||
|
|
||||||
|
# Starting the session again should reset the timer
|
||||||
|
currTime = sessLog.start
|
||||||
|
sleep(0.015) # Make sure we don't hit clock resolution issues on Windows
|
||||||
|
sessLog.startSession()
|
||||||
|
assert sessLog.start > currTime
|
||||||
|
|
||||||
|
# There should not be a logfile
|
||||||
|
assert not logFile.exists()
|
||||||
|
assert len(list(sessLog.iterRecords())) == 0
|
||||||
|
|
||||||
|
# Create the initial and first records
|
||||||
|
assert sessLog.appendSession(0.8) is True
|
||||||
|
assert logFile.exists() # Logfile now exists
|
||||||
|
records = list(sessLog.iterRecords())
|
||||||
|
assert len(records) == 2
|
||||||
|
assert records[0]["type"] == "initial"
|
||||||
|
assert records[0]["offset"] == 110 # Sum of initial word counts
|
||||||
|
assert records[1]["type"] == "record"
|
||||||
|
assert records[1]["novel"] == 160
|
||||||
|
assert records[1]["notes"] == 150
|
||||||
|
assert records[1]["idle"] == 1 # Should be rounded to full seconds
|
||||||
|
|
||||||
|
# Adding another record without changing word count should do nothing
|
||||||
|
project.data.setInitCounts(160, 150)
|
||||||
|
project.data.setCurrCounts(160, 150)
|
||||||
|
assert sessLog.appendSession(1.6) is False
|
||||||
|
assert len(list(sessLog.iterRecords())) == 2
|
||||||
|
|
||||||
|
# But adding when count has changed should
|
||||||
|
project.data.setInitCounts(160, 150)
|
||||||
|
project.data.setCurrCounts(270, 240)
|
||||||
|
sessLog._start -= 350.0 # Backdate the session start to allow logging
|
||||||
|
assert sessLog.appendSession(1.6) is True
|
||||||
|
records = list(sessLog.iterRecords())
|
||||||
|
assert len(records) == 3
|
||||||
|
assert records[2]["novel"] == 270
|
||||||
|
assert records[2]["notes"] == 240
|
||||||
|
assert records[2]["idle"] == 2 # Should be rounded to full seconds
|
||||||
|
|
||||||
|
# Make file path unresolvable, and try appending another record
|
||||||
|
with monkeypatch.context() as mp:
|
||||||
|
mp.setattr("novelwriter.core.storage.NWStorage.getMetaFile", lambda *a: None)
|
||||||
|
assert sessLog.appendSession(1.6) is False
|
||||||
|
assert len(list(sessLog.iterRecords())) == 3
|
||||||
|
|
||||||
|
# Make the file open fail, and check that it's handled
|
||||||
|
with monkeypatch.context() as mp:
|
||||||
|
mp.setattr("builtins.open", causeOSError)
|
||||||
|
assert sessLog.appendSession(1.6) is False
|
||||||
|
assert len(list(sessLog.iterRecords())) == 3
|
||||||
|
|
||||||
|
# Make the file load fail, and check that it's handled
|
||||||
|
with monkeypatch.context() as mp:
|
||||||
|
mp.setattr("builtins.open", causeOSError)
|
||||||
|
assert len(list(sessLog.iterRecords())) == 0
|
||||||
|
|
||||||
|
# Make file path unresolvable
|
||||||
|
with monkeypatch.context() as mp:
|
||||||
|
mp.setattr("novelwriter.core.storage.NWStorage.getMetaFile", lambda *a: None)
|
||||||
|
assert len(list(sessLog.iterRecords())) == 0
|
||||||
|
|
||||||
|
# END Test testCoreSessions_Main
|
||||||
Reference in New Issue
Block a user