Exercise cached media preparation in real history widgets across scrolling and reopening

This commit is contained in:
evgeny committed 2026-10-28 15:09:35 +01:00
1 parent ba44c31f42
commit 9cabb698e2
2 files changed
+43 -2

No files matched your search

+41
View File
@@ -62,6 +62,47 @@ class DmDeletionTest : public QObject {
private slots:
void initTestCase() { debug_config_init(); gui_bridge_init(); }
void mediaPreviews() {
QTemporaryDir directory; QVERIFY(directory.isValid()); debug_set_category_level(DEBUG_CATEGORY_MEDIA, DEBUG_LEVEL_DEBUG);
const QString picture = directory.filePath("picture.png"); QImage pixels(1200, 800, QImage::Format_ARGB32);
pixels.fill(QColor(30, 150, 70, 90)); QVERIFY(pixels.save(picture, "PNG"));
QFile fixture(QFINDTESTDATA("data/preview_video.b64")); QVERIFY(fixture.open(QIODevice::ReadOnly));
QFile video(directory.filePath("video.mp4")); QVERIFY(video.open(QIODevice::WriteOnly));
QByteArray mp4 = QByteArray::fromBase64(fixture.readAll()); QCOMPARE(video.write(mp4), mp4.size()); video.close();
DbManager db; db.setDbPath(directory.path());
auto seed = [&](MessageList& history, int count) {
auto* view = history.findChild<ChatView*>();
auto* model = qobject_cast<QStandardItemModel*>(view->model());
for (int row = 0; row < count; ++row) {
auto* item = new QStandardItem; item->setData(row + 1, MsgIdRole); item->setData("Alice", MsgAuthorRole);
item->setData("12:34", MsgTimeRole); item->setData(row % 2 ? "video/mp4" : "image/png", MsgContentTypeRole);
item->setData(row % 2 ? video.fileName() : picture, MsgVoiceFileRole); item->setData(2, MsgFileDownloadStateRole);
item->setData(1200, MsgImageWidthRole); item->setData(800, MsgImageHeightRole); item->setData(1000, MsgFileSizeRole);
model->appendRow(item);
}
history.resize(640, 480); history.show(); view->scrollToTop(); return model;
};
const QString cache = directory.filePath("media_previews/v1"); QHash<QString, QDateTime> dates;
{
MessageList history(&db); auto* model = seed(history, 24); auto* view = history.findChild<ChatView*>();
QTRY_VERIFY_WITH_TIMEOUT(!model->item(0)->data(MsgImagePreviewRole).value<QImage>().isNull(), 5000);
QTRY_VERIFY_WITH_TIMEOUT(!model->item(1)->data(MsgImagePreviewRole).value<QImage>().isNull(), 5000);
QCOMPARE(QDir(cache).entryList({"*.preview"}, QDir::Files).size(), 2);
view->scrollToBottom();
QTRY_VERIFY_WITH_TIMEOUT(!model->item(23)->data(MsgImagePreviewRole).value<QImage>().isNull(), 5000);
QVERIFY(!model->item(0)->data(MsgImagePreviewRole).isValid());
for (const auto& file : QDir(cache).entryInfoList({"*.preview"}, QDir::Files)) dates[file.fileName()] = file.lastModified();
}
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
{
MessageList reopened(&db); auto* model = seed(reopened, 2);
QTRY_VERIFY_WITH_TIMEOUT(!model->item(0)->data(MsgImagePreviewRole).value<QImage>().isNull(), 5000);
QTRY_VERIFY_WITH_TIMEOUT(!model->item(1)->data(MsgImagePreviewRole).value<QImage>().isNull(), 5000);
QCOMPARE(QDir(cache).entryList({"*.preview"}, QDir::Files).size(), 2);
for (const auto& file : QDir(cache).entryInfoList({"*.preview"}, QDir::Files)) QCOMPARE(file.lastModified(), dates.value(file.fileName()));
}
}
void deleteThroughWindowAndCore() {
QTemporaryDir directory; QVERIFY(directory.isValid());
directory.setAutoRemove(false);