Improve Database and CLI tests

This commit is contained in:
Jonathan White 2019-10-20 18:23:11 -04:00
parent 744b4abce8
commit 1e694271a3
9 changed files with 127 additions and 91 deletions

View file

@ -23,7 +23,6 @@
#include "config-keepassx-tests.h"
#include "core/Metadata.h"
#include "core/Tools.h"
#include "crypto/Crypto.h"
#include "format/KeePass2Writer.h"
#include "keys/PasswordKey.h"
@ -31,6 +30,8 @@
QTEST_GUILESS_MAIN(TestDatabase)
static QString dbFileName = QStringLiteral(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx");
void TestDatabase::initTestCase()
{
QVERIFY(Crypto::init());
@ -45,7 +46,7 @@ void TestDatabase::testOpen()
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("a"));
bool ok = db->open(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"), key);
bool ok = db->open(dbFileName, key);
QVERIFY(ok);
QVERIFY(db->isInitialized());
@ -57,16 +58,8 @@ void TestDatabase::testOpen()
void TestDatabase::testSave()
{
QByteArray data;
QFile sourceDbFile(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"));
QVERIFY(sourceDbFile.open(QIODevice::ReadOnly));
QVERIFY(Tools::readAllFromDevice(&sourceDbFile, data));
sourceDbFile.close();
TemporaryFile tempFile;
QVERIFY(tempFile.open());
QCOMPARE(tempFile.write(data), static_cast<qint64>((data.size())));
tempFile.close();
QVERIFY(tempFile.copyFromFile(dbFileName));
auto db = QSharedPointer<Database>::create();
auto key = QSharedPointer<CompositeKey>::create();
@ -79,15 +72,63 @@ void TestDatabase::testSave()
// Test safe saves
db->metadata()->setName("test");
QVERIFY(db->isModified());
// Test unsafe saves
QVERIFY2(db->save(&error, false, false), error.toLatin1());
QVERIFY2(db->save(&error), error.toLatin1());
QVERIFY(!db->isModified());
// Test unsafe saves
db->metadata()->setName("test2");
QVERIFY2(db->save(&error, false, false), error.toLatin1());
QVERIFY(!db->isModified());
// Test save backups
db->metadata()->setName("test3");
QVERIFY2(db->save(&error, true, true), error.toLatin1());
QVERIFY(!db->isModified());
// Confirm backup exists and then delete it
auto re = QRegularExpression("(\\.[^.]+)$");
auto match = re.match(tempFile.fileName());
auto backupFilePath = tempFile.fileName();
backupFilePath = backupFilePath.replace(re, "") + ".old" + match.captured(1);
QVERIFY(QFile::exists(backupFilePath));
QFile::remove(backupFilePath);
QVERIFY(!QFile::exists(backupFilePath));
}
void TestDatabase::testSignals()
{
TemporaryFile tempFile;
QVERIFY(tempFile.copyFromFile(dbFileName));
auto db = QSharedPointer<Database>::create();
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("a"));
QSignalSpy spyFilePathChanged(db.data(), SIGNAL(filePathChanged(const QString&, const QString&)));
QString error;
bool ok = db->open(tempFile.fileName(), key, &error);
QVERIFY(ok);
QCOMPARE(spyFilePathChanged.count(), 1);
QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
db->metadata()->setName("test1");
QTRY_COMPARE(spyModified.count(), 1);
QSignalSpy spySaved(db.data(), SIGNAL(databaseSaved()));
QVERIFY(db->save(&error));
QCOMPARE(spySaved.count(), 1);
QSignalSpy spyFileChanged(db.data(), SIGNAL(databaseFileChanged()));
QVERIFY(tempFile.copyFromFile(dbFileName));
QTRY_COMPARE(spyFileChanged.count(), 1);
QTRY_VERIFY(!db->isModified());
db->metadata()->setName("test2");
QTRY_VERIFY(db->isModified());
QSignalSpy spyDiscarded(db.data(), SIGNAL(databaseDiscarded()));
QVERIFY(db->open(tempFile.fileName(), key, &error));
QCOMPARE(spyDiscarded.count(), 1);
}
void TestDatabase::testEmptyRecycleBinOnDisabled()