Added updated unit tests for updateLocation and reverseGeo.
authorlampehe-local <henri.lampela@ixonos.com>
Thu, 15 Apr 2010 09:36:35 +0000 (12:36 +0300)
committerlampehe-local <henri.lampela@ixonos.com>
Thu, 15 Apr 2010 09:36:35 +0000 (12:36 +0300)
Added functionality for reverseGeo.

src/facebook_service/README.txt [deleted file]
src/situareservice/situarecommon.h
src/situareservice/situareservice.cpp
src/situareservice/situareservice.h
tests/testsituareservice/testlocationupdate/networkaccessmanagermock.cpp
tests/testsituareservice/testlocationupdate/networkaccessmanagermock.h
tests/testsituareservice/testlocationupdate/networkreplymock.cpp
tests/testsituareservice/testlocationupdate/networkreplymock.h
tests/testsituareservice/testlocationupdate/testlocationupdate.cpp
tests/testsituareservice/teststringformations/teststringformations.cpp

diff --git a/src/facebook_service/README.txt b/src/facebook_service/README.txt
deleted file mode 100644 (file)
index e69de29..0000000
index a8bb0ad..8440c5f 100644 (file)
@@ -34,6 +34,7 @@ const QString TEST_API_KEY = "cf77865a5070f2c2ba3b52cbf3371579";
 
 // Situare PHP scripts
 const QString UPDATE_LOCATION = "updateLocation.php";
+const QString REVERSE_GEO = "reversegeo.php";
 
 // Cookies
 const QString COOKIE = "Cookie";
@@ -42,11 +43,14 @@ const QString EXPIRES = "expires";
 const QString SESSION_KEY = "session_key";
 const QString SESSION_SECRET = "ss";
 
+const QString USER_AGENT = "User-Agent";
+const QString AGENT = "Agent";
+
 // Locales
 const QString LOCALE = "locale";
 const QString EN_LOCALE = "en_EN";
 
-// common marks
+// Common marks
 const QString QUESTION_MARK = "?";
 const QString AMBERSAND_MARK = "&";
 const QString EQUAL_MARK = "=";
@@ -63,4 +67,9 @@ const QString PUBLISH_TRUE = "true";
 const QString PUBLISH_FALSE = "false";
 const QString DATA = "data";
 
+// Situare error messages
+const QString ERROR_LAT = "Wrong lat value: . Latitude must be between -90 and 90!";
+const QString ERROR_LON = "Wrong lon value: . Longitude must be between -180 and 180!";
+const QString ERROR_SESSION = "<br />\n<b>Fatal error</b>:"; // starts with
+
 #endif // SITUARECOMMON_H
index 04c8997..12a7aa3 100644 (file)
 #include "../cookiehandler/cookiehandler.h"
 
 SituareService::SituareService(QObject *parent, QNetworkAccessManager *manager)
