1 /*
2    SPDX-FileCopyrightText: 2020-2021 Laurent Montel <montel@kde.org>
3 
4    SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "roomwidgettest.h"
8 #include "model/roommodel.h"
9 #include "otr/otrwidget.h"
10 #include "rocketchataccount.h"
11 #include "room/messagelinewidget.h"
12 #include "room/messagelistview.h"
13 #include "room/readonlylineeditwidget.h"
14 #include "room/reconnectinfowidget.h"
15 #include "room/roomcounterinfowidget.h"
16 #include "room/roomheaderwidget.h"
17 #include "room/roomquotemessagewidget.h"
18 #include "room/roomreplythreadwidget.h"
19 #include "room/roomwidget.h"
20 #include "room/uploadfileprogressstatuswidget.h"
21 #include "room/usersinroomflowwidget.h"
22 
23 #include <ruqola.h>
24 
25 #include <QStackedWidget>
26 #include <QTest>
27 #include <QVBoxLayout>
28 
QTEST_MAIN(RoomWidgetTest)29 QTEST_MAIN(RoomWidgetTest)
30 RoomWidgetTest::RoomWidgetTest(QObject *parent)
31     : QObject(parent)
32 {
33 }
34 
shouldHaveDefaultValues()35 void RoomWidgetTest::shouldHaveDefaultValues()
36 {
37     RoomWidget w;
38     auto mainLayout = w.findChild<QVBoxLayout *>(QStringLiteral("mainLayout"));
39     QVERIFY(mainLayout);
40     QCOMPARE(mainLayout->contentsMargins(), {});
41 
42     auto mRoomHeaderWidget = w.findChild<RoomHeaderWidget *>(QStringLiteral("mRoomHeaderWidget"));
43     QVERIFY(mRoomHeaderWidget);
44 
45     auto mUsersInRoomFlowWidget = w.findChild<UsersInRoomFlowWidget *>(QStringLiteral("mUsersInRoomFlowWidget"));
46     QVERIFY(mUsersInRoomFlowWidget);
47 
48     auto mMessageListView = w.findChild<MessageListView *>(QStringLiteral("mMessageListView"));
49     QVERIFY(mMessageListView);
50 
51     auto mStackedWidget = w.findChild<QStackedWidget *>(QStringLiteral("mStackedWidget"));
52     QVERIFY(mStackedWidget);
53     QCOMPARE(mStackedWidget->count(), 2);
54 
55     auto mMessageLineWidget = w.findChild<MessageLineWidget *>(QStringLiteral("mMessageLineWidget"));
56     QVERIFY(mMessageLineWidget);
57 
58     auto mReadOnlyLineEditWidget = w.findChild<ReadOnlyLineEditWidget *>(QStringLiteral("mReadOnlyLineEditWidget"));
59     QVERIFY(mReadOnlyLineEditWidget);
60     QCOMPARE(mStackedWidget->currentWidget(), mMessageLineWidget);
61 
62     QVERIFY(w.roomId().isEmpty());
63 
64     auto mRoomCounterInfoWidget = w.findChild<RoomCounterInfoWidget *>(QStringLiteral("mRoomCounterInfoWidget"));
65     QVERIFY(mRoomCounterInfoWidget);
66 
67     auto mRoomReconnectInfoWidget = w.findChild<ReconnectInfoWidget *>(QStringLiteral("mRoomReconnectInfoWidget"));
68     QVERIFY(mRoomReconnectInfoWidget);
69 
70     auto mRoomReplyThreadWidget = w.findChild<RoomReplyThreadWidget *>(QStringLiteral("mRoomReplyThreadWidget"));
71     QVERIFY(mRoomReplyThreadWidget);
72     QVERIFY(!mRoomReplyThreadWidget->isVisible());
73 
74     auto mRoomQuoteMessageWidget = w.findChild<RoomQuoteMessageWidget *>(QStringLiteral("mRoomQuoteMessageWidget"));
75     QVERIFY(mRoomQuoteMessageWidget);
76     QVERIFY(!mRoomQuoteMessageWidget->isVisible());
77 
78     auto mUploadFileProgressStatusWidget = w.findChild<UploadFileProgressStatusWidget *>(QStringLiteral("mUploadFileProgressStatusWidget"));
79     QVERIFY(mUploadFileProgressStatusWidget);
80     QVERIFY(!mUploadFileProgressStatusWidget->isVisible());
81 
82     auto mOtrWidget = w.findChild<OtrWidget *>(QStringLiteral("mOtrWidget"));
83     QVERIFY(mOtrWidget);
84 }
85 
createRoom(const QString & roomId,const QString & roomName)86 static Room *createRoom(const QString &roomId, const QString &roomName)
87 {
88     RocketChatAccount *rcAccount = Ruqola::self()->rocketChatAccount();
89     Room *r = new Room(rcAccount);
90     r->setRoomId(roomId);
91     r->setName(roomName);
92     const Room::RoomType roomType = Room::RoomType::Channel; // should be an enum...
93     r->setChannelType(roomType);
94     r->setArchived(true); // workaround to skip RestApiConnection::membersInRoom
95     return r;
96 }
97 
shouldStorePendingTextPerRoom()98 void RoomWidgetTest::shouldStorePendingTextPerRoom()
99 {
100     // GIVEN two rooms
101     RoomWidget w;
102     RocketChatAccount *rcAccount = Ruqola::self()->rocketChatAccount();
103     w.setCurrentRocketChatAccount(rcAccount);
104     const QString roomId1 = QStringLiteral("roomId1");
105     Room *room1 = createRoom(roomId1, QStringLiteral("roomName1"));
106     QVERIFY(rcAccount->roomModel()->addRoom(room1));
107     const QString roomId2 = QStringLiteral("roomId2");
108     Room *room2 = createRoom(roomId2, QStringLiteral("roomName2"));
109     QVERIFY(rcAccount->roomModel()->addRoom(room2));
110 
111     // Ensure switching between rooms works
112     w.setChannelSelected(room1->roomId(), room1->channelType());
113     QCOMPARE(w.roomId(), roomId1);
114     w.setChannelSelected(room2->roomId(), room2->channelType());
115     QCOMPARE(w.roomId(), roomId2);
116 
117     // WHEN typing text and switching rooms
118     auto mMessageLineWidget = w.findChild<MessageLineWidget *>(QStringLiteral("mMessageLineWidget"));
119     QVERIFY(mMessageLineWidget);
120     mMessageLineWidget->setText(QStringLiteral("Text for room 2"));
121 
122     w.setChannelSelected(room1->roomId(), room1->channelType());
123     // THEN the text should be empty
124     QCOMPARE(mMessageLineWidget->text(), QString());
125 
126     // WHEN typing some text and switching back
127     mMessageLineWidget->setText(QStringLiteral("Text for room 1"));
128 
129     // THEN the orig text should appear again
130     w.setChannelSelected(room2->roomId(), room2->channelType());
131     QCOMPARE(mMessageLineWidget->text(), QStringLiteral("Text for room 2"));
132     mMessageLineWidget->setText(QString());
133 
134     // WHEN switching again
135     mMessageLineWidget->setText(QStringLiteral("Text for room 1"));
136 
137     // THEN the other text should appear again
138     w.setChannelSelected(room2->roomId(), room2->channelType());
139     QCOMPARE(mMessageLineWidget->text(), QStringLiteral("Text for room 1"));
140 }
141 
shouldShowNoticeWhenReplyingToThread()142 void RoomWidgetTest::shouldShowNoticeWhenReplyingToThread()
143 {
144     QEventLoop loop;
145     RoomWidget w;
146 
147     auto mRoomReplyThreadWidget = w.findChild<RoomReplyThreadWidget *>(QStringLiteral("mRoomReplyThreadWidget"));
148     QVERIFY(!mRoomReplyThreadWidget->isVisible());
149 
150     auto mMessageLineWidget = w.findChild<MessageLineWidget *>(QStringLiteral("mMessageLineWidget"));
151     QVERIFY(mMessageLineWidget);
152 
153     mMessageLineWidget->setThreadMessageId(QStringLiteral("placeholder"));
154     loop.processEvents();
155     QVERIFY(!mRoomReplyThreadWidget->isHidden());
156 
157     mMessageLineWidget->setThreadMessageId({});
158     loop.processEvents();
159     QVERIFY(mRoomReplyThreadWidget->isHidden());
160 }
161