diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt index a9e564e..a5aec3b 100644 --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -1,9 +1,20 @@ include(ECMAddTests) find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Test) include_directories(../src) ecm_add_test(urlmodeltest.cpp ../src/urlmodel.cpp TEST_NAME urlmodeltest - LINK_LIBRARIES Qt5::Test ) + LINK_LIBRARIES Qt5::Test +) + +ecm_add_test(useragenttest.cpp ../src/useragent.cpp + TEST_NAME useragenttest + LINK_LIBRARIES Qt5::Test +) + +ecm_add_test(browsermanagertest.cpp ../src/browsermanager.cpp ../src/urlmodel.cpp + TEST_NAME browsermanagertest + LINK_LIBRARIES Qt5::Test Qt5::Qml +) diff --git a/autotests/browsermanagertest.cpp b/autotests/browsermanagertest.cpp new file mode 100644 index 0000000..51b9fc1 --- /dev/null +++ b/autotests/browsermanagertest.cpp @@ -0,0 +1,74 @@ +/* + * Copyright 2019 Jonah BrĂ¼chert + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation; + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include + +#include "browsermanager.h" + +using namespace AngelFish; + +class UserAgentTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + + void initTestCase() + { + m_browserManager = new BrowserManager(); + } + + void cleanupTestCase() + { + delete m_browserManager; + } + + void homepage() + { + const QString newHomepage = QStringLiteral("https://kde.org"); + + m_browserManager->setHomepage(newHomepage); + QCOMPARE(m_browserManager->homepage(), newHomepage); + } + + void searchEngine() + { + const QString newSearchEngineUrl = QStringLiteral("https://search.angelfish.kde?q="); + + m_browserManager->setSearchBaseUrl(newSearchEngineUrl); + QCOMPARE(m_browserManager->searchBaseUrl(), newSearchEngineUrl); + } + + void urlFromUserInput() + { + const QString incompleteUrl = QStringLiteral("kde.org"); + const QString completeUrl = QStringLiteral("http://kde.org"); + + QCOMPARE(m_browserManager->urlFromUserInput(incompleteUrl), completeUrl); + } + +private: + BrowserManager *m_browserManager; +}; + +QTEST_MAIN(UserAgentTest); + +#include "browsermanagertest.moc" diff --git a/autotests/urlmodeltest.cpp b/autotests/urlmodeltest.cpp index 6ee7b84..1c08780 100644 --- a/autotests/urlmodeltest.cpp +++ b/autotests/urlmodeltest.cpp @@ -1,356 +1,356 @@ /* * Copyright 2014 Alex Richardson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation; * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "urlmodel.h" using namespace AngelFish; class UrlModelTest : public QObject { Q_OBJECT static void compare(const QJsonArray &data, QAbstractListModel *model) { QCOMPARE(data.count(), model->rowCount(QModelIndex())); QStringList roleNames; for (const auto &rn : model->roleNames()) { roleNames << rn; } for (int i = 0; i < data.count(); i++) { auto index = model->index(i); QVariantMap vm = data.at(i).toObject().toVariantMap(); for (const auto &k : vm.keys()) { QVERIFY2(roleNames.contains(k), QString("Key \"" + k + "\" not found roleNames").toLocal8Bit()); } for (const int &k : model->roleNames().keys()) { auto *urlmodel = dynamic_cast(model); const QString ks = urlmodel->key(k); QVariant ori = vm[ks]; QVariant val = model->data(index, k); // qDebug() << "Comparing " << ks << k; // qDebug() << " " << (ori == val) << ori << " == " << val; if (!vm.keys().contains(ks)) { // QVERIFY(val == QVariant()); continue; } if (ks == "lastVisited") { auto dt = QDateTime::fromString(model->data(index, k).toString(), Qt::ISODate); QCOMPARE(vm[ks].toDateTime(), dt); } else { QCOMPARE(vm[ks], model->data(index, k)); } } QString u = model->data(index, UrlModel::url).toString(); // QVERIFY(!u.isEmpty()); // qDebug() << i << "URL: " << u; } } static QJsonArray readFile(const QString &fileName) { QFile jsonFile(fileName); jsonFile.open(QIODevice::ReadOnly); // QJsonDocument jdoc = QJsonDocument::fromBinaryData(jsonFile.readAll()); QJsonDocument jdoc = QJsonDocument::fromJson(jsonFile.readAll()); jsonFile.close(); return jdoc.array(); } private Q_SLOTS: void init() { m_bookmarksModel = new UrlModel(QStringLiteral("urlmodeltest.json"), this); } void cleanup() { delete m_bookmarksModel; } void initTestCase() { init(); { QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://m.nos.nl")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("Nieuws")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("text-html")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); m_data << u; } { QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://vizZzion.org")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("sebas' blog")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("/home/sebas/Pictures/avatar-small.jpg")); u.insert(m_bookmarksModel->key(UrlModel::preview), QStringLiteral("/home/sebas/Pictures/avatar-small.jpg")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); m_data << u; } { QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://lwn.net")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("Linux Weekly News")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("text-html")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); m_data << u; } { QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://tweakers.net")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("Tweakers.net")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("text-html")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); m_data << u; } { QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://en.wikipedia.org")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("Wikipedia")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("text-html")); // u.insert(m_bookmarksModel->key(UrlModel::preview), // QStringLiteral("/home/sebas/Pictures/avatar-small.jpg")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), false); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); m_data << u; } { QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://plasma-mobile.org")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("Plasma Mobile")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("plasma")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); m_data << u; } cleanup(); } void testEmpty() { QVERIFY(m_data.count() > 0); QVERIFY(m_bookmarksModel->rowCount(QModelIndex()) == 0); } void testSetSourceData() { m_bookmarksModel->setSourceData(m_data); // TODO wait for update! // ... QVERIFY(m_bookmarksModel->rowCount(QModelIndex()) > 0); QCOMPARE(m_bookmarksModel->rowCount(QModelIndex()), m_data.count()); QCOMPARE(m_data, m_bookmarksModel->sourceData()); } void testSave() { const QString fileName("savetest.json"); // save, reset, load... auto saveModel = new UrlModel(fileName); saveModel->setSourceData(m_data); QVERIFY(saveModel->save()); const QString fpath = saveModel->filePath(); delete saveModel; auto loadModel = new UrlModel(fileName); QVERIFY(loadModel->load()); QJsonArray written = readFile(fpath); // return; compare(written, loadModel); delete loadModel; } void compareData() { m_bookmarksModel->setSourceData(m_data); compare(m_data, m_bookmarksModel); } void testLoad() { const QString file1 = QFINDTESTDATA("data/simplebookmarks.json"); auto model = new UrlModel(file1, this); QVERIFY(model->load()); QVERIFY(model->rowCount(QModelIndex())); compare(readFile(file1), model); - }; + } void testAdd() { m_bookmarksModel->setSourceData(m_data); // Adding bookmarks compare(m_data, m_bookmarksModel); { int i0 = m_bookmarksModel->rowCount(QModelIndex()); QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://kde.org")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("KDE")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("kde-start-here")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); // m_data << u; m_bookmarksModel->add(u); int i1 = m_bookmarksModel->rowCount(QModelIndex()); QCOMPARE(i0 + 1, i1); QJsonArray copy = m_data; copy << u; compare(copy, m_bookmarksModel); } { // dupe, should not insert // reset m_bookmarksModel->setSourceData(m_data); int i0 = m_bookmarksModel->rowCount(QModelIndex()); QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://plasma-mobile.org")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("Plasma Mobile")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("plasma")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); m_bookmarksModel->add(u); int i2 = m_bookmarksModel->rowCount(QModelIndex()); QCOMPARE(i0, i2); QJsonArray copy = m_data; copy << u; QCOMPARE(copy.count() - 1, m_bookmarksModel->rowCount(QModelIndex())); // QVERIFY(!compare(copy, m_bookmarksModel)); } } void testDataChanged() { // QSignalSpy spy(m_bookmarksModel, SIGNAL(dataChanged(const QModelIndex &, const // QModelIndex &, const QVector &))); QSignalSpy spy(m_bookmarksModel, &UrlModel::rowsInserted); { QJsonObject u; u.insert(m_bookmarksModel->key(UrlModel::url), QStringLiteral("http://kde.org")); u.insert(m_bookmarksModel->key(UrlModel::title), QStringLiteral("KDE")); u.insert(m_bookmarksModel->key(UrlModel::icon), QStringLiteral("kde-start-here")); u.insert(m_bookmarksModel->key(UrlModel::bookmarked), true); u.insert(m_bookmarksModel->key(UrlModel::lastVisited), QDateTime::currentDateTime().toString(Qt::ISODate)); // m_data << u; m_bookmarksModel->add(u); m_bookmarksModel->add(u); } QCOMPARE(spy.count(), 1); QSignalSpy spy2(m_bookmarksModel, &UrlModel::rowsRemoved); m_bookmarksModel->remove("http://kde.org"); QCOMPARE(spy2.count(), 1); } void testRemove() { m_bookmarksModel->setSourceData(m_data); // Remove a bookmark int c1 = m_bookmarksModel->rowCount(QModelIndex()); const QString r = "http://lwn.net"; m_bookmarksModel->remove(r); int c2 = m_bookmarksModel->rowCount(QModelIndex()); QCOMPARE(c1, c2 + 1); QStringList urls; for (int i = 0; i < c2; i++) { auto index = m_bookmarksModel->index(i); const QString r = m_bookmarksModel->data(index, UrlModel::url).toString(); urls << r; } int c3 = m_bookmarksModel->rowCount(QModelIndex()); for (const auto &r : urls) { c3--; m_bookmarksModel->remove(r); QCOMPARE(m_bookmarksModel->rowCount(QModelIndex()), c3); } QCOMPARE(m_bookmarksModel->rowCount(QModelIndex()), 0); } void testNotify() { m_bookmarksModel->setSourceData(m_data); // save to file while waiting for model update... } private: // disable from here for testing just the above private: QJsonArray m_data; QJsonArray m_empty; UrlModel *m_bookmarksModel; }; QTEST_MAIN(UrlModelTest) #include "urlmodeltest.moc" diff --git a/autotests/useragenttest.cpp b/autotests/useragenttest.cpp new file mode 100644 index 0000000..8bc2b7e --- /dev/null +++ b/autotests/useragenttest.cpp @@ -0,0 +1,91 @@ +/* + * Copyright 2019 Jonah BrĂ¼chert + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation; + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include + +#include "useragent.h" + + +class UserAgentTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + + void initTestCase() + { + m_userAgent = new UserAgent(); + } + + void cleanupTestCase() + { + delete m_userAgent; + } + + void desktopUserAgent() + { + m_userAgent->setIsMobile(false); + const QString expectedString = QString("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/%1 Chrome/75.0.3770.116 Desktop Safari/537.36") + .arg(QTWEBENGINE_VERSION_STR); + + QCOMPARE(m_userAgent->userAgent(), expectedString); + } + + void userAgentChanged() + { + QSignalSpy spy(m_userAgent, &UserAgent::userAgentChanged); + m_userAgent->setIsMobile(true); + QCOMPARE(spy.count(), 1); + } + + void mobileUserAgent() + { + m_userAgent->setIsMobile(true); + const QString expectedString = QString("Mozilla/5.0 (Linux; Plasma Mobile, like Android 9.0) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/%1 Chrome/75.0.3770.116 Mobile Safari/537.36") + .arg(QTWEBENGINE_VERSION_STR); + + QCOMPARE(m_userAgent->userAgent(), expectedString); + } + + void setIsMobile() + { + QSignalSpy spy(m_userAgent, &UserAgent::isMobileChanged); + m_userAgent->setIsMobile(false); + QCOMPARE(spy.count(), 1); + m_userAgent->setIsMobile(true); + QCOMPARE(spy.count(), 2); + } + + void isMobile() + { + m_userAgent->setIsMobile(false); + QCOMPARE(m_userAgent->isMobile(), false); + m_userAgent->setIsMobile(true); + QCOMPARE(m_userAgent->isMobile(), true); + } + +private: + UserAgent *m_userAgent; +}; + +QTEST_MAIN(UserAgentTest); + +#include "useragenttest.moc" diff --git a/src/useragent.cpp b/src/useragent.cpp index 8fc3929..02a9a73 100644 --- a/src/useragent.cpp +++ b/src/useragent.cpp @@ -1,32 +1,32 @@ #include "useragent.h" -#include +#include #include UserAgent::UserAgent(QObject *parent) : QObject(parent) { } QString UserAgent::userAgent() const { return QString("Mozilla/5.0 (%1) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/%2 Chrome/75.0.3770.116 %3 Safari/537.36") .arg(m_isMobile ? QStringLiteral("Linux; Plasma Mobile, like Android 9.0") : QStringLiteral("X11; Linux x86_64")) .arg(QTWEBENGINE_VERSION_STR) .arg(m_isMobile ? QStringLiteral("Mobile") : QStringLiteral("Desktop")); } bool UserAgent::isMobile() const { return m_isMobile; } void UserAgent::setIsMobile(bool value) { if (m_isMobile != value) { m_isMobile = value; emit isMobileChanged(); emit userAgentChanged(); } }