-        : QObject(parent), m_manager(manager)
+        : QObject(parent), networkManager(manager)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    connect(m_manager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
+    connect(networkManager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
 }
 
 SituareService::~SituareService()
 {
     qDebug() << __PRETTY_FUNCTION__;
+
+    delete networkManager;
 }
 
 void SituareService::updateLocation(QPointF coordinates, QString status, bool publish)
 {
     qDebug() << __PRETTY_FUNCTION__;
-    // CookieHandler cookieHandler;
-    //QString cookie = cookieHandler.formCookie(); // ToDo: get the FB session credentials from somewhere, QSettings...
+
+//    CookieHandler cookieHandler;
+//    QString cookie = cookieHandler.formCookie(); // ToDo: get the FB session credentials from somewhere, QSettings...
+
     QString publishValue;
     if(publish) {
         publishValue = PUBLISH_TRUE;
@@ -53,6 +57,19 @@ void SituareService::updateLocation(QPointF coordinates, QString status, bool pu
     }
     QString urlParameters = formUrlParameters(coordinates, status, publishValue);
     QUrl url = formUrl(SITUARE_URL, UPDATE_LOCATION, urlParameters);
+
+    //sendRequest(url, COOKIE, cookie);
+}
+
+void SituareService::reverseGeo(QPointF coordinates)
+{
+//    CookieHandler cookieHandler;
+//    QString cookie = cookieHandler.formCookie(); // ToDo: get the FB session credentials from somewhere, QSettings...
+
+    QString urlParameters = formUrlParameters(coordinates);
+    QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
+
+    //sendRequest(url, COOKIE, cookie);
 }
 
 QUrl SituareService::formUrl(QString baseUrl, QString phpScript, QString urlParameters)
@@ -109,62 +126,16 @@ QString SituareService::formUrlParameters(QPointF coordinates, QString status, Q
     return parameters;
 }
 
-//QString SituareService::formCookie(QString apiKeyValue, QString expiresValue, QString userValue, QString sessionKeyValue, QString sessionSecretValue, QString signatureValue, QString localeValue)
-//{
-//    qDebug() << __PRETTY_FUNCTION__;
-//
-//    QString cookie, apiKey, user, expires, sessionKey, sessionSecret, locale, variable;
-//    QString signature = EQUAL_MARK;
-//    QStringList variableList;
-//
-//    signature.append(signatureValue);
-//    apiKey.append(apiKeyValue);
-//    apiKey.append(UNDERLINE_MARK);
-//
-//    user.append(USER);
-//    user.append(EQUAL_MARK);
-//    expires.append(EXPIRES);
-//    expires.append(EQUAL_MARK);
-//    sessionKey.append(SESSION_KEY);
-//    sessionKey.append(EQUAL_MARK);
-//    sessionSecret.append(SESSION_SECRET);
-//    sessionSecret.append(EQUAL_MARK);
-//    locale.append(LOCALE);
-//    locale.append(EQUAL_MARK);
-//    locale.append(localeValue);
-//
-//    variableList.append(expires.append(expiresValue.append(BREAK_MARK)));
-//    variableList.append(sessionKey.append(sessionKeyValue.append(BREAK_MARK)));
-//    variableList.append(user.append(userValue).append(BREAK_MARK));
-//    variableList.append(sessionSecret.append(sessionSecretValue.append(BREAK_MARK)));
-//
-//    cookie.append(BREAK_MARK);
-//
-//    foreach(variable, variableList) {
-//        cookie.append(apiKey);
-//        cookie.append(variable);
-//    }
-//    apiKey.remove(UNDERLINE_MARK);
-//    cookie.append(apiKey);
-//    cookie.append(signature);
-//    cookie.append(BREAK_MARK);
-//    cookie.append(locale);
-//
-//    qDebug() << cookie;
-//
-//    return cookie;
-//}
-
-void SituareService::sendRequest(QUrl url, QString cookie)
+void SituareService::sendRequest(QUrl url, QString cookieType, QString cookie)
 {
     qDebug() << __PRETTY_FUNCTION__ << "url: " << url;
 
     QNetworkRequest request;
 
     request.setUrl(url);
-    request.setRawHeader(COOKIE.toAscii(), cookie.toUtf8());
+    request.setRawHeader(cookieType.toAscii(), cookie.toUtf8());
 
-    QNetworkReply *reply = m_manager->get(request);
+    QNetworkReply *reply = networkManager->get(request);
 
     currentRequests.append(reply);
 }
@@ -174,14 +145,35 @@ void SituareService::requestFinished(QNetworkReply *reply)
     qDebug() << __PRETTY_FUNCTION__;
 
     QUrl url = reply->url();
+    qDebug() << "BytesAvailable: " << reply->bytesAvailable();
     if (reply->error()) {
         qDebug() << reply->errorString();
-        // ToDo: some error handling etc.
+        emit error(reply->errorString());
+        // ToDo: some general http error handling etc, signal UI?
     }
     else {
         qint64 max = reply->size();
-        qDebug() << "Reply from: " << url << "reply " << reply->read(max);
-        // ToDo: results handling etc.
+        QByteArray replyArray = reply->read(max);
+        qDebug() << "Reply from: " << url << "reply " << replyArray;
+        // ToDo: results handling includes Situare's errors
+        // works like situare's error handling i.e. both lat & lon are missing/wrong -> we get only error for wrong lon
+        if(replyArray == ERROR_LAT.toAscii()) {
+            qDebug() << "Error: " << ERROR_LAT;
+            // ToDo: signal UI?
+        }
+        else if(replyArray == ERROR_LON.toAscii()) {
+            qDebug() << "Error: " << ERROR_LON;
+            // ToDo: signal UI?
+        }
+        else if(replyArray.contains(ERROR_SESSION.toAscii())) {
+            qDebug() << "Error: " << ERROR_SESSION;
+            // ToDo: signal UI?
+        }
+        else {
+            // no error -> update was successful
+            // ToDo: signal UI?
+            qDebug() << reply->read(max);
+        }
     }
 
     currentRequests.removeAll(reply);
index f65ad2a..72d5b3e 100644 (file)
@@ -62,6 +62,14 @@ public:
     void updateLocation(QPointF coordinates, QString status, bool publish);
 
     /**
+    * @brief Translates coordinates to street address via Situare server
+    *
+    * @fn reverseGeo
+    * @param coordinates coordinates to be translated
+    */
+    void reverseGeo(QPointF coordinates);
+
+    /**
     * @brief Forms a http url
     *
     * @fn formUrl
@@ -77,35 +85,31 @@ public:
     *
     * @fn formUrlParameters
     * @param coordinates current coordinates
-    * @param status status message
-    * @param publish publish location on Facebook wall (true/false)
+    * @param status optional status message
+    * @param publish optional publish location on Facebook wall (true/false)
     * @return QString
     */
-    QString formUrlParameters(QPointF coordinates, QString status, QString publish);
-
-    /**
-    * @brief Forms a http cookie
-    *
-    * @fn formCookie
-    * @param apiKeyValue application key
-    * @param expiresValue session expire date&time from Facebook
-    * @param userValue user id from Facebook
-    * @param sessionKeyValue session key from Facebook
-    * @param sessionSecretValue session secret from Facebook
-    * @param signatureValue md5 generated signature
-    * @param localeValue used locale
-    * @return QString formed cookie
-    */
-    //QString formCookie(QString apiKeyValue, QString expiresValue, QString userValue, QString sessionKeyValue, QString sessionSecretValue, QString signatureValue, QString localeValue);
+    QString formUrlParameters(QPointF coordinates, QString status = 0, QString publish = 0);
 
     /**
     * @brief Sends http request
     *
     * @fn sendRequest
     * @param url destination
+    * @param cookieType type of the cookie
     * @param cookie http cookie
     */
-    void sendRequest(QUrl url, QString cookie);
+    void sendRequest(QUrl url, QString cookieType, QString cookie);
+
+signals:
+
+    /**
+    * @brief Signals error
+    *
+    * @fn error
+    * @param error error message
+    */
+    void error(const QString &error);
 
 public slots:
 
@@ -118,7 +122,7 @@ public slots:
     void requestFinished(QNetworkReply *reply);
 
 private:
-    QNetworkAccessManager *m_manager;
+    QNetworkAccessManager *networkManager;
     QList<QNetworkReply *> currentRequests;
 };
 
index 6d8707e..73af5fc 100644 (file)
 */
 
 #include <QDebug>
+#include <QBuffer>
 #include "networkaccessmanagermock.h"
 
-NetworkAccessManagerMock::NetworkAccessManagerMock()
+NetworkAccessManagerMock::NetworkAccessManagerMock(QNetworkAccessManager *manager, QObject *parent)
+    : QNetworkAccessManager(parent)
+    , mode(0)
 {
+    qDebug() << __PRETTY_FUNCTION__;
 }
 
-NetworkReplyMock *NetworkAccessManagerMock::get(const QNetworkRequest &request)
+NetworkReplyMock *NetworkAccessManagerMock::createRequest(Operation op, const QNetworkRequest &request,
+                                                        QIODevice *outgoingData)
 {
-    qDebug() << __PRETTY_FUNCTION__;
-    this->request = request;
-    reply = new NetworkReplyMock(this);
+     qDebug() << __PRETTY_FUNCTION__;
+
+     reply = new NetworkReplyMock(this);
+     this->request = request;
 
-   switch (this->mode) {
+     switch (this->mode) {
 
-    case NetworkAccessManagerMock::CORRECT:
+     case NetworkAccessManagerMock::CORRECT:
          QTimer::singleShot(0, this, SLOT(generateCorrectReply()));
          break;
      case NetworkAccessManagerMock::INCORRECT:
@@ -46,12 +52,56 @@ NetworkReplyMock *NetworkAccessManagerMock::get(const QNetworkRequest &request)
      default:
          QTimer::singleShot(0, this, SLOT(generateCorrectReply()));
          break;
-     }
+    }
+    return reply;
+}
 
-     return reply;
+NetworkReplyMock *NetworkAccessManagerMock::get(const QNetworkRequest &request)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+    this->request = request;
+
+    return reply;
 }
 
 void NetworkAccessManagerMock::setMode(int mode)
 {
     this->mode = mode;
 }
