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 "createdialog.h"
0008 #include "pluginmanager.h"
0009 
0010 #include <KCollapsibleGroupBox>
0011 
0012 #include <QCheckBox>
0013 #include <QComboBox>
0014 #include <QLineEdit>
0015 #include <QMimeDatabase>
0016 #include <QTest>
0017 
0018 using namespace Kerfuffle;
0019 
0020 class CreateDialogTest : public QObject
0021 {
0022     Q_OBJECT
0023 
0024 private Q_SLOTS:
0025     void testBasicWidgets_data();
0026     void testBasicWidgets();
0027     void testEncryption_data();
0028     void testEncryption();
0029     void testHeaderEncryptionTooltip();
0030 
0031 private:
0032     PluginManager m_pluginManager;
0033 };
0034 
0035 void CreateDialogTest::testBasicWidgets_data()
0036 {
0037     QTest::addColumn<QString>("mimeType");
0038 
0039     QTest::newRow("tar") << QStringLiteral("application/x-tar");
0040     QTest::newRow("targzip") << QStringLiteral("application/x-compressed-tar");
0041     QTest::newRow("tarbzip") << QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.tar.bz2"), QMimeDatabase::MatchExtension).name();
0042     QTest::newRow("tarZ") << QStringLiteral("application/x-tarz");
0043     QTest::newRow("tarxz") << QStringLiteral("application/x-xz-compressed-tar");
0044     QTest::newRow("tarlzma") << QStringLiteral("application/x-lzma-compressed-tar");
0045     QTest::newRow("tarlzip") << QStringLiteral("application/x-lzip-compressed-tar");
0046 
0047     const auto writeMimeTypes = m_pluginManager.supportedWriteMimeTypes();
0048 
0049     if (writeMimeTypes.contains(QLatin1String("application/zip"))) {
0050         QTest::newRow("zip") << QStringLiteral("application/zip");
0051     } else {
0052         qDebug() << "zip format not available in CreateDialog, skipping test.";
0053     }
0054 
0055     if (writeMimeTypes.contains(QLatin1String("application/x-7z-compressed"))) {
0056         QTest::newRow("7z") << QStringLiteral("application/x-7z-compressed");
0057     } else {
0058         qDebug() << "7z format not available in CreateDialog, skipping test.";
0059     }
0060 
0061     if (writeMimeTypes.contains(QLatin1String("application/vnd.rar"))) {
0062         QTest::newRow("rar") << QStringLiteral("application/vnd.rar");
0063     } else {
0064         qDebug() << "rar format not available in CreateDialog, skipping test.";
0065     }
0066 
0067     if (writeMimeTypes.contains(QLatin1String("application/x-lrzip-compressed-tar"))) {
0068         QTest::newRow("tarlrzip") << QStringLiteral("application/x-lrzip-compressed-tar");
0069     } else {
0070         qDebug() << "tar.lrzip format not available in CreateDialog, skipping test.";
0071     }
0072 
0073     if (writeMimeTypes.contains(QLatin1String("application/x-tzo"))) {
0074         QTest::newRow("tarlzop") << QStringLiteral("application/x-tzo");
0075     } else {
0076         qDebug() << "tar.lzo format not available in CreateDialog, skipping test.";
0077     }
0078 }
0079 
0080 void CreateDialogTest::testBasicWidgets()
0081 {
0082     CreateDialog *dialog = new CreateDialog(nullptr, QString(), QUrl());
0083 
0084     auto fileNameLineEdit = dialog->findChild<QLineEdit *>(QStringLiteral("filenameLineEdit"));
0085     auto archiveTypeComboBox = dialog->findChild<QComboBox *>(QStringLiteral("mimeComboBox"));
0086     QVERIFY(fileNameLineEdit);
0087     QVERIFY(archiveTypeComboBox);
0088 
0089     QFETCH(QString, mimeType);
0090     const QMimeType mime = QMimeDatabase().mimeTypeForName(mimeType);
0091 
0092     // Test if combobox is updated when user enters a filename with suffix.
0093     fileNameLineEdit->setText(QStringLiteral("basename.%1").arg(mime.preferredSuffix()));
0094     QCOMPARE(archiveTypeComboBox->currentText(), mime.comment());
0095 
0096     // Test if suffix is added correctly when the user selects an archive type in combobox.
0097     fileNameLineEdit->setText(QStringLiteral("basename"));
0098     archiveTypeComboBox->setCurrentText(mime.comment());
0099     QCOMPARE(QFileInfo(dialog->selectedUrl().toLocalFile()).fileName(), QStringLiteral("basename.%1").arg(mime.preferredSuffix()));
0100 }
0101 
0102 void CreateDialogTest::testEncryption_data()
0103 {
0104     QTest::addColumn<QString>("filter");
0105     QTest::addColumn<bool>("isEncryptionAvailable");
0106     QTest::addColumn<bool>("isHeaderEncryptionAvailable");
0107 
0108     QTest::newRow("tar") << QStringLiteral("application/x-compressed-tar") << false << false;
0109 
0110     if (m_pluginManager.supportedWriteMimeTypes().contains(QLatin1String("application/zip"))) {
0111         QTest::newRow("zip") << QStringLiteral("application/zip") << true << false;
0112     } else {
0113         qDebug() << "zip format not available in CreateDialog, skipping test.";
0114     }
0115 
0116     if (m_pluginManager.supportedWriteMimeTypes().contains(QLatin1String("application/x-7z-compressed"))) {
0117         QTest::newRow("7z") << QStringLiteral("application/x-7z-compressed") << true << true;
0118     } else {
0119         qDebug() << "7z format not available in CreateDialog, skipping test.";
0120     }
0121 
0122     if (m_pluginManager.supportedWriteMimeTypes().contains(QLatin1String("application/vnd.rar"))) {
0123         QTest::newRow("rar") << QStringLiteral("application/vnd.rar") << true << true;
0124     } else {
0125         qDebug() << "rar format not available in CreateDialog, skipping test.";
0126     }
0127 }
0128 
0129 void CreateDialogTest::testEncryption()
0130 {
0131     CreateDialog *dialog = new CreateDialog(nullptr, QString(), QUrl());
0132 
0133     QFETCH(QString, filter);
0134     QFETCH(bool, isEncryptionAvailable);
0135     QFETCH(bool, isHeaderEncryptionAvailable);
0136 
0137     auto collapsibleEncryption = dialog->findChild<KCollapsibleGroupBox *>(QStringLiteral("collapsibleEncryption"));
0138     auto encryptHeaderCheckBox = dialog->findChild<QCheckBox *>(QStringLiteral("encryptHeaderCheckBox"));
0139     QVERIFY(collapsibleEncryption);
0140     QVERIFY(encryptHeaderCheckBox);
0141 
0142     QVERIFY(dialog->setMimeType(filter));
0143 
0144     // Encryption is initially not enabled.
0145     QVERIFY(!dialog->isEncryptionEnabled());
0146     QVERIFY(!dialog->isHeaderEncryptionEnabled());
0147 
0148     if (isEncryptionAvailable) {
0149         QVERIFY(dialog->isEncryptionAvailable());
0150 
0151         collapsibleEncryption->setExpanded(true);
0152         QVERIFY(dialog->isEncryptionEnabled());
0153 
0154         if (isHeaderEncryptionAvailable) {
0155             QVERIFY(dialog->isHeaderEncryptionAvailable());
0156             // Header encryption is enabled by default, if available.
0157             QVERIFY(dialog->isHeaderEncryptionEnabled());
0158 
0159             encryptHeaderCheckBox->setChecked(false);
0160             QVERIFY(!dialog->isHeaderEncryptionEnabled());
0161         } else {
0162             QVERIFY(!dialog->isHeaderEncryptionAvailable());
0163         }
0164 
0165         collapsibleEncryption->setExpanded(false);
0166         QVERIFY(!dialog->isEncryptionEnabled());
0167         QVERIFY(!dialog->isHeaderEncryptionEnabled());
0168     } else {
0169         QVERIFY(!dialog->isEncryptionAvailable());
0170         QVERIFY(!dialog->isEncryptionEnabled());
0171         QVERIFY(!dialog->isHeaderEncryptionAvailable());
0172         QVERIFY(!dialog->isHeaderEncryptionEnabled());
0173     }
0174 }
0175 
0176 void CreateDialogTest::testHeaderEncryptionTooltip()
0177 {
0178     if (!m_pluginManager.supportedWriteMimeTypes().contains(QLatin1String("application/zip"))) {
0179         QSKIP("zip format not available in CreateDialog, skipping test.", SkipSingle);
0180     }
0181 
0182     CreateDialog *dialog = new CreateDialog(nullptr, QString(), QUrl());
0183 
0184     auto collapsibleEncryption = dialog->findChild<KCollapsibleGroupBox *>(QStringLiteral("collapsibleEncryption"));
0185     auto encryptHeaderCheckBox = dialog->findChild<QCheckBox *>(QStringLiteral("encryptHeaderCheckBox"));
0186     QVERIFY(collapsibleEncryption);
0187     QVERIFY(encryptHeaderCheckBox);
0188 
0189     collapsibleEncryption->setExpanded(true);
0190 
0191     QVERIFY(dialog->setMimeType(QStringLiteral("application/zip")));
0192     QVERIFY(!encryptHeaderCheckBox->toolTip().isEmpty());
0193 
0194     // If we set a tar filter after the zip one, ensure that the old zip's tooltip is not shown anymore.
0195     QVERIFY(dialog->setMimeType(QStringLiteral("application/x-compressed-tar")));
0196     QVERIFY(encryptHeaderCheckBox->toolTip().isEmpty());
0197 }
0198 
0199 QTEST_MAIN(CreateDialogTest)
0200 
0201 #include "createdialogtest.moc"