diff --git a/tools/chatgui/tests/test_dm_deletion.cpp b/tools/chatgui/tests/test_dm_deletion.cpp index 29d3bb28..5d95b391 100644 --- a/tools/chatgui/tests/test_dm_deletion.cpp +++ b/tools/chatgui/tests/test_dm_deletion.cpp @@ -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(); + auto* model = qobject_cast(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 dates; + { + MessageList history(&db); auto* model = seed(history, 24); auto* view = history.findChild(); + QTRY_VERIFY_WITH_TIMEOUT(!model->item(0)->data(MsgImagePreviewRole).value().isNull(), 5000); + QTRY_VERIFY_WITH_TIMEOUT(!model->item(1)->data(MsgImagePreviewRole).value().isNull(), 5000); + QCOMPARE(QDir(cache).entryList({"*.preview"}, QDir::Files).size(), 2); + view->scrollToBottom(); + QTRY_VERIFY_WITH_TIMEOUT(!model->item(23)->data(MsgImagePreviewRole).value().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().isNull(), 5000); + QTRY_VERIFY_WITH_TIMEOUT(!model->item(1)->data(MsgImagePreviewRole).value().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); diff --git a/tools/chatgui/tests/test_media_preview_cache.cpp b/tools/chatgui/tests/test_media_preview_cache.cpp index 2a2585c8..29d9c177 100644 --- a/tools/chatgui/tests/test_media_preview_cache.cpp +++ b/tools/chatgui/tests/test_media_preview_cache.cpp @@ -41,7 +41,7 @@ private slots: QTemporaryDir temporary; const QString source = temporary.filePath("original.png"); QVERIFY(image(source, Qt::green)); Cache cache(temporary.filePath("previews")); auto original = cache.load(source, Kind::Image, Now); QVERIFY(!original.image.isNull()); QFile record(original.file); QVERIFY(record.open(QIODevice::ReadOnly)); - QVERIFY(record.setFileTime(QDateTime::fromMSecsSinceEpoch(Now + 20 * LifetimeMs, Qt::UTC), QFileDevice::FileModificationTime)); record.close(); + QVERIFY(record.setFileTime(QDateTime::fromMSecsSinceEpoch(Now + 20 * LifetimeMs).toUTC(), QFileDevice::FileModificationTime)); record.close(); const QString unrelated = temporary.filePath("previews/notes.preview"); QFile notes(unrelated); QVERIFY(notes.open(QIODevice::WriteOnly)); notes.write("unrelated file"); notes.close(); auto boundary = cache.load(source, Kind::Image, Now + LifetimeMs); QCOMPARE(boundary.created, Now); @@ -58,7 +58,7 @@ private slots: Cache reopened(directory); auto repaired = reopened.load(source, Kind::Image, Now + 1); QCOMPARE(int(repaired.origin), int(Origin::Generated)); QVERIFY(repaired.error.isEmpty()); QVERIFY(!repaired.image.isNull()); QVERIFY(image(source, Qt::blue)); QFile changed(source); QVERIFY(changed.open(QIODevice::ReadOnly)); - QVERIFY(changed.setFileTime(QDateTime::fromMSecsSinceEpoch(Now + 4000, Qt::UTC), QFileDevice::FileModificationTime)); changed.close(); + QVERIFY(changed.setFileTime(QDateTime::fromMSecsSinceEpoch(Now + 4000).toUTC(), QFileDevice::FileModificationTime)); changed.close(); auto blue = reopened.load(source, Kind::Image, Now + 2); QVERIFY(blue.file != red.file); QCOMPARE(int(blue.origin), int(Origin::Generated)); QVERIFY(blue.image.pixelColor(30, 30).blue() > 200); }