+
+void NetworkAccessManagerMock::generateError()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+    reply->setUrl(request.url());
+    reply->setError(QNetworkReply::HostNotFoundError, "Host not found");
+    emit QNetworkAccessManager::finished(reply);
+}
+
+void NetworkAccessManagerMock::generateCorrectReply()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+    reply->setUrl(request.url());
+    reply->setError(QNetworkReply::NoError, "No error");
+//    QImage image;
+//    if (!image.load(":testTile.png", 0)) {
+//        qDebug() << "could not load image";
+//        image = QImage();
+//    }
+//    else
+//    qDebug() << "image loaded";
+//
+//    QByteArray array;
+//    QBuffer buffer(&array);
+//    buffer.open(QBuffer::WriteOnly);
+//    if (image.save(&buffer, "PNG"))
+//        qDebug() << "image saved";
+//    buffer.close();
+//    reply->setData(array);
+    emit QNetworkAccessManager::finished(reply);
+}
+
+void NetworkAccessManagerMock::generateDelayedCorrectReply()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+    QTimer::singleShot(4000, this, SLOT(generateCorrectReply()));
+}
index 111636d..77b51ab 100644 (file)
@@ -32,16 +32,26 @@ class NetworkAccessManagerMock : public QNetworkAccessManager
 {
     Q_OBJECT
 public:
-    NetworkAccessManagerMock();
+    NetworkAccessManagerMock(QNetworkAccessManager *manager = 0, QObject *parent = 0);
+
     NetworkReplyMock *get(const QNetworkRequest &request);
+
     void setMode(int mode);
 
 
     enum {CORRECT, INCORRECT, DELAYED_CORRECT};
 
+protected:
+    NetworkReplyMock *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData);
+
 signals:
      void finished(NetworkReplyMock *reply);
 
