File indexing completed on 2024-03-24 16:13:27

0001 /** ===========================================================
0002  * @file
0003  *
0004  * This file is a part of KDE project
0005  * <a href="https://commits.kde.org/libmediawiki">libmediawiki</a>
0006  *
0007  * @date   2011-03-22
0008  * @brief  a MediaWiki C++ interface for KDE
0009  *
0010  * @author Copyright (C) 2011 by Manuel Campomanes
0011  *         <a href="mailto:campomanes dot manuel at gmail dot com">campomanes dot manuel at gmail dot com</a>
0012  *
0013  * This program is free software; you can redistribute it
0014  * and/or modify it under the terms of the GNU General
0015  * Public License as published by the Free Software Foundation;
0016  * either version 2, or (at your option)
0017  * any later version.
0018  *
0019  * This program is distributed in the hope that it will be useful,
0020  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0022  * GNU General Public License for more details.
0023  *
0024  * ============================================================ */
0025 
0026 #ifndef TEST_PARSE_H
0027 #define TEST_PARSE_H
0028 
0029 #include <QObject>
0030 #include <QtTest>
0031 
0032 #include <KJob>
0033 
0034 #include "mediawiki.h"
0035 #include "parse.h"
0036 #include "libmediawikitest/fakeserver.h"
0037 
0038 using mediawiki::MediaWiki;
0039 using mediawiki::Parse;
0040 
0041 Q_DECLARE_METATYPE(FakeServer::Request)
0042 Q_DECLARE_METATYPE(QVariant)
0043 Q_DECLARE_METATYPE(Parse*)
0044 
0045 QString QStringFromFile(const QString& fileName)
0046 {
0047     QFile file( fileName );
0048 
0049     if (!file.open( QFile::ReadOnly ))
0050         return QString();
0051     
0052     QTextStream in(&file);
0053     QString scenario;
0054     // When loading from files we never have the authentication phase
0055     // force jumping directly to authenticated state.
0056 
0057     while ( !in.atEnd() )
0058     {
0059         scenario.append( in.readLine() );
0060     }
0061 
0062     file.close();
0063     return scenario;
0064 }
0065 
0066 class ParseTest : public QObject
0067 {
0068     Q_OBJECT
0069 
0070 public Q_SLOTS:
0071 
0072     void parseHandle(KJob* job)
0073     {
0074         Q_UNUSED(job)
0075         parseCount++;
0076     }
0077 
0078     void resultHandle(const QString& result)
0079     {
0080         parseResult = result;
0081     }
0082 
0083 private Q_SLOTS:
0084 
0085     void initTestCase()
0086     {
0087         parseCount        = 0;
0088         this->m_mediaWiki = new MediaWiki(QUrl(QStringLiteral("http://127.0.0.1:12566")));
0089     }
0090 
0091     void result()
0092     {
0093         QString scenario = QStringFromFile(QStringLiteral("./parsetest_result.rc"));
0094         QString result   = QStringFromFile(QStringLiteral("./parsetest_resulttrue.rc"));
0095 
0096         Parse* const job = new Parse(*m_mediaWiki, nullptr);
0097         parseCount = 0;
0098         FakeServer fakeserver;
0099         fakeserver.setScenario(scenario);
0100         fakeserver.startAndWait();
0101 
0102         connect(job, SIGNAL(result(QString)),
0103                 this, SLOT(resultHandle(QString)));
0104 
0105         connect(job, SIGNAL(result(KJob*)),
0106                 this, SLOT(parseHandle(KJob*)));
0107 
0108         job->exec();
0109         QCOMPARE(parseResult, result);
0110         QCOMPARE(this->parseCount, 1);
0111     }
0112 
0113     void parseSetters()
0114     {
0115         QFETCH(QString, scenario);
0116         QFETCH(QString, request);
0117         QFETCH(Parse*, job);
0118 
0119         parseCount = 0;
0120         FakeServer fakeserver;
0121         fakeserver.setScenario(scenario);
0122         fakeserver.startAndWait();
0123 
0124         connect(job, SIGNAL(result(KJob*)),
0125                 this, SLOT(parseHandle(KJob*)));
0126 
0127         job->exec();
0128         FakeServer::Request serverrequest = fakeserver.getRequest()[0];
0129         QCOMPARE(serverrequest.type, QStringLiteral("GET"));
0130         QCOMPARE(serverrequest.value, request);        
0131         QCOMPARE(this->parseCount, 1);
0132     }
0133 
0134     void parseSetters_data()
0135     {
0136         QTest::addColumn<QString>("scenario");
0137         QTest::addColumn<QString>("request");        
0138         QTest::addColumn<Parse*>("job");
0139 
0140         Parse* const p1 = new Parse( *m_mediaWiki, nullptr);
0141         p1->setText(QStringLiteral("listedecharacteres"));
0142 
0143         QTest::newRow("Text")
0144                 << QStringFromFile(QStringLiteral("./parsetest.rc"))
0145                 << QStringLiteral("/?format=xml&action=parse&text=listedecharacteres")
0146                 << p1;
0147 
0148         Parse* const p2 = new Parse( *m_mediaWiki, nullptr);
0149         p2->setPageName(QStringLiteral("listedecharacteres"));
0150 
0151         QTest::newRow("Page Name")
0152                 << QStringFromFile(QStringLiteral("./parsetest.rc"))
0153                 << QStringLiteral("/?format=xml&action=parse&page=listedecharacteres")
0154                 << p2;
0155 
0156         Parse* const p3 = new Parse( *m_mediaWiki, nullptr);
0157         p3->setTitle(QStringLiteral("listedecharacteres"));
0158 
0159         QTest::newRow("Title")
0160                 << QStringFromFile(QStringLiteral("./parsetest.rc"))
0161                 << QStringLiteral("/?format=xml&action=parse&title=listedecharacteres")
0162                 << p3;
0163 
0164         Parse* const p4 = new Parse( *m_mediaWiki, nullptr);
0165         p4->setUseLang(QStringLiteral("fr"));
0166 
0167         QTest::newRow("User Langue")
0168                 << QStringFromFile(QStringLiteral("./parsetest.rc"))
0169                 << QStringLiteral("/?format=xml&action=parse&uselang=fr")
0170                 << p4;
0171     }
0172 
0173     void error()
0174     {
0175         QFETCH(QString, scenario);
0176         QFETCH(int, error);
0177         parseCount = 0;
0178         FakeServer fakeserver;
0179 
0180         if(scenario != QStringLiteral("error serveur"))
0181         {
0182             fakeserver.addScenario(scenario);
0183             fakeserver.startAndWait();
0184         }
0185 
0186         Parse* const job = new Parse(*m_mediaWiki);
0187         job->setTitle( QStringLiteral("title") );
0188 
0189         connect(job, SIGNAL(result(KJob*)),
0190                 this, SLOT(parseHandle(KJob*)));
0191 
0192         job->exec();
0193 
0194         if(scenario != QStringLiteral("error serveur"))
0195         {
0196             QList<FakeServer::Request> requests = fakeserver.getRequest();
0197             QCOMPARE(requests.size(), 1);
0198         }
0199 
0200         QCOMPARE(job->error(), error);
0201         QCOMPARE(parseCount, 1);
0202 
0203         if(scenario != QStringLiteral("error serveur"))
0204         {
0205             QVERIFY(fakeserver.isAllScenarioDone());
0206         }
0207     }
0208 
0209     void error_data()
0210     {
0211         QTest::addColumn<QString>("scenario");
0212         QTest::addColumn<int>("error");
0213 
0214         QTest::newRow("XML")
0215                 << QStringLiteral("<?xml version=\"1.0\" encoding=\"utf-8\"?><api><parse><text>")
0216                 << int(Parse::XmlError);
0217 
0218         QTest::newRow("Network")
0219                 << QStringLiteral("error serveur")
0220                 << int(Parse::NetworkError);
0221 
0222         QTest::newRow("Params")
0223                 << QStringLiteral("<api><error code=\"params\" info=\"\"/></api>")
0224                 << int(Parse::TooManyParams);
0225 
0226         QTest::newRow("Missing Title")
0227                 << QStringLiteral("<api><error code=\"missingtitle\" info=\"\"/></api>")
0228                 << int(Parse::MissingPage);
0229     }
0230 
0231     void cleanupTestCase()
0232     {
0233         delete this->m_mediaWiki;
0234     }
0235 
0236 private:
0237 
0238     int        parseCount;
0239     QString    request;
0240     QString    parseResult;
0241     MediaWiki* m_mediaWiki;
0242 };
0243 
0244 QTEST_MAIN(ParseTest)
0245 
0246 #include "parsetest.moc"
0247 
0248 #endif // TEST_PARSE_H