File indexing completed on 2024-05-05 16:20:20

0001 /*
0002     This file is part of the kxmlrpc library.
0003     SPDX-FileCopyrightText: 2006 Narayan Newton <narayannewton@gmail.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include <QTest>
0009 
0010 #include "querytest.h"
0011 
0012 #include "query_p.h"
0013 
0014 QTEST_MAIN(QueryTest)
0015 
0016 using namespace KXmlRpc;
0017 
0018 #define XML_CALL_HEAD(call) QByteArray("<?xml version=\"1.0\" ?>\r\n<methodCall>\r\n<methodName>" call "</methodName>\r\n<params>\r\n") +
0019 #define XML_CALL_END "</params>\r\n</methodCall>\r\n"
0020 
0021 #define XML_RESPONSE_HEAD QByteArray("<?xml version=\"1.0\" ?>\r\n<methodResponse>\r\n<params>\r\n") +
0022 #define XML_RESPONSE_END "</params>\r\n</methodResponse>\r\n"
0023 
0024 #define XML_FAULT_HEAD QByteArray("<?xml version=\"1.0\" ?>\r\n<methodResponse>\r\n<fault>\r\n") +
0025 #define XML_FAULT_END "</fault>\r\n</methodResponse>\r\n"
0026 
0027 void QueryTest::testValidity()
0028 {
0029     Query *q = Query::create();
0030     QVERIFY(q != nullptr);
0031 }
0032 
0033 void QueryTest::testMarkupCall_data()
0034 {
0035     QTest::addColumn<QString>("methodName");
0036     QTest::addColumn<QList<QVariant>>("arguments");
0037     QTest::addColumn<QByteArray>("xml");
0038 
0039     /* clang-format off */
0040     QTest::newRow("int") << QString::fromLatin1("MyMethod")
0041                          << (QVariantList() << 1)
0042                          << XML_CALL_HEAD("MyMethod")
0043                             "<param>\r\n"
0044                             "<value><int>1</int></value>\r\n"
0045                             "</param>\r\n"
0046                             XML_CALL_END;
0047     QTest::newRow("string") << QString::fromLatin1("MyMethod")
0048                             << (QVariantList() << QLatin1String("data"))
0049                             << XML_CALL_HEAD("MyMethod")
0050                                "<param>\r\n"
0051                                "<value><string><![CDATA[data]]></string></value>\r\n"
0052                                "</param>\r\n"
0053                                XML_CALL_END;
0054     QTest::newRow("string (utf8)") << QString::fromLatin1("MyMethod")
0055                                    // make sure it is UTF-8, so do *not* use QStringLiteral below
0056                                    << (QVariantList() << QString::fromUtf8("Žlutý kůň pěl ďábelské ódy"))
0057                                    << XML_CALL_HEAD("MyMethod")
0058                                       "<param>\r\n"
0059                                       "<value><string><![CDATA[Žlutý kůň pěl ďábelské ódy]]></string></value>\r\n"
0060                                       "</param>\r\n"
0061                                       XML_CALL_END;
0062     QTest::newRow("stringlist") << QString::fromLatin1("MyMethod")
0063                                 << (QVariantList() << (QStringList() << QLatin1String("data1") << QLatin1String("data2")))
0064                                 << XML_CALL_HEAD("MyMethod")
0065                                    "<param>\r\n"
0066                                    "<value><array><data><value><string><![CDATA[data1]]></string></value>\r\n"
0067                                    "<value><string><![CDATA[data2]]></string></value>\r\n"
0068                                    "</data></array></value>"
0069                                    "</param>\r\n"
0070                                    XML_CALL_END;
0071     QTest::newRow("double") << QString::fromLatin1("MyMethod")
0072                             << (QVariantList() << (double) 3.14)
0073                             << XML_CALL_HEAD("MyMethod")
0074                                "<param>\r\n"
0075                                "<value><double>3.14</double></value>\r\n"
0076                                "</param>\r\n"
0077                                XML_CALL_END;
0078     QTest::newRow("bool") << QString::fromLatin1("MyMethod")
0079                           << (QVariantList() << true)
0080                           << XML_CALL_HEAD("MyMethod")
0081                              "<param>\r\n"
0082                              "<value><boolean>1</boolean></value>\r\n"
0083                              "</param>\r\n"
0084                              XML_CALL_END;
0085     QTest::newRow("bytearray") << QString::fromLatin1("MyMethod")
0086                                << (QVariantList() << QByteArray("Hello World!"))
0087                                << XML_CALL_HEAD("MyMethod")
0088                                   "<param>\r\n"
0089                                   "<value><base64>SGVsbG8gV29ybGQh</base64></value>\r\n"
0090                                   "</param>\r\n"
0091                                   XML_CALL_END;
0092     QTest::newRow("datetime") << QString::fromLatin1("MyMethod")
0093                               << (QVariantList() << QDateTime(QDate(2015, 01, 05), QTime(17, 16, 32)))
0094                               << XML_CALL_HEAD("MyMethod")
0095                                  "<param>\r\n"
0096                                  "<value><dateTime.iso8601>2015-01-05T17:16:32</dateTime.iso8601></value>\r\n"
0097                                  "</param>\r\n"
0098                                  XML_CALL_END;
0099     QTest::newRow("list") << QString::fromLatin1("MyMethod")
0100                           << (QVariantList() << QVariant(QVariantList() << QLatin1String("data") << 42 << true << 5.678))
0101                           << XML_CALL_HEAD("MyMethod")
0102                              "<param>\r\n"
0103                              "<value><array><data>\r\n"
0104                              "<value><string><![CDATA[data]]></string></value>\r\n"
0105                              "<value><int>42</int></value>\r\n"
0106                              "<value><boolean>1</boolean></value>\r\n"
0107                              "<value><double>5.678</double></value>\r\n"
0108                              "</data></array></value>\r\n"
0109                              "</param>\r\n"
0110                              XML_CALL_END;
0111 
0112     QVariantMap map;
0113     map[QLatin1String("key1")] = 13;
0114     map[QLatin1String("key2")] = QLatin1String("data");
0115     map[QLatin1String("key3")] = false;
0116     QTest::newRow("map") << QString::fromLatin1("MyMethod")
0117                          << (QVariantList() << map)
0118                          << XML_CALL_HEAD("MyMethod")
0119                             "<param>\r\n"
0120                             "<value><struct>\r\n"
0121                             "<member>\r\n<name>key1</name>\r\n<value><int>13</int></value>\r\n</member>\r\n"
0122                             "<member>\r\n<name>key2</name>\r\n<value><string><![CDATA[data]]></string></value>\r\n</member>\r\n"
0123                             "<member>\r\n<name>key3</name>\r\n<value><boolean>0</boolean></value>\r\n</member>\r\n"
0124                             "</struct></value>\r\n"
0125                             "</param>\r\n"
0126                             XML_CALL_END;
0127     /* clang-format on */
0128 }
0129 
0130 void QueryTest::testMarkupCall()
0131 {
0132     QFETCH(QString, methodName);
0133     QFETCH(QList<QVariant>, arguments);
0134     QFETCH(QByteArray, xml);
0135 
0136     const QByteArray markup = QueryPrivate::markupCall(methodName, arguments);
0137     QCOMPARE(markup, xml);
0138 }
0139 
0140 void QueryTest::testResponse_data()
0141 {
0142     QTest::addColumn<bool>("isSuccess");
0143     QTest::addColumn<QByteArray>("xml");
0144     QTest::addColumn<QVariantList>("arguments");
0145 
0146     QVariantMap map;
0147     map[QLatin1String("faultCode")] = 10;
0148     map[QLatin1String("faultString")] = QLatin1String("Fatal Server Error");
0149 
0150     /* clang-format off */
0151     QTest::newRow("fault") << false
0152                            << XML_FAULT_HEAD
0153         "<value><struct>"
0154         "<member><name>faultCode</name><value><int>10</int></value></member>"
0155         "<member><name>faultString</name><value><string><![CDATA[Fatal Server Error]]></string></value></member>"
0156         "</struct></value>" XML_FAULT_END
0157                            << (QVariantList() << map);
0158 
0159     QTest::newRow("string") << true
0160                             << XML_RESPONSE_HEAD
0161         "<param>"
0162         "<value><STRING><![CDATA[result]]></STRING></value>"
0163         "</param>" XML_RESPONSE_END
0164                             << (QVariantList() << QLatin1String("result"));
0165     QTest::newRow("int") << true
0166                          << XML_RESPONSE_HEAD
0167         "<param>"
0168         "<value><INT>1</INT></value>"
0169         "</param>" XML_RESPONSE_END
0170                          << (QVariantList() << 1);
0171     QTest::newRow("i4") << true << XML_RESPONSE_HEAD "<param><value><I4>42</I4></value></param>" XML_RESPONSE_END << (QVariantList() << 42);
0172     QTest::newRow("boolean (num)") << true << XML_RESPONSE_HEAD "<param><value><BOOLEAN>1</BOOLEAN></value></param>" XML_RESPONSE_END
0173                                    << (QVariantList() << true);
0174     QTest::newRow("boolean (str)") << true << XML_RESPONSE_HEAD "<param><value><BOOLEAN>TruE</BOOLEAN></value></param>" XML_RESPONSE_END
0175                                    << (QVariantList() << true);
0176     QTest::newRow("base64") << true << XML_RESPONSE_HEAD "<param><value><BASE64>VmFsaWQgcmVzcG9uc2UK</BASE64></value></param>" XML_RESPONSE_END
0177                             << (QVariantList() << QByteArray("Valid response\n"));
0178     QTest::newRow("datetime") << true << XML_RESPONSE_HEAD "<param><value><DATETIME>2015-01-05T18:02:22</DATETIME></value></param>" XML_RESPONSE_END
0179                               << (QVariantList() << QDateTime(QDate(2015, 01, 05), QTime(18, 02, 22)));
0180     QTest::newRow("datetime 2") << true
0181                                 << XML_RESPONSE_HEAD "<param><value><dateTime.iso8601>2015-01-05T17:03:15Z</dateTime.iso8601></value></param>" XML_RESPONSE_END
0182                                 << (QVariantList() << QDateTime(QDate(2015, 01, 05), QTime(17, 03, 15), Qt::UTC));
0183     QTest::newRow("array") << true
0184                            << XML_RESPONSE_HEAD
0185         "<param><value><ARRAY><data>"
0186         "<value><STRING><![CDATA[item 1]]></STRING></value>"
0187         "<value><STRING><![CDATA[item 2]]></STRING></value>"
0188         "</data></ARRAY></value></param>" XML_RESPONSE_END
0189                            << (QVariantList() << QVariant(QVariantList() << QLatin1String("item 1") << QLatin1String("item 2")));
0190 
0191     map.clear();
0192     map[QLatin1String("Key 1")] = 15;
0193     map[QLatin1String("Key 2")] = QLatin1String("Value");
0194     QTest::newRow("struct") << true
0195                             << XML_RESPONSE_HEAD
0196         "<param><value><STRUCT>"
0197         "<member><name>Key 1</name><value><I4>15</I4></value></member>"
0198         "<member><name>Key 2</name><value><string><![CDATA[Value]]></string></value></member>"
0199         "</STRUCT></value></param>" XML_RESPONSE_END
0200                             << (QVariantList() << map);
0201     /* clang-format on */
0202 }
0203 
0204 void QueryTest::testResponse()
0205 {
0206     QFETCH(bool, isSuccess);
0207     QFETCH(QByteArray, xml);
0208     QFETCH(QVariantList, arguments);
0209 
0210     QDomDocument doc;
0211     QVERIFY(doc.setContent(xml));
0212 
0213     QCOMPARE(QueryPrivate::isMessageResponse(doc), isSuccess);
0214     QCOMPARE(QueryPrivate::isFaultResponse(doc), !isSuccess);
0215 
0216     if (isSuccess) {
0217         const KXmlRpc::Result result = QueryPrivate::parseMessageResponse(doc);
0218         QVERIFY(result.success());
0219         QCOMPARE(result.errorCode(), -1);
0220         QVERIFY(result.errorString().isEmpty());
0221         QCOMPARE(result.data(), arguments);
0222     } else {
0223         const KXmlRpc::Result result = QueryPrivate::parseFaultResponse(doc);
0224         QVERIFY(!result.success());
0225         QCOMPARE(result.errorCode(), arguments[0].toMap()[QLatin1String("faultCode")].toInt());
0226         QCOMPARE(result.errorString(), arguments[0].toMap()[QLatin1String("faultString")].toString());
0227         QVERIFY(result.data().isEmpty());
0228     }
0229 }
0230 
0231 #include "moc_querytest.cpp"