File indexing completed on 2024-05-12 16:06:06

0001 /*
0002     SPDX-FileCopyrightText: 2018 Intevation GmbH <intevation@intevation.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <QTest>
0008 
0009 #include "../settings_core.h"
0010 #include "core/document.h"
0011 #include <QMap>
0012 #include <QMimeDatabase>
0013 #include <QMimeType>
0014 #include <QTemporaryFile>
0015 #include <core/form.h>
0016 #include <core/page.h>
0017 
0018 class VisibilityTest : public QObject
0019 {
0020     Q_OBJECT
0021 
0022 private Q_SLOTS:
0023     void initTestCase();
0024     void cleanupTestCase();
0025 
0026     void testJavaScriptVisibility();
0027     void testSaveLoad();
0028     void testActionVisibility();
0029 
0030 private:
0031     void verifyTargetStates(bool visible);
0032 
0033     Okular::Document *m_document;
0034     QMap<QString, Okular::FormField *> m_fields;
0035 };
0036 
0037 void VisibilityTest::initTestCase()
0038 {
0039     Okular::SettingsCore::instance(QStringLiteral("visibilitytest"));
0040     m_document = new Okular::Document(nullptr);
0041 
0042     const QString testFile = QStringLiteral(KDESRCDIR "data/visibilitytest.pdf");
0043     QMimeDatabase db;
0044     const QMimeType mime = db.mimeTypeForFile(testFile);
0045     QCOMPARE(m_document->openDocument(testFile, QUrl(), mime), Okular::Document::OpenSuccess);
0046 
0047     // The test document has four buttons:
0048     // HideScriptButton -> Hides targets with JavaScript
0049     // ShowScriptButton -> Shows targets with JavaScript
0050     // HideActionButton -> Hides targets with HideAction
0051     // ShowActionButton -> Shows targets with HideAction
0052     //
0053     // The target fields are:
0054     // TargetButton TargetText TargetCheck TargetDropDown TargetRadio
0055     //
0056     // With two radio buttons named TargetRadio.
0057 
0058     const Okular::Page *page = m_document->page(0);
0059     const QList<Okular::FormField *> pageFormFields = page->formFields();
0060     for (Okular::FormField *ff : pageFormFields) {
0061         m_fields.insert(ff->name(), ff);
0062     }
0063 }
0064 
0065 void VisibilityTest::cleanupTestCase()
0066 {
0067     m_document->closeDocument();
0068     delete m_document;
0069 }
0070 
0071 void VisibilityTest::verifyTargetStates(bool visible)
0072 {
0073     QCOMPARE(m_fields[QStringLiteral("TargetButton")]->isVisible(), visible);
0074     QCOMPARE(m_fields[QStringLiteral("TargetText")]->isVisible(), visible);
0075     QCOMPARE(m_fields[QStringLiteral("TargetCheck")]->isVisible(), visible);
0076     QCOMPARE(m_fields[QStringLiteral("TargetDropDown")]->isVisible(), visible);
0077 
0078     // Radios do not properly inherit a name from the parent group so
0079     // this does not work yet (And would probably need some list handling).
0080     // QCOMPARE( m_fields[QStringLiteral( "TargetRadio" )].isVisible(), visible );
0081 }
0082 
0083 void VisibilityTest::testJavaScriptVisibility()
0084 {
0085     auto hideBtn = m_fields[QStringLiteral("HideScriptButton")];
0086     auto showBtn = m_fields[QStringLiteral("ShowScriptButton")];
0087 
0088     // We start with all fields visible
0089     verifyTargetStates(true);
0090 
0091     m_document->processAction(hideBtn->activationAction());
0092 
0093     // Now all should be hidden
0094     verifyTargetStates(false);
0095 
0096     // And show again
0097     m_document->processAction(showBtn->activationAction());
0098     verifyTargetStates(true);
0099 }
0100 
0101 void VisibilityTest::testSaveLoad()
0102 {
0103     auto hideBtn = m_fields[QStringLiteral("HideScriptButton")];
0104     auto showBtn = m_fields[QStringLiteral("ShowScriptButton")];
0105 
0106     // We start with all fields visible
0107     verifyTargetStates(true);
0108 
0109     m_document->processAction(hideBtn->activationAction());
0110 
0111     // Now all should be hidden
0112     verifyTargetStates(false);
0113 
0114     // Save the changed states
0115     QTemporaryFile saveFile(QStringLiteral("%1/okrXXXXXX.pdf").arg(QDir::tempPath()));
0116     QVERIFY(saveFile.open());
0117     saveFile.close();
0118 
0119     QVERIFY(m_document->saveChanges(saveFile.fileName()));
0120 
0121     auto newDoc = new Okular::Document(nullptr);
0122 
0123     QMimeDatabase db;
0124     const QMimeType mime = db.mimeTypeForFile(saveFile.fileName());
0125     QCOMPARE(newDoc->openDocument(saveFile.fileName(), QUrl(), mime), Okular::Document::OpenSuccess);
0126 
0127     const Okular::Page *page = newDoc->page(0);
0128 
0129     bool anyChecked = false; // Saveguard against accidental test passing here ;-)
0130     const QList<Okular::FormField *> pageFormFields = page->formFields();
0131     for (Okular::FormField *ff : pageFormFields) {
0132         if (ff->name().startsWith(QStringLiteral("Target"))) {
0133             QVERIFY(!ff->isVisible());
0134             anyChecked = true;
0135         }
0136     }
0137     QVERIFY(anyChecked);
0138 
0139     newDoc->closeDocument();
0140     delete newDoc;
0141 
0142     // Restore the state of the member document
0143     m_document->processAction(showBtn->activationAction());
0144 }
0145 
0146 void VisibilityTest::testActionVisibility()
0147 {
0148     auto hideBtn = m_fields[QStringLiteral("HideActionButton")];
0149     auto showBtn = m_fields[QStringLiteral("ShowActionButton")];
0150 
0151     verifyTargetStates(true);
0152 
0153     m_document->processAction(hideBtn->activationAction());
0154 
0155     verifyTargetStates(false);
0156 
0157     m_document->processAction(showBtn->activationAction());
0158 
0159     verifyTargetStates(true);
0160 }
0161 
0162 QTEST_MAIN(VisibilityTest)
0163 #include "visibilitytest.moc"