diff --git a/autotests/urltest.cpp b/autotests/urltest.cpp --- a/autotests/urltest.cpp +++ b/autotests/urltest.cpp @@ -36,74 +36,122 @@ { const auto gdriveUrl = [](const QString &path) { QUrl url; - url.setScheme(QStringLiteral("gdrive")); + url.setScheme(GDriveUrl::Scheme); url.setPath(path); return url; }; QTest::addColumn("url"); QTest::addColumn("expectedToString"); QTest::addColumn("expectedAccount"); QTest::addColumn("expectedParentPath"); + QTest::addColumn("expectedIsTrashed"); + QTest::addColumn("expectedIsTopLevel"); QTest::addColumn("expectedPathComponents"); + QTest::addColumn("expectedFilename"); QTest::newRow("root url") << gdriveUrl(QStringLiteral("/")) << QStringLiteral("gdrive:/") << QString() << QString() - << QStringList(); + << false + << false + << QStringList() + << ""; QTest::newRow("account root url") << gdriveUrl(QStringLiteral("/foo@gmail.com")) << QStringLiteral("gdrive:/foo@gmail.com") << QStringLiteral("foo@gmail.com") << QStringLiteral("/") - << QStringList {QStringLiteral("foo@gmail.com")}; + << false + << false + << QStringList {QStringLiteral("foo@gmail.com")} + << QStringLiteral("foo@gmail.com"); + + QTest::newRow("account trash url") + << gdriveUrl(QStringLiteral("/foo@gmail.com/") + GDriveUrl::TrashDir) + << QStringLiteral("gdrive:/foo@gmail.com/") + GDriveUrl::TrashDir + << QStringLiteral("foo@gmail.com") + << QStringLiteral("/foo@gmail.com") + << false + << true + << QStringList {QStringLiteral("foo@gmail.com"), GDriveUrl::TrashDir} + << GDriveUrl::TrashDir; + + QTest::newRow("file in trash") + << gdriveUrl(QStringLiteral("/foo@gmail.com/") + GDriveUrl::TrashDir + ("/baz.txt")) + << QStringLiteral("gdrive:/foo@gmail.com/") + GDriveUrl::TrashDir + ("/baz.txt") + << QStringLiteral("foo@gmail.com") + << QStringLiteral("/foo@gmail.com/") + GDriveUrl::TrashDir + << true + << false + << QStringList {QStringLiteral("foo@gmail.com"), GDriveUrl::TrashDir, QStringLiteral("baz.txt")} + << QStringLiteral("baz.txt"); QTest::newRow("file in account root") << gdriveUrl(QStringLiteral("/foo@gmail.com/bar.txt")) << QStringLiteral("gdrive:/foo@gmail.com/bar.txt") << QStringLiteral("foo@gmail.com") << QStringLiteral("/foo@gmail.com") - << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar.txt")}; + << false + << true + << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar.txt")} + << QStringLiteral("bar.txt"); QTest::newRow("folder in account root - no trailing slash") << gdriveUrl(QStringLiteral("/foo@gmail.com/bar")) << QStringLiteral("gdrive:/foo@gmail.com/bar") << QStringLiteral("foo@gmail.com") << QStringLiteral("/foo@gmail.com") - << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")}; + << false + << true + << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")} + << QStringLiteral("bar"); + QTest::newRow("folder in account root - trailing slash") << gdriveUrl(QStringLiteral("/foo@gmail.com/bar/")) << QStringLiteral("gdrive:/foo@gmail.com/bar/") << QStringLiteral("foo@gmail.com") << QStringLiteral("/foo@gmail.com") - << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")}; + << false + << true + << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")} + << QStringLiteral("bar"); QTest::newRow("file in subfolder") << gdriveUrl(QStringLiteral("/foo@gmail.com/bar/baz.txt")) << QStringLiteral("gdrive:/foo@gmail.com/bar/baz.txt") << QStringLiteral("foo@gmail.com") << QStringLiteral("/foo@gmail.com/bar") - << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar"), QStringLiteral("baz.txt")}; + << false + << false + << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar"), QStringLiteral("baz.txt")} + << QStringLiteral("baz.txt"); } void UrlTest::testGDriveUrl() { QFETCH(QUrl, url); + const auto gdriveUrl = GDriveUrl(url); + QFETCH(QString, expectedToString); - QCOMPARE(url.toString(), expectedToString); + QCOMPARE(gdriveUrl.url(), QUrl(expectedToString)); QFETCH(QString, expectedAccount); QFETCH(QString, expectedParentPath); + QFETCH(bool, expectedIsTrashed); + QFETCH(bool, expectedIsTopLevel); QFETCH(QStringList, expectedPathComponents); - - const auto gdriveUrl = GDriveUrl(url); + QFETCH(QString, expectedFilename); QCOMPARE(gdriveUrl.account(), expectedAccount); QCOMPARE(gdriveUrl.parentPath(), expectedParentPath); QCOMPARE(gdriveUrl.pathComponents(), expectedPathComponents); + QCOMPARE(gdriveUrl.isTrashed(), expectedIsTrashed); + QCOMPARE(gdriveUrl.isTopLevel(), expectedIsTopLevel); + QCOMPARE(gdriveUrl.filename(), expectedFilename); if (expectedPathComponents.isEmpty()) { QVERIFY(gdriveUrl.isRoot()); diff --git a/src/gdrivehelper.cpp b/src/gdrivehelper.cpp --- a/src/gdrivehelper.cpp +++ b/src/gdrivehelper.cpp @@ -136,7 +136,7 @@ KIO::UDSEntry GDriveHelper::trash() { KIO::UDSEntry trashEntry; - trashEntry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("trash")); + trashEntry.insert(KIO::UDSEntry::UDS_NAME, GDriveUrl::TrashDir); trashEntry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, i18n("Trash")); trashEntry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); trashEntry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("user-trash")); diff --git a/src/gdriveurl.h b/src/gdriveurl.h --- a/src/gdriveurl.h +++ b/src/gdriveurl.h @@ -29,11 +29,18 @@ explicit GDriveUrl(const QUrl &url); QString account() const; + QString filename() const; bool isRoot() const; bool isAccountRoot() const; + bool isTopLevel() const; + bool isTrashDir() const; + bool isTrashed() const; + QUrl url() const; QString parentPath() const; QStringList pathComponents() const; + static const QString Scheme; + static const QString TrashDir; private: QUrl m_url; QStringList m_components; diff --git a/src/gdriveurl.cpp b/src/gdriveurl.cpp --- a/src/gdriveurl.cpp +++ b/src/gdriveurl.cpp @@ -20,6 +20,9 @@ #include "gdriveurl.h" +const QString GDriveUrl::Scheme = QStringLiteral("gdrive"); +const QString GDriveUrl::TrashDir = QStringLiteral("trash"); + GDriveUrl::GDriveUrl(const QUrl &url) : m_url(url) { @@ -36,6 +39,15 @@ return m_components.at(0); } +QString GDriveUrl::filename() const +{ + if (m_components.isEmpty()) { + return QString(); + } + + return m_components.last(); +} + bool GDriveUrl::isRoot() const { return m_components.isEmpty(); @@ -46,6 +58,26 @@ return m_components.length() == 1; } +bool GDriveUrl::isTopLevel() const +{ + return m_components.length() == 2; +} + +bool GDriveUrl::isTrashDir() const +{ + return m_components.length() == 2 && m_components.at(1) == TrashDir; +} + +bool GDriveUrl::isTrashed() const +{ + return m_components.length() > 2 && m_components.at(1) == TrashDir; +} + +QUrl GDriveUrl::url() const +{ + return m_url; +} + QString GDriveUrl::parentPath() const { if (isRoot()) {