File indexing completed on 2024-05-12 05:17:11

0001 /*
0002    SPDX-FileCopyrightText: 2013 Christian Mollekopf <mollekopf@kolabsys.com>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <QTest>
0008 
0009 #include "kimap/session.h"
0010 #include "kimap/setmetadatajob.h"
0011 #include "kimaptest/fakeserver.h"
0012 
0013 #include <QTest>
0014 
0015 using MAP = QMap<QByteArray, QByteArray>;
0016 Q_DECLARE_METATYPE(MAP)
0017 
0018 class SetMetadataJobTest : public QObject
0019 {
0020     Q_OBJECT
0021 
0022 private Q_SLOTS:
0023 
0024     void metadata_data()
0025     {
0026         QTest::addColumn<QList<QByteArray>>("scenario");
0027         QTest::addColumn<QString>("mailbox");
0028         QTest::addColumn<QMap<QByteArray, QByteArray>>("annotations");
0029 
0030         {
0031             QList<QByteArray> scenario;
0032             scenario << FakeServer::preauth() << R"(C: A000001 SETMETADATA "Folder1" ("/public/comment" "comment2" "/shared/comment" "Shared comment"))"
0033                      << "S: A000001 OK SETMETADATA complete";
0034             QMap<QByteArray, QByteArray> annotations;
0035             annotations.insert("/public/comment", "comment2");
0036             annotations.insert("/shared/comment", "Shared comment");
0037             QTest::newRow("normal") << scenario << "Folder1" << annotations;
0038         }
0039         {
0040             QList<QByteArray> scenario;
0041             scenario << FakeServer::preauth()
0042                      << "C: A000001 SETMETADATA \"Folder1\" (\"/public/comment\" {8}\r\ncomment2 \"/shared/comment\" {14}\r\nShared\ncomment)"
0043                      << "S: A000001 OK SETMETADATA complete";
0044             QMap<QByteArray, QByteArray> annotations;
0045             annotations.insert("/shared/comment", "Shared\ncomment");
0046             annotations.insert("/public/comment", "comment2");
0047             QTest::newRow("newline") << scenario << "Folder1" << annotations;
0048         }
0049         {
0050             QList<QByteArray> scenario;
0051             scenario << FakeServer::preauth() << R"(C: A000001 SETMETADATA "Folder1" ("/shared/comment" NIL))"
0052                      << "S: A000001 OK SETMETADATA complete";
0053             QMap<QByteArray, QByteArray> annotations;
0054             annotations.insert("/shared/comment", "");
0055             QTest::newRow("newline") << scenario << "Folder1" << annotations;
0056         }
0057         {
0058             QList<QByteArray> scenario;
0059             scenario << FakeServer::preauth() << "C: A000001 SETMETADATA \"Folder1\" (\"/public/comment\" {12}\r\ncomment\ntest \"/shared/comment\" {3}\r\nNIL)"
0060                      << "S: A000001 OK SETMETADATA complete";
0061             QMap<QByteArray, QByteArray> annotations;
0062             annotations.insert("/shared/comment", "");
0063             annotations.insert("/public/comment", "comment\ntest");
0064             QTest::newRow("newline2") << scenario << "Folder1" << annotations;
0065         }
0066         {
0067             QList<QByteArray> scenario;
0068             scenario << FakeServer::preauth() << "C: A000001 SETMETADATA \"Folder1\" (\"/public/comment\" {3}\r\nNIL \"/shared/comment\" {12}\r\ncomment\ntest)"
0069                      << "S: A000001 OK SETMETADATA complete";
0070             QMap<QByteArray, QByteArray> annotations;
0071             annotations.insert("/shared/comment", "comment\ntest");
0072             annotations.insert("/public/comment", "");
0073             QTest::newRow("newline2") << scenario << "Folder1" << annotations;
0074         }
0075     }
0076 
0077     void metadata()
0078     {
0079         QFETCH(QList<QByteArray>, scenario);
0080         QFETCH(QString, mailbox);
0081         QFETCH(MAP, annotations);
0082 
0083         FakeServer fakeServer;
0084         fakeServer.setScenario(scenario);
0085         fakeServer.startAndWait();
0086 
0087         KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989);
0088 
0089         auto setMetadataJob = new KIMAP::SetMetaDataJob(&session);
0090         setMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata);
0091         setMetadataJob->setMailBox(mailbox);
0092         const auto keys = annotations.keys();
0093         for (const QByteArray &entry : keys) {
0094             setMetadataJob->addMetaData(entry, annotations[entry]);
0095         }
0096 
0097         QVERIFY(setMetadataJob->exec());
0098 
0099         fakeServer.quit();
0100     }
0101 
0102     void annotatemore_data()
0103     {
0104         QTest::addColumn<QList<QByteArray>>("scenario");
0105         QTest::addColumn<QString>("mailbox");
0106         QTest::addColumn<QMap<QByteArray, QByteArray>>("annotations");
0107         QTest::addColumn<bool>("legacyMode");
0108 
0109         {
0110             QList<QByteArray> scenario;
0111             scenario << FakeServer::preauth() << R"(C: A000001 SETANNOTATION "Folder1" "/comment" ("value.shared" "Shared comment"))"
0112                      << "S: A000001 OK annotations changed";
0113 
0114             QMap<QByteArray, QByteArray> annotations;
0115             annotations.insert("/comment", "Shared comment");
0116             QTest::newRow("normal") << scenario << "Folder1" << annotations << false;
0117             QTest::newRow("legacy") << scenario << "Folder1" << annotations << true;
0118         }
0119     }
0120 
0121     void annotatemore()
0122     {
0123         QFETCH(QList<QByteArray>, scenario);
0124         QFETCH(QString, mailbox);
0125         QFETCH(MAP, annotations);
0126         QFETCH(bool, legacyMode);
0127 
0128         FakeServer fakeServer;
0129         fakeServer.setScenario(scenario);
0130         fakeServer.startAndWait();
0131 
0132         KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989);
0133 
0134         auto setMetadataJob = new KIMAP::SetMetaDataJob(&session);
0135         setMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Annotatemore);
0136         setMetadataJob->setMailBox(mailbox);
0137         const auto keys = annotations.keys();
0138         for (const QByteArray &entry : keys) {
0139             if (legacyMode) {
0140                 setMetadataJob->setEntry(entry);
0141                 setMetadataJob->addMetaData("value.shared", annotations[entry]);
0142             } else {
0143                 setMetadataJob->addMetaData(QByteArray("/shared") + entry, annotations[entry]);
0144             }
0145         }
0146 
0147         QVERIFY(setMetadataJob->exec());
0148 
0149         fakeServer.quit();
0150     }
0151 };
0152 
0153 QTEST_GUILESS_MAIN(SetMetadataJobTest)
0154 
0155 #include "setmetadatajobtest.moc"