+ private slots:
+     void generateError();
+     void generateCorrectReply();
+     void generateDelayedCorrectReply();
+
 private:
      NetworkReplyMock *reply;
      QNetworkRequest request;
index 5fa6539..2e94b85 100644 (file)
@@ -9,11 +9,11 @@ NetworkReplyMock::NetworkReplyMock(QObject *parent)
 {
 }
 
-//void NetworkReplyMock::setError(NetworkError errorCode, const QString &errorString)
-//{
-//     qDebug() << __PRETTY_FUNCTION__;
-//     //QNetworkReply::setError(errorCode, errorString);
-//}
+void NetworkReplyMock::setError(NetworkError errorCode, const QString &errorString)
+{
+     qDebug() << __PRETTY_FUNCTION__;
+     QNetworkReply::setError(errorCode, errorString);
+}
 
 
 qint64 NetworkReplyMock::readData(char *data, qint64 maxLen)
@@ -35,10 +35,16 @@ QByteArray NetworkReplyMock::readAll()
     return m_content;
 }
 
+qint64 NetworkReplyMock::bytesAvailable() const
+{
+    qDebug() << __PRETTY_FUNCTION__;
+    return m_content.size() - m_offset;
+}
+
 void NetworkReplyMock::setUrl(const QUrl &url)
 {
     qDebug() << __PRETTY_FUNCTION__;
-    //QNetworkReply::setUrl(url);
+    QNetworkReply::setUrl(url);
 }
 
 void NetworkReplyMock::abort()
@@ -53,9 +59,9 @@ void NetworkReplyMock::test()
 
 void NetworkReplyMock::setData(const QByteArray &content)
 {
-//     qDebug() << __PRETTY_FUNCTION__;
+     qDebug() << __PRETTY_FUNCTION__;
 //     setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png"));
 //     setHeader(QNetworkRequest::ContentLengthHeader, QVariant(this->m_content.size()));
 //     m_content.append(content);
-     qDebug() << "Content size: " << m_content.size();
+//     qDebug() << "Content size: " << m_content.size();
 }
index cec0293..fcb4108 100644 (file)
 #include <QNetworkReply>
 #include <QUrl>
 
+
 class NetworkReplyMock : public QNetworkReply
 {
     Q_OBJECT
 public:
     NetworkReplyMock(QObject *parent = 0);
     void abort();
-    qint64 bytesAvailable() const
-    {
-        return m_content.size() - m_offset;
-    }
+    qint64 bytesAvailable() const;
+
     bool isSequential() const
     {
         return true;
     }
-    //void setError(NetworkError errorCode, const QString &errorString);
+    void setError(NetworkError errorCode, const QString &errorString);
     void setData(const QByteArray &content);
     void setUrl(const QUrl &url);
     void test();
index ffb8266..03445dc 100644 (file)
 #include <QtTest/QtTest>
 #include <QtCore>
 #include <QPointF>
+#include <QNetworkAccessManager>
 
 
 #include "../../../src/situareservice/situareservice.h"
+#include "../../../src/situareservice/situarecommon.h"
 #include "networkaccessmanagermock.h"
 #include "networkreplymock.h"
 
@@ -34,38 +36,56 @@ class testLocationUpdate : public QObject
     Q_OBJECT
 private:
     SituareService *situare;
-    NetworkAccessManagerMock *manager;
+    NetworkAccessManagerMock *managerMock;
+    QList<QNetworkReply *> currentRequests;
 
 private slots:
-    void testLocationUpdatePublishWithoutStatus();
-    void testLocationUpdatePublishWithStatus();
-    void testLocationUpdateUnPublishWithStatus();
-    void testLocationUpdateUnPublishWithoutStatus();
+
+    void testIncorrectUrl();
+    void testCorrectUrl();
 };
 
