File indexing completed on 2024-05-26 05:05:59

0001 /*
0002    SPDX-FileCopyrightText: 2020 David Faure <faure@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "messagelistdelegatetest.h"
0008 #include "messages/message.h"
0009 #include "messages/messageattachment.h"
0010 #include "rocketchataccount.h"
0011 #include "room/delegate/messagelistdelegate.h"
0012 #include "ruqola.h"
0013 #include "testdata.h"
0014 
0015 #include <QStandardItemModel>
0016 #include <QStandardPaths>
0017 #include <QStyleOptionViewItem>
0018 #include <QTest>
0019 
0020 QTEST_MAIN(MessageListDelegateTest)
0021 
0022 MessageListDelegateTest::MessageListDelegateTest(QObject *parent)
0023     : QObject(parent)
0024 {
0025     initTestAccount();
0026 
0027     const QString userId = QStringLiteral("dfaureUserId");
0028     Ruqola::self()->rocketChatAccount()->insertAvatarUrl(userId, avatarLink());
0029 }
0030 
0031 void MessageListDelegateTest::layoutChecks_data()
0032 {
0033     QTest::addColumn<Message>("message");
0034     QTest::addColumn<bool>("withDateHeader");
0035 
0036     Message message;
0037     message.setMessageId(QStringLiteral("someNonEmptyId"));
0038     message.setUserId(QStringLiteral("dfaureUserId"));
0039     message.setUsername(QStringLiteral("dfaure"));
0040     message.setTimeStamp(QDateTime(QDate(2020, 2, 1), QTime(4, 7, 15)).toMSecsSinceEpoch());
0041     message.setMessageType(Message::NormalText);
0042 
0043     QTest::newRow("text_no_date") << message << false;
0044     QTest::newRow("text_with_date") << message << true;
0045 
0046     message.setMessageType(Message::NormalText);
0047     MessageAttachment msgAttach = testAttachment();
0048     msgAttach.setAttachmentType(MessageAttachment::Image);
0049     message.setAttachments({msgAttach});
0050 
0051     QTest::newRow("attachment_no_text_no_date") << message << false;
0052     QTest::newRow("attachment_no_text_with_date") << message << true;
0053 
0054     message.setText(QStringLiteral("The <b>text</b>"));
0055 
0056     QTest::newRow("attachment_with_text_no_date") << message << false;
0057     QTest::newRow("attachment_with_text_with_date") << message << true;
0058 
0059     message.setEditedByUsername(message.username());
0060 
0061     QTest::newRow("edited_with_attachment_with_text_with_date") << message << true;
0062 
0063     // TODO tests with reactions
0064 }
0065 
0066 void MessageListDelegateTest::layoutChecks()
0067 {
0068     QFETCH(Message, message);
0069     QFETCH(bool, withDateHeader);
0070 
0071     // GIVEN a delegate and an index pointing to a message
0072     MessageListDelegate delegate(Ruqola::self()->rocketChatAccount(), nullptr);
0073     delegate.setRocketChatAccount(Ruqola::self()->rocketChatAccount());
0074     QStyleOptionViewItem option;
0075     QWidget fakeWidget;
0076     option.widget = &fakeWidget;
0077     option.rect = QRect(100, 100, 500, 500);
0078 
0079     QStandardItemModel model;
0080     auto item = new QStandardItem;
0081     item->setData(message.username(), MessagesModel::Username);
0082     item->setData(message.userId(), MessagesModel::UserId);
0083     item->setData(withDateHeader, MessagesModel::DateDiffersFromPrevious);
0084     item->setData(message.displayTime(), MessagesModel::Timestamp);
0085     item->setData(QVariant::fromValue(&message), MessagesModel::MessagePointer);
0086     item->setData(message.text(), MessagesModel::OriginalMessage);
0087     item->setData(message.text(), MessagesModel::MessageConvertedText);
0088     model.setItem(0, 0, item);
0089     // Ensure it's not last, that's a special case in sizeHint
0090     auto item2 = new QStandardItem;
0091     model.setItem(1, 0, item2);
0092 
0093     const QModelIndex index = model.index(0, 0);
0094 
0095     // WHEN calculating sizehint
0096     const QSize sizeHint = delegate.sizeHint(option, index);
0097     QVERIFY(sizeHint.isValid());
0098     option.rect.setSize(sizeHint);
0099 
0100     // ... and redoing layout while painting
0101     const MessageListLayoutBase::Layout layout = delegate.doLayout(option, index);
0102 
0103     // THEN
0104     QCOMPARE(layout.senderText, QStringLiteral("@dfaure"));
0105     QCOMPARE(layout.timeStampText, QStringLiteral("04:07"));
0106     QVERIFY(option.rect.contains(layout.usableRect));
0107     QVERIFY(option.rect.contains(layout.senderRect.toRect()));
0108     if (message.attachments().isEmpty()) {
0109         QVERIFY(layout.attachmentsRect.isNull());
0110     } else {
0111         QVERIFY(sizeHint.height() > layout.senderRect.height() + 1);
0112         QVERIFY(option.rect.contains(layout.attachmentsRect));
0113     }
0114 
0115     // Text
0116     if (message.text().isEmpty()) {
0117         QVERIFY(!layout.textRect.isValid());
0118     } else {
0119         QVERIFY(option.rect.contains(layout.textRect));
0120         QCOMPARE(layout.usableRect.left(), layout.textRect.left());
0121         QVERIFY(layout.textRect.top() >= layout.usableRect.top());
0122         QVERIFY(!layout.senderRect.intersects(layout.textRect));
0123         if (!message.attachments().isEmpty()) {
0124             QCOMPARE(layout.attachmentsRect.top(), layout.textRect.y() + layout.textRect.height());
0125         }
0126     }
0127 
0128     const int bottom = layout.usableRect.y() + layout.usableRect.height();
0129 
0130 #if 0 // Need to reactivate it
0131     // Avatar
0132     QCOMPARE(qRound(layout.avatarPixmap.height() / layout.avatarPixmap.devicePixelRatioF()), layout.senderRect.height());
0133     QCOMPARE(layout.avatarPixmap.devicePixelRatioF(), fakeWidget.devicePixelRatioF());
0134     // qDebug() << layout.avatarPos.y() << "+" << layout.avatarPixmap.height() << "must be <=" << bottom;
0135     QVERIFY(layout.avatarPos.y() + layout.avatarPixmap.height() / layout.avatarPixmap.devicePixelRatioF() <= bottom);
0136 #endif
0137     // Reactions
0138     if (message.reactions().isEmpty()) {
0139         QCOMPARE(layout.reactionsHeight, 0);
0140     } else {
0141         QVERIFY(layout.reactionsHeight > 15);
0142         QVERIFY(layout.reactionsY + layout.reactionsHeight <= bottom);
0143     }
0144 
0145     // Edited
0146     if (message.wasEdited()) {
0147         QVERIFY(option.rect.contains(layout.editedIconRect));
0148         QVERIFY(!layout.editedIconRect.intersects(layout.textRect));
0149         QVERIFY(!layout.editedIconRect.intersects(layout.senderRect.toRect()));
0150     }
0151 }
0152 
0153 #include "moc_messagelistdelegatetest.cpp"