File indexing completed on 2024-05-12 05:50:10

0001 /*
0002     SPDX-FileCopyrightText: 2016 Elvis Angelaccio <elvis.angelaccio@kde.org>
0003 
0004     SPDX-License-Identifier: BSD-2-Clause
0005 */
0006 
0007 #include "archiveentry.h"
0008 #include "jobs.h"
0009 #include "pluginmanager.h"
0010 #include "testhelper.h"
0011 
0012 #include <QMimeDatabase>
0013 #include <QTest>
0014 
0015 using namespace Kerfuffle;
0016 
0017 class DeleteTest : public QObject
0018 {
0019     Q_OBJECT
0020 
0021 private Q_SLOTS:
0022     void testDelete_data();
0023     void testDelete();
0024 
0025 private:
0026     PluginManager m_pluginManager;
0027 };
0028 
0029 QTEST_GUILESS_MAIN(DeleteTest)
0030 
0031 void DeleteTest::testDelete_data()
0032 {
0033     QTest::addColumn<QString>("archiveName");
0034     QTest::addColumn<Plugin *>("plugin");
0035     QTest::addColumn<QVector<Archive::Entry *>>("targetEntries");
0036     QTest::addColumn<uint>("expectedEntriesCount");
0037     QTest::addColumn<uint>("expectedRemainingEntriesCount");
0038 
0039     // Repeat the same test case for each format and for each plugin supporting the format.
0040     const QStringList formats = TestHelper::testFormats();
0041     for (const QString &format : formats) {
0042         const QString filename = QStringLiteral("test.%1").arg(format);
0043         const auto mime = QMimeDatabase().mimeTypeForFile(filename, QMimeDatabase::MatchExtension);
0044 
0045         const auto plugins = m_pluginManager.preferredWritePluginsFor(mime);
0046         for (const auto plugin : plugins) {
0047             QTest::newRow(qPrintable(QStringLiteral("delete a single file (%1, %2)").arg(format, plugin->metaData().pluginId())))
0048                 << filename << plugin << QVector<Archive::Entry *>{new Archive::Entry(this, QStringLiteral("dir1/a.txt"))} << 13u << 12u;
0049 
0050             QTest::newRow(qPrintable(QStringLiteral("delete multiple files (%1, %2)").arg(format, plugin->metaData().pluginId())))
0051                 << filename << plugin
0052                 << QVector<Archive::Entry *>{new Archive::Entry(this, QStringLiteral("a.txt")), new Archive::Entry(this, QStringLiteral("dir1/b.txt"))} << 13u
0053                 << 11u;
0054         }
0055     }
0056 }
0057 
0058 void DeleteTest::testDelete()
0059 {
0060     QTemporaryDir temporaryDir;
0061 
0062     QFETCH(QString, archiveName);
0063     const QString archivePath = QStringLiteral("%1/%2").arg(temporaryDir.path(), archiveName);
0064     QVERIFY(QFile::copy(QFINDTESTDATA(QStringLiteral("data/%1").arg(archiveName)), archivePath));
0065 
0066     QFETCH(Plugin *, plugin);
0067     QVERIFY(plugin);
0068 
0069     auto loadJob = Archive::load(archivePath, plugin);
0070     QVERIFY(loadJob);
0071     loadJob->setAutoDelete(false);
0072 
0073     TestHelper::startAndWaitForResult(loadJob);
0074     auto archive = loadJob->archive();
0075     QVERIFY(archive);
0076 
0077     if (!archive->isValid()) {
0078         QSKIP("Could not find a plugin to handle the archive. Skipping test.", SkipSingle);
0079     }
0080 
0081     QFETCH(uint, expectedEntriesCount);
0082     QCOMPARE(archive->numberOfEntries(), expectedEntriesCount);
0083 
0084     QFETCH(QVector<Archive::Entry *>, targetEntries);
0085     auto deleteJob = archive->deleteFiles(targetEntries);
0086     QVERIFY(deleteJob);
0087     TestHelper::startAndWaitForResult(deleteJob);
0088 
0089     QFETCH(uint, expectedRemainingEntriesCount);
0090     QCOMPARE(archive->numberOfEntries(), expectedRemainingEntriesCount);
0091 
0092     loadJob->deleteLater();
0093     archive->deleteLater();
0094 }
0095 
0096 #include "deletetest.moc"