-void testLocationUpdate::testLocationUpdatePublishWithoutStatus()
+
+void testLocationUpdate::testIncorrectUrl()
 {
-    manager = new NetworkAccessManagerMock();
+    QNetworkAccessManager *manager = new QNetworkAccessManager();
+    managerMock = new NetworkAccessManagerMock(manager, this);
     situare = new SituareService(this, manager);
 
-    QPointF coordinates(65, 25.5);
-    bool publish = true;
-    QString status = "";
-    situare->updateLocation(coordinates, status, publish);
+    managerMock->setMode(NetworkAccessManagerMock::INCORRECT);
+
+    QSignalSpy receivedErrorSpy(situare, SIGNAL(error(QString)));
+
+    QVERIFY(receivedErrorSpy.isValid());
+
+    // incorrect url
+
+    situare->sendRequest(QUrl("http://client.situare.nett"), COOKIE, QString(";2;1"));
+    QTest::qWait(1000);
+    QCOMPARE(receivedErrorSpy.count(), 1);
 
     delete manager;
-    delete situare;
+    //delete situare;
 }
 
-void testLocationUpdate::testLocationUpdatePublishWithStatus()
+void testLocationUpdate::testCorrectUrl()
 {
-    manager = new NetworkAccessManagerMock();
+    QNetworkAccessManager *manager = new QNetworkAccessManager();
+    managerMock = new NetworkAccessManagerMock(manager, this);
     situare = new SituareService(this, manager);
 
-    QPointF coordinates(65, 25.5);
-    bool publish = true;
-    QString status = "test - publish";
-    situare->updateLocation(coordinates, status, publish);
+    managerMock->setMode(NetworkAccessManagerMock::CORRECT);
+
+    QSignalSpy receivedErrorSpy(situare, SIGNAL(error(QString)));
+
+    QVERIFY(receivedErrorSpy.isValid());
+
+    QUrl url = QUrl("http://client.situare.net");
+
+    situare->sendRequest(url, COOKIE, QString(";2;1"));
+    QTest::qWait(1000);
+
+    QCOMPARE(receivedErrorSpy.count(), 0);
 
     delete manager;
     delete situare;
index ecaa3b7..314990b 100644 (file)
@@ -36,8 +36,6 @@ private:
 
 private slots:
 
-    void testFormCookie();                  // cookie test
-
     void testWithNoPublishNoStatus();       // part 1 of testFormUrlParameters
     void testWithStatusNoPublish();         // part 2 of testFormUrlParameters
     void testWithPublishTrueNoStatus();     // part 3 of testFormUrlParameters
@@ -46,24 +44,10 @@ private slots:
     void testWithPublishFalseNoStatus();    // part 6 of testFormUrlParameters
 
     void testFormUpdateLocationUrl();       // updateLocation url test
+    void testFormReverseGeoUrl();           // reverseGeo url test
 
 };
 
-void testStringFormations::testFormCookie()
-{
-    const QString apiKey = "1";
-    const QString expires = "2";
-    const QString sessionKey = "3";
-    const QString user = "4";
-    const QString sessionSecret = "5";
-    const QString signature = "6";
-    const QString locale = "7";
-
-    QString cookie = situare->formCookie(apiKey, expires, user, sessionKey, sessionSecret, signature, locale);
-
-    QCOMPARE(QString(";1_expires=2;1_session_key=3;1_user=4;1_ss=5;1=6;locale=7"), cookie);
-}
-
 void testStringFormations::testWithNoPublishNoStatus()
 {
     QPointF coordinates(65.3, 25.5);
@@ -132,6 +116,17 @@ void testStringFormations::testFormUpdateLocationUrl()
     QCOMPARE(QString("http://client.situare.net/updateLocation.php?lat=65.3&lon=25.5&publish=false"), url.toString());
 }
 
+void testStringFormations::testFormReverseGeoUrl()
+{
+    QPointF coordinates(65.3, 25.5);
+
+    QString params = situare->formUrlParameters(coordinates);
+
+    QUrl url = situare->formUrl(SITUARE_URL, REVERSE_GEO, params);
+
+    QCOMPARE(QString("http://client.situare.net/reversegeo.php?lat=65.3&lon=25.5"), url.toString());
+}
+
 
 QTEST_MAIN(testStringFormations)
 #include "teststringformations.moc"