testsetuserstatusdialog.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. /*
  2. * Copyright (C) by Felix Weilbach <felix.weilbach@nextcloud.com>
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. * for more details.
  13. */
  14. #include "userstatusconnector.h"
  15. #include "userstatusselectormodel.h"
  16. #include <QTest>
  17. #include <QSignalSpy>
  18. #include <QDateTime>
  19. #include <memory>
  20. class FakeUserStatusConnector : public OCC::UserStatusConnector
  21. {
  22. public:
  23. void fetchUserStatus() override
  24. {
  25. if (_couldNotFetchUserStatus) {
  26. emit error(Error::CouldNotFetchUserStatus);
  27. return;
  28. } else if (_userStatusNotSupported) {
  29. emit error(Error::UserStatusNotSupported);
  30. return;
  31. } else if (_emojisNotSupported) {
  32. emit error(Error::EmojisNotSupported);
  33. return;
  34. }
  35. emit userStatusFetched(_userStatus);
  36. }
  37. void fetchPredefinedStatuses() override
  38. {
  39. if (_couldNotFetchPredefinedUserStatuses) {
  40. emit error(Error::CouldNotFetchPredefinedUserStatuses);
  41. return;
  42. }
  43. emit predefinedStatusesFetched(_predefinedStatuses);
  44. }
  45. void setUserStatus(const OCC::UserStatus &userStatus) override
  46. {
  47. if (_couldNotSetUserStatusMessage) {
  48. emit error(Error::CouldNotSetUserStatus);
  49. return;
  50. }
  51. _userStatusSetByCallerOfSetUserStatus = userStatus;
  52. emit UserStatusConnector::userStatusSet();
  53. }
  54. void clearMessage() override
  55. {
  56. if (_couldNotClearUserStatusMessage) {
  57. emit error(Error::CouldNotClearMessage);
  58. } else {
  59. _isMessageCleared = true;
  60. }
  61. }
  62. OCC::UserStatus userStatus() const override
  63. {
  64. return {}; // Not implemented
  65. }
  66. void setFakeUserStatus(const OCC::UserStatus &userStatus)
  67. {
  68. _userStatus = userStatus;
  69. }
  70. void setFakePredefinedStatuses(
  71. const QVector<OCC::UserStatus> &statuses)
  72. {
  73. _predefinedStatuses = statuses;
  74. }
  75. OCC::UserStatus userStatusSetByCallerOfSetUserStatus() const { return _userStatusSetByCallerOfSetUserStatus; }
  76. bool messageCleared() const { return _isMessageCleared; }
  77. void setErrorCouldNotFetchPredefinedUserStatuses(bool value)
  78. {
  79. _couldNotFetchPredefinedUserStatuses = value;
  80. }
  81. void setErrorCouldNotFetchUserStatus(bool value)
  82. {
  83. _couldNotFetchUserStatus = value;
  84. }
  85. void setErrorCouldNotSetUserStatusMessage(bool value)
  86. {
  87. _couldNotSetUserStatusMessage = value;
  88. }
  89. void setErrorUserStatusNotSupported(bool value)
  90. {
  91. _userStatusNotSupported = value;
  92. }
  93. void setErrorEmojisNotSupported(bool value)
  94. {
  95. _emojisNotSupported = value;
  96. }
  97. void setErrorCouldNotClearUserStatusMessage(bool value)
  98. {
  99. _couldNotClearUserStatusMessage = value;
  100. }
  101. private:
  102. OCC::UserStatus _userStatusSetByCallerOfSetUserStatus;
  103. OCC::UserStatus _userStatus;
  104. QVector<OCC::UserStatus> _predefinedStatuses;
  105. bool _isMessageCleared = false;
  106. bool _couldNotFetchPredefinedUserStatuses = false;
  107. bool _couldNotFetchUserStatus = false;
  108. bool _couldNotSetUserStatusMessage = false;
  109. bool _userStatusNotSupported = false;
  110. bool _emojisNotSupported = false;
  111. bool _couldNotClearUserStatusMessage = false;
  112. };
  113. class FakeDateTimeProvider : public OCC::DateTimeProvider
  114. {
  115. public:
  116. void setCurrentDateTime(const QDateTime &dateTime) { _dateTime = dateTime; }
  117. QDateTime currentDateTime() const override { return _dateTime; }
  118. QDate currentDate() const override { return _dateTime.date(); }
  119. private:
  120. QDateTime _dateTime;
  121. };
  122. static QVector<OCC::UserStatus>
  123. createFakePredefinedStatuses(const QDateTime &currentTime)
  124. {
  125. QVector<OCC::UserStatus> statuses;
  126. const QString userStatusId("fake-id");
  127. const QString userStatusMessage("Predefined status");
  128. const QString userStatusIcon("🏖");
  129. const OCC::UserStatus::OnlineStatus userStatusState(OCC::UserStatus::OnlineStatus::Online);
  130. const bool userStatusMessagePredefined(true);
  131. OCC::Optional<OCC::ClearAt> userStatusClearAt;
  132. OCC::ClearAt clearAt;
  133. clearAt._type = OCC::ClearAtType::Timestamp;
  134. clearAt._timestamp = currentTime.addSecs(60 * 60).toSecsSinceEpoch();
  135. userStatusClearAt = clearAt;
  136. statuses.append({userStatusId, userStatusMessage, userStatusIcon,
  137. userStatusState, userStatusMessagePredefined, userStatusClearAt});
  138. return statuses;
  139. }
  140. static QDateTime createDateTime(int year = 2021, int month = 7, int day = 27,
  141. int hour = 12, int minute = 0, int second = 0)
  142. {
  143. QDate fakeDate(year, month, day);
  144. QTime fakeTime(hour, minute, second);
  145. QDateTime fakeDateTime;
  146. fakeDateTime.setDate(fakeDate);
  147. fakeDateTime.setTime(fakeTime);
  148. return fakeDateTime;
  149. }
  150. class TestSetUserStatusDialog : public QObject
  151. {
  152. Q_OBJECT
  153. private slots:
  154. void testCtor_fetchStatusAndPredefinedStatuses()
  155. {
  156. const QDateTime currentDateTime(QDateTime::currentDateTime());
  157. const QString userStatusId("fake-id");
  158. const QString userStatusMessage("Some status");
  159. const QString userStatusIcon("❤");
  160. const OCC::UserStatus::OnlineStatus userStatusState(OCC::UserStatus::OnlineStatus::DoNotDisturb);
  161. const bool userStatusMessagePredefined(false);
  162. OCC::Optional<OCC::ClearAt> userStatusClearAt;
  163. {
  164. OCC::ClearAt clearAt;
  165. clearAt._type = OCC::ClearAtType::Timestamp;
  166. clearAt._timestamp = currentDateTime.addDays(1).toSecsSinceEpoch();
  167. userStatusClearAt = clearAt;
  168. }
  169. const OCC::UserStatus userStatus(userStatusId, userStatusMessage,
  170. userStatusIcon, userStatusState, userStatusMessagePredefined, userStatusClearAt);
  171. const auto fakePredefinedStatuses = createFakePredefinedStatuses(createDateTime());
  172. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  173. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  174. fakeDateTimeProvider->setCurrentDateTime(currentDateTime);
  175. fakeUserStatusJob->setFakeUserStatus(userStatus);
  176. fakeUserStatusJob->setFakePredefinedStatuses(fakePredefinedStatuses);
  177. OCC::UserStatusSelectorModel model(fakeUserStatusJob, std::move(fakeDateTimeProvider));
  178. // Was user status set correctly?
  179. QCOMPARE(model.userStatusMessage(), userStatusMessage);
  180. QCOMPARE(model.userStatusEmoji(), userStatusIcon);
  181. QCOMPARE(model.onlineStatus(), userStatusState);
  182. QCOMPARE(model.clearAtDisplayString(), tr("1 day"));
  183. // Were predefined statuses fetched correctly?
  184. const auto predefinedStatusesCount = model.predefinedStatuses().count();
  185. QCOMPARE(predefinedStatusesCount, fakePredefinedStatuses.size());
  186. for (int i = 0; i < predefinedStatusesCount; ++i) {
  187. const auto predefinedStatus = model.predefinedStatuses()[i];
  188. QCOMPARE(predefinedStatus.id(),
  189. fakePredefinedStatuses[i].id());
  190. QCOMPARE(predefinedStatus.message(),
  191. fakePredefinedStatuses[i].message());
  192. QCOMPARE(predefinedStatus.icon(),
  193. fakePredefinedStatuses[i].icon());
  194. QCOMPARE(predefinedStatus.messagePredefined(),
  195. fakePredefinedStatuses[i].messagePredefined());
  196. }
  197. }
  198. void testCtor_noStatusSet_showSensibleDefaults()
  199. {
  200. OCC::UserStatusSelectorModel model(nullptr, nullptr);
  201. QCOMPARE(model.userStatusMessage(), "");
  202. QCOMPARE(model.userStatusEmoji(), "😀");
  203. QCOMPARE(model.clearAtDisplayString(), tr("Don't clear"));
  204. }
  205. void testCtor_fetchStatusButNoStatusSet_showSensibleDefaults()
  206. {
  207. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  208. fakeUserStatusJob->setFakeUserStatus({ "", "", "",
  209. OCC::UserStatus::OnlineStatus::Offline, false, {} });
  210. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  211. QCOMPARE(model.onlineStatus(), OCC::UserStatus::OnlineStatus::Online);
  212. QCOMPARE(model.userStatusMessage(), "");
  213. QCOMPARE(model.userStatusEmoji(), "😀");
  214. QCOMPARE(model.clearAtDisplayString(), tr("Don't clear"));
  215. }
  216. void testSetOnlineStatus_emitOnlineStatusChanged()
  217. {
  218. const OCC::UserStatus::OnlineStatus onlineStatus(OCC::UserStatus::OnlineStatus::Invisible);
  219. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  220. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  221. QSignalSpy onlineStatusChangedSpy(&model,
  222. &OCC::UserStatusSelectorModel::onlineStatusChanged);
  223. model.setOnlineStatus(onlineStatus);
  224. QCOMPARE(onlineStatusChangedSpy.count(), 1);
  225. }
  226. void testSetUserStatus_setCustomMessage_userStatusSetCorrect()
  227. {
  228. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  229. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  230. QSignalSpy finishedSpy(&model, &OCC::UserStatusSelectorModel::finished);
  231. const QString userStatusMessage("Some status");
  232. const QString userStatusIcon("❤");
  233. const OCC::UserStatus::OnlineStatus userStatusState(OCC::UserStatus::OnlineStatus::Online);
  234. model.setOnlineStatus(userStatusState);
  235. model.setUserStatusMessage(userStatusMessage);
  236. model.setUserStatusEmoji(userStatusIcon);
  237. model.setClearAt(OCC::UserStatusSelectorModel::ClearStageType::HalfHour);
  238. model.setUserStatus();
  239. QCOMPARE(finishedSpy.count(), 1);
  240. const auto userStatusSet = fakeUserStatusJob->userStatusSetByCallerOfSetUserStatus();
  241. QCOMPARE(userStatusSet.icon(), userStatusIcon);
  242. QCOMPARE(userStatusSet.message(), userStatusMessage);
  243. QCOMPARE(userStatusSet.state(), userStatusState);
  244. QCOMPARE(userStatusSet.messagePredefined(), false);
  245. const auto clearAt = userStatusSet.clearAt();
  246. QVERIFY(clearAt.isValid());
  247. QCOMPARE(clearAt->_type, OCC::ClearAtType::Period);
  248. QCOMPARE(clearAt->_period, 60 * 30);
  249. }
  250. void testSetUserStatusMessage_predefinedStatusWasSet_userStatusSetCorrect()
  251. {
  252. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  253. fakeUserStatusJob->setFakePredefinedStatuses(createFakePredefinedStatuses(createDateTime()));
  254. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  255. model.setPredefinedStatus(model.predefinedStatuses()[0]);
  256. QSignalSpy finishedSpy(&model, &OCC::UserStatusSelectorModel::finished);
  257. const QString userStatusMessage("Some status");
  258. const OCC::UserStatus::OnlineStatus userStatusState(OCC::UserStatus::OnlineStatus::Online);
  259. model.setOnlineStatus(userStatusState);
  260. model.setUserStatusMessage(userStatusMessage);
  261. model.setClearAt(OCC::UserStatusSelectorModel::ClearStageType::HalfHour);
  262. model.setUserStatus();
  263. QCOMPARE(finishedSpy.count(), 1);
  264. const auto userStatusSet = fakeUserStatusJob->userStatusSetByCallerOfSetUserStatus();
  265. QCOMPARE(userStatusSet.message(), userStatusMessage);
  266. QCOMPARE(userStatusSet.state(), userStatusState);
  267. QCOMPARE(userStatusSet.messagePredefined(), false);
  268. const auto clearAt = userStatusSet.clearAt();
  269. QVERIFY(clearAt.isValid());
  270. QCOMPARE(clearAt->_type, OCC::ClearAtType::Period);
  271. QCOMPARE(clearAt->_period, 60 * 30);
  272. }
  273. void testSetUserStatusEmoji_predefinedStatusWasSet_userStatusSetCorrect()
  274. {
  275. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  276. fakeUserStatusJob->setFakePredefinedStatuses(createFakePredefinedStatuses(createDateTime()));
  277. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  278. model.setPredefinedStatus(model.predefinedStatuses()[0]);
  279. QSignalSpy finishedSpy(&model, &OCC::UserStatusSelectorModel::finished);
  280. const QString userStatusIcon("❤");
  281. const OCC::UserStatus::OnlineStatus userStatusState(OCC::UserStatus::OnlineStatus::Online);
  282. model.setOnlineStatus(userStatusState);
  283. model.setUserStatusEmoji(userStatusIcon);
  284. model.setClearAt(OCC::UserStatusSelectorModel::ClearStageType::HalfHour);
  285. model.setUserStatus();
  286. QCOMPARE(finishedSpy.count(), 1);
  287. const auto userStatusSet = fakeUserStatusJob->userStatusSetByCallerOfSetUserStatus();
  288. QCOMPARE(userStatusSet.icon(), userStatusIcon);
  289. QCOMPARE(userStatusSet.state(), userStatusState);
  290. QCOMPARE(userStatusSet.messagePredefined(), false);
  291. const auto clearAt = userStatusSet.clearAt();
  292. QVERIFY(clearAt.isValid());
  293. QCOMPARE(clearAt->_type, OCC::ClearAtType::Period);
  294. QCOMPARE(clearAt->_period, 60 * 30);
  295. }
  296. void testSetPredefinedStatus_emitUserStatusChangedAndSetUserStatus()
  297. {
  298. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  299. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  300. const auto currentTime = createDateTime();
  301. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  302. const auto fakePredefinedStatuses = createFakePredefinedStatuses(currentTime);
  303. fakeUserStatusJob->setFakePredefinedStatuses(fakePredefinedStatuses);
  304. OCC::UserStatusSelectorModel model(std::move(fakeUserStatusJob),
  305. std::move(fakeDateTimeProvider));
  306. QSignalSpy userStatusChangedSpy(&model,
  307. &OCC::UserStatusSelectorModel::userStatusChanged);
  308. QSignalSpy clearAtDisplayStringChangedSpy(&model,
  309. &OCC::UserStatusSelectorModel::clearAtDisplayStringChanged);
  310. const auto fakePredefinedUserStatusIndex = 0;
  311. model.setPredefinedStatus(model.predefinedStatuses()[fakePredefinedUserStatusIndex]);
  312. QCOMPARE(userStatusChangedSpy.count(), 1);
  313. QCOMPARE(clearAtDisplayStringChangedSpy.count(), 1);
  314. // Was user status set correctly?
  315. const auto fakePredefinedUserStatus = fakePredefinedStatuses[fakePredefinedUserStatusIndex];
  316. QCOMPARE(model.userStatusMessage(), fakePredefinedUserStatus.message());
  317. QCOMPARE(model.userStatusEmoji(), fakePredefinedUserStatus.icon());
  318. QCOMPARE(model.onlineStatus(), fakePredefinedUserStatus.state());
  319. QCOMPARE(model.clearAtDisplayString(), tr("1 hour"));
  320. }
  321. void testSetClear_setClearAtStage0_emitclearAtDisplayStringChangedAndClearAtSet()
  322. {
  323. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  324. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  325. QSignalSpy clearAtDisplayStringChangedSpy(&model, &OCC::UserStatusSelectorModel::clearAtDisplayStringChanged);
  326. const auto clearAtToSet = OCC::UserStatusSelectorModel::ClearStageType::DontClear;
  327. model.setClearAt(clearAtToSet);
  328. QCOMPARE(clearAtDisplayStringChangedSpy.count(), 1);
  329. QCOMPARE(model.clearAtDisplayString(), tr("Don't clear"));
  330. }
  331. void testSetClear_setClearAtStage1_emitclearAtDisplayStringChangedAndClearAtSet()
  332. {
  333. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  334. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  335. QSignalSpy clearAtDisplayStringChangedSpy(&model, &OCC::UserStatusSelectorModel::clearAtDisplayStringChanged);
  336. const auto clearAtToSet = OCC::UserStatusSelectorModel::ClearStageType::HalfHour;
  337. model.setClearAt(clearAtToSet);
  338. QCOMPARE(clearAtDisplayStringChangedSpy.count(), 1);
  339. QCOMPARE(model.clearAtDisplayString(), tr("30 minutes"));
  340. }
  341. void testSetClear_setClearAtStage2_emitclearAtDisplayStringChangedAndClearAtSet()
  342. {
  343. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  344. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  345. QSignalSpy clearAtDisplayStringChangedSpy(&model, &OCC::UserStatusSelectorModel::clearAtDisplayStringChanged);
  346. const auto clearAtToSet = OCC::UserStatusSelectorModel::ClearStageType::OneHour;
  347. model.setClearAt(clearAtToSet);
  348. QCOMPARE(clearAtDisplayStringChangedSpy.count(), 1);
  349. QCOMPARE(model.clearAtDisplayString(), tr("1 hour"));
  350. }
  351. void testSetClear_setClearAtStage3_emitclearAtDisplayStringChangedAndClearAtSet()
  352. {
  353. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  354. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  355. QSignalSpy clearAtDisplayStringChangedSpy(&model, &OCC::UserStatusSelectorModel::clearAtDisplayStringChanged);
  356. const auto clearAtToSet = OCC::UserStatusSelectorModel::ClearStageType::FourHour;
  357. model.setClearAt(clearAtToSet);
  358. QCOMPARE(clearAtDisplayStringChangedSpy.count(), 1);
  359. QCOMPARE(model.clearAtDisplayString(), tr("4 hours"));
  360. }
  361. void testSetClear_setClearAtStage4_emitclearAtDisplayStringChangedAndClearAtSet()
  362. {
  363. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  364. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  365. QSignalSpy clearAtDisplayStringChangedSpy(&model, &OCC::UserStatusSelectorModel::clearAtDisplayStringChanged);
  366. const auto clearAtToSet = OCC::UserStatusSelectorModel::ClearStageType::Today;
  367. model.setClearAt(clearAtToSet);
  368. QCOMPARE(clearAtDisplayStringChangedSpy.count(), 1);
  369. QCOMPARE(model.clearAtDisplayString(), tr("Today"));
  370. }
  371. void testSetClear_setClearAtStage5_emitclearAtDisplayStringChangedAndClearAtSet()
  372. {
  373. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  374. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  375. QSignalSpy clearAtDisplayStringChangedSpy(&model, &OCC::UserStatusSelectorModel::clearAtDisplayStringChanged);
  376. const auto clearAtToSet = OCC::UserStatusSelectorModel::ClearStageType::Week;
  377. model.setClearAt(clearAtToSet);
  378. QCOMPARE(clearAtDisplayStringChangedSpy.count(), 1);
  379. QCOMPARE(model.clearAtDisplayString(), tr("This week"));
  380. }
  381. void testClearAtStages()
  382. {
  383. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  384. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  385. QCOMPARE(model.clearAtDisplayString(), tr("Don't clear"));
  386. const auto clearStageTypes = model.clearStageTypes();
  387. QCOMPARE(clearStageTypes.count(), 6);
  388. QCOMPARE(clearStageTypes[0].value<QVariantMap>()[QStringLiteral("display")], tr("Don't clear"));
  389. QCOMPARE(clearStageTypes[1].value<QVariantMap>()[QStringLiteral("display")], tr("30 minutes"));
  390. QCOMPARE(clearStageTypes[2].value<QVariantMap>()[QStringLiteral("display")], tr("1 hour"));
  391. QCOMPARE(clearStageTypes[3].value<QVariantMap>()[QStringLiteral("display")], tr("4 hours"));
  392. QCOMPARE(clearStageTypes[4].value<QVariantMap>()[QStringLiteral("display")], tr("Today"));
  393. QCOMPARE(clearStageTypes[5].value<QVariantMap>()[QStringLiteral("display")], tr("This week"));
  394. }
  395. void testClearAt_clearAtTimestamp()
  396. {
  397. const auto currentTime = createDateTime();
  398. {
  399. OCC::UserStatus userStatus;
  400. OCC::ClearAt clearAt;
  401. clearAt._type = OCC::ClearAtType::Timestamp;
  402. clearAt._timestamp = currentTime.addSecs(30).toSecsSinceEpoch();
  403. userStatus.setClearAt(clearAt);
  404. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  405. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  406. OCC::UserStatusSelectorModel model(userStatus, std::move(fakeDateTimeProvider));
  407. QCOMPARE(model.clearAtDisplayString(), tr("Less than a minute"));
  408. }
  409. {
  410. OCC::UserStatus userStatus;
  411. OCC::ClearAt clearAt;
  412. clearAt._type = OCC::ClearAtType::Timestamp;
  413. clearAt._timestamp = currentTime.addSecs(60).toSecsSinceEpoch();
  414. userStatus.setClearAt(clearAt);
  415. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  416. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  417. OCC::UserStatusSelectorModel model(userStatus, std::move(fakeDateTimeProvider));
  418. QCOMPARE(model.clearAtDisplayString(), tr("1 minute"));
  419. }
  420. {
  421. OCC::UserStatus userStatus;
  422. OCC::ClearAt clearAt;
  423. clearAt._type = OCC::ClearAtType::Timestamp;
  424. clearAt._timestamp = currentTime.addSecs(60 * 30).toSecsSinceEpoch();
  425. userStatus.setClearAt(clearAt);
  426. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  427. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  428. OCC::UserStatusSelectorModel model(userStatus, std::move(fakeDateTimeProvider));
  429. QCOMPARE(model.clearAtDisplayString(), tr("30 minutes"));
  430. }
  431. {
  432. OCC::UserStatus userStatus;
  433. OCC::ClearAt clearAt;
  434. clearAt._type = OCC::ClearAtType::Timestamp;
  435. clearAt._timestamp = currentTime.addSecs(60 * 60).toSecsSinceEpoch();
  436. userStatus.setClearAt(clearAt);
  437. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  438. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  439. OCC::UserStatusSelectorModel model(userStatus, std::move(fakeDateTimeProvider));
  440. QCOMPARE(model.clearAtDisplayString(), tr("1 hour"));
  441. }
  442. {
  443. OCC::UserStatus userStatus;
  444. OCC::ClearAt clearAt;
  445. clearAt._type = OCC::ClearAtType::Timestamp;
  446. clearAt._timestamp = currentTime.addSecs(60 * 60 * 4).toSecsSinceEpoch();
  447. userStatus.setClearAt(clearAt);
  448. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  449. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  450. OCC::UserStatusSelectorModel model(userStatus, std::move(fakeDateTimeProvider));
  451. QCOMPARE(model.clearAtDisplayString(), tr("4 hours"));
  452. }
  453. {
  454. OCC::UserStatus userStatus;
  455. OCC::ClearAt clearAt;
  456. clearAt._type = OCC::ClearAtType::Timestamp;
  457. clearAt._timestamp = currentTime.addDays(1).toSecsSinceEpoch();
  458. userStatus.setClearAt(clearAt);
  459. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  460. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  461. OCC::UserStatusSelectorModel model(userStatus, std::move(fakeDateTimeProvider));
  462. QCOMPARE(model.clearAtDisplayString(), tr("1 day"));
  463. }
  464. {
  465. OCC::UserStatus userStatus;
  466. OCC::ClearAt clearAt;
  467. clearAt._type = OCC::ClearAtType::Timestamp;
  468. clearAt._timestamp = currentTime.addDays(7).toSecsSinceEpoch();
  469. userStatus.setClearAt(clearAt);
  470. auto fakeDateTimeProvider = std::make_unique<FakeDateTimeProvider>();
  471. fakeDateTimeProvider->setCurrentDateTime(currentTime);
  472. OCC::UserStatusSelectorModel model(userStatus, std::move(fakeDateTimeProvider));
  473. QCOMPARE(model.clearAtDisplayString(), tr("7 days"));
  474. }
  475. }
  476. void testClearAt_clearAtEndOf()
  477. {
  478. {
  479. OCC::UserStatus userStatus;
  480. OCC::ClearAt clearAt;
  481. clearAt._type = OCC::ClearAtType::EndOf;
  482. clearAt._endof = "day";
  483. userStatus.setClearAt(clearAt);
  484. OCC::UserStatusSelectorModel model(userStatus);
  485. QCOMPARE(model.clearAtDisplayString(), tr("Today"));
  486. }
  487. {
  488. OCC::UserStatus userStatus;
  489. OCC::ClearAt clearAt;
  490. clearAt._type = OCC::ClearAtType::EndOf;
  491. clearAt._endof = "week";
  492. userStatus.setClearAt(clearAt);
  493. OCC::UserStatusSelectorModel model(userStatus);
  494. QCOMPARE(model.clearAtDisplayString(), tr("This week"));
  495. }
  496. }
  497. void testClearAt_clearAtAfterPeriod()
  498. {
  499. {
  500. OCC::UserStatus userStatus;
  501. OCC::ClearAt clearAt;
  502. clearAt._type = OCC::ClearAtType::Period;
  503. clearAt._period = 60 * 30;
  504. userStatus.setClearAt(clearAt);
  505. OCC::UserStatusSelectorModel model(userStatus);
  506. QCOMPARE(model.clearAtDisplayString(), tr("30 minutes"));
  507. }
  508. {
  509. OCC::UserStatus userStatus;
  510. OCC::ClearAt clearAt;
  511. clearAt._type = OCC::ClearAtType::Period;
  512. clearAt._period = 60 * 60;
  513. userStatus.setClearAt(clearAt);
  514. OCC::UserStatusSelectorModel model(userStatus);
  515. QCOMPARE(model.clearAtDisplayString(), tr("1 hour"));
  516. }
  517. }
  518. void testClearUserStatus()
  519. {
  520. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  521. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  522. model.clearUserStatus();
  523. QVERIFY(fakeUserStatusJob->messageCleared());
  524. }
  525. void testError_couldNotFetchPredefinedStatuses_emitError()
  526. {
  527. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  528. fakeUserStatusJob->setErrorCouldNotFetchPredefinedUserStatuses(true);
  529. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  530. QCOMPARE(model.errorMessage(),
  531. tr("Could not fetch predefined statuses. Make sure you are connected to the server."));
  532. }
  533. void testError_couldNotFetchUserStatus_emitError()
  534. {
  535. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  536. fakeUserStatusJob->setErrorCouldNotFetchUserStatus(true);
  537. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  538. QCOMPARE(model.errorMessage(),
  539. tr("Could not fetch status. Make sure you are connected to the server."));
  540. }
  541. void testError_userStatusNotSupported_emitError()
  542. {
  543. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  544. fakeUserStatusJob->setErrorUserStatusNotSupported(true);
  545. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  546. QCOMPARE(model.errorMessage(),
  547. tr("Status feature is not supported. You will not be able to set your status."));
  548. }
  549. void testError_couldSetUserStatus_emitError()
  550. {
  551. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  552. fakeUserStatusJob->setErrorCouldNotSetUserStatusMessage(true);
  553. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  554. model.setUserStatus();
  555. QCOMPARE(model.errorMessage(),
  556. tr("Could not set status. Make sure you are connected to the server."));
  557. }
  558. void testError_emojisNotSupported_emitError()
  559. {
  560. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  561. fakeUserStatusJob->setErrorEmojisNotSupported(true);
  562. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  563. QCOMPARE(model.errorMessage(),
  564. tr("Emojis are not supported. Some status functionality may not work."));
  565. }
  566. void testError_couldNotClearMessage_emitError()
  567. {
  568. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  569. fakeUserStatusJob->setErrorCouldNotClearUserStatusMessage(true);
  570. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  571. model.clearUserStatus();
  572. QCOMPARE(model.errorMessage(),
  573. tr("Could not clear status message. Make sure you are connected to the server."));
  574. }
  575. void testError_setUserStatus_clearErrorMessage()
  576. {
  577. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  578. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  579. fakeUserStatusJob->setErrorCouldNotSetUserStatusMessage(true);
  580. model.setUserStatus();
  581. QVERIFY(!model.errorMessage().isEmpty());
  582. fakeUserStatusJob->setErrorCouldNotSetUserStatusMessage(false);
  583. model.setUserStatus();
  584. QVERIFY(model.errorMessage().isEmpty());
  585. }
  586. void testError_clearUserStatus_clearErrorMessage()
  587. {
  588. auto fakeUserStatusJob = std::make_shared<FakeUserStatusConnector>();
  589. OCC::UserStatusSelectorModel model(fakeUserStatusJob);
  590. fakeUserStatusJob->setErrorCouldNotSetUserStatusMessage(true);
  591. model.setUserStatus();
  592. QVERIFY(!model.errorMessage().isEmpty());
  593. fakeUserStatusJob->setErrorCouldNotSetUserStatusMessage(false);
  594. model.clearUserStatus();
  595. QVERIFY(model.errorMessage().isEmpty());
  596. }
  597. };
  598. QTEST_GUILESS_MAIN(TestSetUserStatusDialog)
  599. #include "testsetuserstatusdialog.moc"