File indexing completed on 2024-05-12 05:52:46

0001 /*
0002  * SPDX-License-Identifier: GPL-3.0-or-later
0003  * SPDX-FileCopyrightText: 2020 Johan Ouwerkerk <jm.ouwerkerk@gmail.com>
0004  */
0005 #include "account/actions_p.h"
0006 
0007 #include "../test-utils/output.h"
0008 #include "../../test-utils/spy.h"
0009 
0010 #include <QFile>
0011 #include <QSet>
0012 #include <QSignalSpy>
0013 #include <QString>
0014 #include <QTest>
0015 #include <QUuid>
0016 #include <QtDebug>
0017 
0018 static QString existingAccountsIni(QLatin1String("existing-accounts.ini"));
0019 static QString emptyAccountsIni(QLatin1String("empty-accounts.ini"));
0020 
0021 class DeleteAccountsTest: public QObject
0022 {
0023     Q_OBJECT
0024 private Q_SLOTS:
0025     void removeAccounts(void);
0026     void removeAccounts_data(void);
0027 };
0028 
0029 static void define_test_data(void)
0030 {
0031     QTest::addColumn<QSet<QUuid>>("ids");
0032     QTest::addColumn<QString>("accounts");
0033     QTest::addColumn<QString>("isolated");
0034     QTest::addColumn<QString>("expected");
0035 }
0036 
0037 static void define_test_case(const char *label, const QString &accounts, const QString &isolated, const QString &expected, const QSet<QUuid> &toRemove)
0038 {
0039     QTest::newRow(label) << toRemove << accounts << isolated << expected;
0040 }
0041 
0042 void DeleteAccountsTest::removeAccounts(void)
0043 {
0044     QFETCH(QSet<QUuid>, ids);
0045     QFETCH(QString, accounts);
0046     QFETCH(QString, isolated);
0047     QFETCH(QString, expected);
0048 
0049     QVERIFY2(test::copyResourceAsWritable(accounts, isolated), "accounts INI resource should be available as file");
0050 
0051     bool actionRun = false;
0052     const QString actual = test::path(isolated);
0053     const accounts::SettingsProvider settings([&actual, &actionRun](const accounts::PersistenceAction &action) -> void
0054     {
0055         QSettings data(actual, QSettings::IniFormat);
0056         actionRun = true;
0057         action(data);
0058     });
0059 
0060     accounts::DeleteAccounts uut(settings, ids);
0061     QSignalSpy invalidSettings(&uut, &accounts::DeleteAccounts::invalid);
0062     QSignalSpy jobFinished(&uut, &accounts::DeleteAccounts::finished);
0063 
0064     uut.run();
0065 
0066     QVERIFY2(test::signal_eventually_emitted_once(jobFinished), "job should be finished");
0067     QVERIFY2(actionRun, "accounts action should have run");
0068     QCOMPARE(invalidSettings.count(), 0);
0069 
0070     QFile result(actual);
0071     QVERIFY2(result.exists(), "accounts file should still exist");
0072     QCOMPARE(test::slurp(actual), test::slurp(expected));
0073 }
0074 
0075 void DeleteAccountsTest::removeAccounts_data(void)
0076 {
0077     static const QString existing(QLatin1String(":/delete-accounts/sample-accounts.ini"));
0078     static const QString empty(QLatin1String(":/delete-accounts/empty-accounts.ini"));
0079     static const QString hotp(QLatin1String(":/delete-accounts/only-hotp-left.ini"));
0080     static const QString totp(QLatin1String(":/delete-accounts/only-totp-left.ini"));
0081 
0082     define_test_data();
0083     define_test_case("remove hotp from sample accounts", existing, QLatin1String("remove-hotp-from-sample.ini"), totp, QSet<QUuid>() << QUuid(QLatin1String("072a645d-6c26-57cc-81eb-d9ef3b9b39e2")) );
0084     define_test_case("remove totp from sample accounts", existing, QLatin1String("remove-totp-from-sample.ini"), hotp, QSet<QUuid>() << QUuid(QLatin1String("534cc72e-e9ec-5e39-a1ff-9f017c9be8cc")));
0085     define_test_case("remove both from sample accounts", existing, QLatin1String("remove-both-from-sample.ini"), empty, QSet<QUuid>() << QUuid(QLatin1String("072a645d-6c26-57cc-81eb-d9ef3b9b39e2")) << QUuid(QLatin1String("534cc72e-e9ec-5e39-a1ff-9f017c9be8cc")));
0086     define_test_case("remove hotp from totp only account", totp, QLatin1String("remove-hotp-from-totp.ini"), totp, QSet<QUuid>() << QUuid(QLatin1String("072a645d-6c26-57cc-81eb-d9ef3b9b39e2")));
0087     define_test_case("remove totp from hotp only account", hotp, QLatin1String("remove-totp-from-hotp.ini"), hotp, QSet<QUuid>() << QUuid(QLatin1String("534cc72e-e9ec-5e39-a1ff-9f017c9be8cc")));
0088     define_test_case("remove both from empty accounts", empty, QLatin1String("remove-both-from-empty.ini"), empty, QSet<QUuid>() << QUuid(QLatin1String("072a645d-6c26-57cc-81eb-d9ef3b9b39e2")) << QUuid(QLatin1String("534cc72e-e9ec-5e39-a1ff-9f017c9be8cc")));
0089     define_test_case("remove bogus accounts from sample accounts", existing, QLatin1String("remove-bogus-from-sample.ini"), existing, QSet<QUuid>() << QUuid(QLatin1String("1885b51f-c4cf-448d-8cad-53306a1f558e")));
0090     define_test_case("remove nothing from sample accounts", existing, QLatin1String("remove-nothing-from-sample.ini"), existing, QSet<QUuid>());
0091 }
0092 
0093 QTEST_MAIN(DeleteAccountsTest)
0094 
0095 #include "delete-accounts.moc"