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"