add tests for project
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
#include <QCoreApplication>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonObject>
|
||||
#include <QLocale>
|
||||
#include <QSettings>
|
||||
#include <QSignalSpy>
|
||||
#include <QTemporaryDir>
|
||||
#include <QtTest>
|
||||
|
||||
#include "context.h"
|
||||
#include "data/permission.h"
|
||||
#include "data/role.h"
|
||||
#include "data/user.h"
|
||||
#include "imetadataplugin.h"
|
||||
#include "permissionevaluator.h"
|
||||
|
||||
class CoreTests : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void init()
|
||||
{
|
||||
Context::instance().setCurrentUser({});
|
||||
}
|
||||
|
||||
void cleanup()
|
||||
{
|
||||
Context::instance().setCurrentUser({});
|
||||
}
|
||||
|
||||
void metadataRejectsMissingObject()
|
||||
{
|
||||
QVERIFY(!IMetaDataPlugin::loadBaseMetaData({}));
|
||||
QVERIFY(!IMetaDataPlugin::loadBaseMetaData(QJsonObject{{"MetaData", QStringLiteral("invalid")}}));
|
||||
}
|
||||
|
||||
void metadataUsesDefaultLocaleAndExtractsSchema()
|
||||
{
|
||||
const QJsonObject metadata{
|
||||
{"id", QStringLiteral("EXAMPLE")},
|
||||
{"schemaVersion", 2},
|
||||
{"name", QJsonObject{{"default", QStringLiteral("Example plugin")}}},
|
||||
{"description", QJsonObject{{"default", QStringLiteral("Example description")}}},
|
||||
{"sql", QJsonArray{QStringLiteral("CREATE TABLE example (id INTEGER)")}},
|
||||
{"dependencies", QJsonArray{QStringLiteral("CORE")}}
|
||||
};
|
||||
|
||||
const MetaDataPtr result = IMetaDataPlugin::loadBaseMetaData(QJsonObject{{"MetaData", metadata}});
|
||||
|
||||
QVERIFY(result);
|
||||
QCOMPARE(result->getId(), QStringLiteral("EXAMPLE"));
|
||||
QCOMPARE(result->getName(), QStringLiteral("Example plugin"));
|
||||
QCOMPARE(result->getDescription(), QStringLiteral("Example description"));
|
||||
QCOMPARE(result->getSchemaVersion(), 2);
|
||||
QCOMPARE(result->getSchemas(), QStringList{QStringLiteral("CREATE TABLE example (id INTEGER)")});
|
||||
QCOMPARE(result->getDependsOn(), QStringList{QStringLiteral("CORE")});
|
||||
}
|
||||
|
||||
void metadataPrefersSystemLocale()
|
||||
{
|
||||
const QString locale = QLocale::system().name();
|
||||
const QJsonObject metadata{
|
||||
{"id", QStringLiteral("LOCALIZED")},
|
||||
{"name", QJsonObject{{"default", QStringLiteral("Fallback")}, {locale, QStringLiteral("Localized")}}},
|
||||
{"description", QJsonObject{{"default", QStringLiteral("Fallback description")}}}
|
||||
};
|
||||
|
||||
const MetaDataPtr result = IMetaDataPlugin::loadBaseMetaData(QJsonObject{{"MetaData", metadata}});
|
||||
|
||||
QVERIFY(result);
|
||||
QCOMPARE(result->getName(), QStringLiteral("Localized"));
|
||||
QCOMPARE(result->getDescription(), QStringLiteral("Fallback description"));
|
||||
}
|
||||
|
||||
void permissionDeniedWithoutUser()
|
||||
{
|
||||
PermissionEvaluator evaluator;
|
||||
QSignalSpy denied(&evaluator, &PermissionEvaluator::permissionDenied);
|
||||
|
||||
QVERIFY(!evaluator.hasPermission(QStringLiteral("SHOP"), QStringLiteral("READ")));
|
||||
QCOMPARE(denied.count(), 0);
|
||||
}
|
||||
|
||||
void administratorBypassesPermissionLookup()
|
||||
{
|
||||
auto user = QSharedPointer<User>::create();
|
||||
user->setIsAdmin(true);
|
||||
Context::instance().setCurrentUser(user);
|
||||
|
||||
PermissionEvaluator evaluator;
|
||||
QSignalSpy denied(&evaluator, &PermissionEvaluator::permissionDenied);
|
||||
|
||||
QVERIFY(evaluator.hasPermission(QStringLiteral("SHOP"), QStringLiteral("DELETE")));
|
||||
QCOMPARE(denied.count(), 0);
|
||||
}
|
||||
|
||||
void matchingRolePermissionIsGranted()
|
||||
{
|
||||
auto permission = QSharedPointer<Permission>::create();
|
||||
permission->setPluginId(QStringLiteral("SHOP"));
|
||||
permission->setPermissionName(QStringLiteral("READ"));
|
||||
|
||||
auto role = QSharedPointer<Role>::create();
|
||||
role->addPermission(permission);
|
||||
|
||||
auto user = QSharedPointer<User>::create();
|
||||
user->setIsAdmin(false);
|
||||
user->addRole(role);
|
||||
Context::instance().setCurrentUser(user);
|
||||
|
||||
PermissionEvaluator evaluator;
|
||||
QSignalSpy denied(&evaluator, &PermissionEvaluator::permissionDenied);
|
||||
|
||||
QVERIFY(evaluator.hasPermission(QStringLiteral("SHOP"), QStringLiteral("READ")));
|
||||
QCOMPARE(denied.count(), 0);
|
||||
}
|
||||
|
||||
void mismatchedPermissionIsDeniedAndEmitsSignal()
|
||||
{
|
||||
auto permission = QSharedPointer<Permission>::create();
|
||||
permission->setPluginId(QStringLiteral("SHOP"));
|
||||
permission->setPermissionName(QStringLiteral("READ"));
|
||||
|
||||
auto role = QSharedPointer<Role>::create();
|
||||
role->addPermission(permission);
|
||||
|
||||
auto user = QSharedPointer<User>::create();
|
||||
user->setIsAdmin(false);
|
||||
user->addRole(role);
|
||||
Context::instance().setCurrentUser(user);
|
||||
|
||||
PermissionEvaluator evaluator;
|
||||
QSignalSpy denied(&evaluator, &PermissionEvaluator::permissionDenied);
|
||||
|
||||
QVERIFY(!evaluator.hasPermission(QStringLiteral("SHOP"), QStringLiteral("DELETE")));
|
||||
QCOMPARE(denied.count(), 1);
|
||||
QCOMPARE(denied.takeFirst().at(0).toString(), QStringLiteral("DELETE"));
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication app(argc, argv);
|
||||
QTemporaryDir settingsDirectory;
|
||||
if (!settingsDirectory.isValid()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, settingsDirectory.path());
|
||||
|
||||
CoreTests tests;
|
||||
return QTest::qExec(&tests, argc, argv);
|
||||
}
|
||||
|
||||
#include "core_tests.moc"
|
||||
Reference in New Issue
Block a user