Files
prodejna/tests/core_tests.cpp
T

157 lines
5.2 KiB
C++
Raw Normal View History

2026-10-12 16:29:23 +02:00
#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"