File indexing completed on 2024-05-12 05:12:43
0001 /* 0002 SPDX-FileCopyrightText: 2017-2024 Laurent Montel <montel@kde.org> 0003 SPDX-FileCopyrightText: 2017 David Faure <faure@kde.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "jobtrackermodeltest.h" 0009 #include "jobtracker.h" 0010 #include "jobtrackermodel.h" 0011 // #include "modeltest.h" 0012 #include <QSignalSpy> 0013 #include <QTest> 0014 #include <akonadi/private/instance_p.h> 0015 0016 static QString rowSpyToText(const QSignalSpy &spy) 0017 { 0018 if (!spy.isValid()) { 0019 return QStringLiteral("THE SIGNALSPY IS INVALID!"); 0020 } 0021 QString str; 0022 for (int i = 0; i < spy.count(); ++i) { 0023 str += spy.at(i).at(1).toString() + QLatin1Char(',') + spy.at(i).at(2).toString(); 0024 if (i + 1 < spy.count()) { 0025 str += QLatin1Char(';'); 0026 } 0027 } 0028 return str; 0029 } 0030 0031 JobTrackerModelTest::JobTrackerModelTest(QObject *parent) 0032 : QObject(parent) 0033 { 0034 } 0035 0036 JobTrackerModelTest::~JobTrackerModelTest() = default; 0037 0038 void JobTrackerModelTest::initTestCase() 0039 { 0040 // Don't interfere with a running akonadiconsole 0041 Akonadi::Instance::setIdentifier(QStringLiteral("jobtrackertest")); 0042 } 0043 0044 void JobTrackerModelTest::shouldBeEmpty() 0045 { 0046 JobTrackerModel model("jobtracker"); 0047 QCOMPARE(model.rowCount(), 0); 0048 QCOMPARE(model.columnCount(), 7); 0049 } 0050 0051 void JobTrackerModelTest::shouldDisplayOneJob() 0052 { 0053 // GIVEN 0054 JobTrackerModel model("jobtracker"); 0055 // ModelTest modelTest(&model); 0056 const QString jobName(QStringLiteral("job1")); 0057 QSignalSpy rowATBISpy(&model, &QAbstractItemModel::rowsAboutToBeInserted); 0058 QSignalSpy rowInsertedSpy(&model, &QAbstractItemModel::rowsInserted); 0059 connect(&model, &QAbstractItemModel::rowsAboutToBeInserted, this, [&](const QModelIndex &parent) { 0060 // rowsAboutToBeInserted is supposed to be emitted before the insert 0061 if (!parent.isValid()) { 0062 QCOMPARE(model.rowCount(), 0); 0063 } else { 0064 QCOMPARE(model.rowCount(parent), 0); 0065 } 0066 }); 0067 connect(&model, &QAbstractItemModel::rowsInserted, this, [&](const QModelIndex &parent) { 0068 if (!parent.isValid()) { 0069 QCOMPARE(model.rowCount(), 1); 0070 QVERIFY(model.index(0, 0).isValid()); 0071 } else { 0072 QCOMPARE(model.rowCount(parent), 1); 0073 } 0074 }); 0075 0076 // WHEN 0077 model.jobTracker().jobCreated(QStringLiteral("session1"), jobName, QString(), QStringLiteral("type1"), QStringLiteral("debugStr1")); 0078 0079 // THEN 0080 QCOMPARE(model.rowCount(), 1); 0081 const QModelIndex sessionIndex = model.index(0, 0); 0082 QCOMPARE(sessionIndex.data().toString(), QStringLiteral("session1")); 0083 QCOMPARE(model.rowCount(sessionIndex), 1); 0084 const QModelIndex sessionCol1Index = model.index(0, 1); 0085 QVERIFY(sessionCol1Index.isValid()); 0086 QCOMPARE(model.rowCount(sessionCol1Index), 0); 0087 const QModelIndex jobIndex = model.index(0, 0, sessionIndex); 0088 QCOMPARE(jobIndex.data().toString(), QStringLiteral("job1")); 0089 QCOMPARE(model.rowCount(jobIndex), 0); 0090 QCOMPARE(rowSpyToText(rowATBISpy), QStringLiteral("0,0;0,0")); 0091 QCOMPARE(rowSpyToText(rowInsertedSpy), QStringLiteral("0,0;0,0")); 0092 } 0093 0094 void JobTrackerModelTest::shouldSignalDataChanges() 0095 { 0096 // GIVEN 0097 JobTrackerModel model("jobtracker"); 0098 const QString jobName(QStringLiteral("job1")); 0099 model.jobTracker().jobCreated(QStringLiteral("session1"), jobName, QString(), QStringLiteral("type1"), QStringLiteral("debugStr1")); 0100 QSignalSpy dataChangedSpy(&model, &JobTrackerModel::dataChanged); 0101 0102 // WHEN 0103 model.jobTracker().jobStarted(jobName); 0104 model.jobTracker().signalUpdates(); 0105 0106 // THEN 0107 QCOMPARE(dataChangedSpy.count(), 1); 0108 0109 // AND WHEN 0110 model.jobTracker().jobEnded(jobName, QString()); 0111 model.jobTracker().signalUpdates(); 0112 0113 // THEN 0114 QCOMPARE(dataChangedSpy.count(), 2); 0115 } 0116 0117 void JobTrackerModelTest::shouldHandleReset() 0118 { 0119 // GIVEN 0120 JobTrackerModel model("jobtracker"); 0121 const QString jobName(QStringLiteral("job1")); 0122 model.jobTracker().jobCreated(QStringLiteral("session1"), jobName, QString(), QStringLiteral("type1"), QStringLiteral("debugStr1")); 0123 QSignalSpy modelATBResetSpy(&model, &JobTrackerModel::modelAboutToBeReset); 0124 QSignalSpy modelResetSpy(&model, &JobTrackerModel::modelReset); 0125 QSignalSpy dataChangedSpy(&model, &JobTrackerModel::dataChanged); 0126 0127 // WHEN 0128 model.resetTracker(); 0129 QCOMPARE(modelATBResetSpy.count(), 1); 0130 QCOMPARE(modelResetSpy.count(), 1); 0131 0132 // AND then an update comes for that job which has been removed 0133 model.jobTracker().jobStarted(jobName); 0134 model.jobTracker().jobEnded(jobName, QString()); 0135 model.jobTracker().signalUpdates(); 0136 0137 // THEN it should be ignored 0138 QCOMPARE(dataChangedSpy.count(), 0); 0139 } 0140 0141 void JobTrackerModelTest::shouldHandleDuplicateJob() 0142 { 0143 // GIVEN 0144 JobTrackerModel model("jobtracker"); 0145 const QString jobName(QStringLiteral("job1")); 0146 model.jobTracker().jobCreated(QStringLiteral("session1"), jobName, QString(), QStringLiteral("type1"), QStringLiteral("debugStr1")); 0147 model.jobTracker().jobStarted(jobName); 0148 model.jobTracker().jobEnded(jobName, QString()); 0149 model.jobTracker().signalUpdates(); 0150 0151 // WHEN 0152 QSignalSpy rowATBISpy(&model, &QAbstractItemModel::rowsAboutToBeInserted); 0153 QSignalSpy rowInsertedSpy(&model, &QAbstractItemModel::rowsInserted); 0154 model.jobTracker().jobCreated(QStringLiteral("session1"), jobName, QString(), QStringLiteral("type1"), QStringLiteral("debugStr1")); 0155 0156 // THEN 0157 QCOMPARE(model.rowCount(), 1); // 1 session 0158 const QModelIndex sessionIndex = model.index(0, 0); 0159 QCOMPARE(rowSpyToText(rowATBISpy), QStringLiteral("1,1")); 0160 QCOMPARE(rowSpyToText(rowInsertedSpy), QStringLiteral("1,1")); 0161 QCOMPARE(model.rowCount(sessionIndex), 2); 0162 0163 // AND WHEN 0164 model.jobTracker().jobStarted(jobName); 0165 model.jobTracker().jobEnded(jobName, QStringLiteral("error")); 0166 model.jobTracker().signalUpdates(); 0167 0168 // THEN 0169 QCOMPARE(model.index(0, JobTrackerModel::ColumnState, sessionIndex).data().toString(), QStringLiteral("Ended")); 0170 QCOMPARE(model.index(1, JobTrackerModel::ColumnState, sessionIndex).data().toString(), QStringLiteral("Failed: error")); 0171 } 0172 0173 QTEST_GUILESS_MAIN(JobTrackerModelTest) 0174 0175 #include "moc_jobtrackermodeltest.cpp"