Exercise cached media preparation in real history widgets across scrolling and reopening
This commit is contained in:
1 parent
ba44c31f42
commit
9cabb698e2
2 files changed
+43
-2
No files matched your search
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user