#include #include #include #include #include #include #include #include #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::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::create(); permission->setPluginId(QStringLiteral("SHOP")); permission->setPermissionName(QStringLiteral("READ")); auto role = QSharedPointer::create(); role->addPermission(permission); auto user = QSharedPointer::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::create(); permission->setPluginId(QStringLiteral("SHOP")); permission->setPermissionName(QStringLiteral("READ")); auto role = QSharedPointer::create(); role->addPermission(permission); auto user = QSharedPointer::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"