106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
import datetime as _dt
|
|
|
|
from PySide6.QtWidgets import QLabel
|
|
|
|
from bouquin.statistics_dialog import StatisticsDialog
|
|
from bouquin import strings
|
|
|
|
|
|
class FakeStatsDB:
|
|
"""Minimal stub that returns a fixed stats payload."""
|
|
|
|
def __init__(self):
|
|
d1 = _dt.date(2024, 1, 1)
|
|
d2 = _dt.date(2024, 1, 2)
|
|
self.stats = (
|
|
2, # pages_with_content
|
|
5, # total_revisions
|
|
"2024-01-02", # page_most_revisions
|
|
3, # page_most_revisions_count
|
|
{d1: 10, d2: 20}, # words_by_date
|
|
30, # total_words
|
|
4, # unique_tags
|
|
"2024-01-02", # page_most_tags
|
|
2, # page_most_tags_count
|
|
{d1: 1, d2: 2}, # revisions_by_date
|
|
)
|
|
self.called = False
|
|
|
|
def gather_stats(self):
|
|
self.called = True
|
|
return self.stats
|
|
|
|
|
|
def test_statistics_dialog_populates_fields_and_heatmap(qtbot):
|
|
# Make sure we have a known language for label texts
|
|
strings.load_strings("en")
|
|
|
|
db = FakeStatsDB()
|
|
dlg = StatisticsDialog(db)
|
|
qtbot.addWidget(dlg)
|
|
dlg.show()
|
|
|
|
# Stats were actually requested from the DB
|
|
assert db.called
|
|
|
|
# Window title comes from translations
|
|
assert dlg.windowTitle() == strings._("statistics")
|
|
|
|
# Grab all label texts for simple content checks
|
|
label_texts = {lbl.text() for lbl in dlg.findChildren(QLabel)}
|
|
|
|
# Page with most revisions / tags are rendered as "DATE (COUNT)"
|
|
assert "2024-01-02 (3)" in label_texts
|
|
assert "2024-01-02 (2)" in label_texts
|
|
|
|
# Heatmap is created and uses "words" by default
|
|
words_by_date = db.stats[4]
|
|
revisions_by_date = db.stats[-1]
|
|
|
|
assert hasattr(dlg, "_heatmap")
|
|
assert dlg._heatmap._data == words_by_date
|
|
|
|
# Switching the metric to "revisions" should swap the dataset
|
|
dlg.metric_combo.setCurrentIndex(1) # 0 = words, 1 = revisions
|
|
qtbot.wait(10)
|
|
assert dlg._heatmap._data == revisions_by_date
|
|
|
|
|
|
class EmptyStatsDB:
|
|
"""Stub that returns a 'no data yet' stats payload."""
|
|
|
|
def __init__(self):
|
|
self.called = False
|
|
|
|
def gather_stats(self):
|
|
self.called = True
|
|
return (
|
|
0, # pages_with_content
|
|
0, # total_revisions
|
|
None, # page_most_revisions
|
|
0,
|
|
{}, # words_by_date
|
|
0, # total_words
|
|
0, # unique_tags
|
|
None, # page_most_tags
|
|
0,
|
|
{}, # revisions_by_date
|
|
)
|
|
|
|
|
|
def test_statistics_dialog_no_data_shows_placeholder(qtbot):
|
|
strings.load_strings("en")
|
|
|
|
db = EmptyStatsDB()
|
|
dlg = StatisticsDialog(db)
|
|
qtbot.addWidget(dlg)
|
|
dlg.show()
|
|
|
|
assert db.called
|
|
|
|
label_texts = [lbl.text() for lbl in dlg.findChildren(QLabel)]
|
|
assert strings._("stats_no_data") in label_texts
|
|
|
|
# When there's no data, the heatmap and metric combo shouldn't exist
|
|
assert not hasattr(dlg, "metric_combo")
|
|
assert not hasattr(dlg, "_heatmap")
|