// Tests for authkit#14 PRs 2 & 3 — user_property_permissions and // user_group_permissions schemas compose correctly with TemporalRepository. #include "oatpp-authkit/db/UserPermissionDb.hpp" #include "oatpp-authkit/dto/UserPermissionDto.hpp" #include "oatpp-authkit/repo/ConcreteUserPermissionRepository.hpp" #include "oatpp-authkit/repo/SchemaContract.hpp" #include "oatpp-authkit/repo/TemporalRepository.hpp" #include #include #include #include #define REQUIRE(cond) do { \ if (!(cond)) { std::fprintf(stderr, "REQUIRE failed: %s @ %s:%d\n", \ #cond, __FILE__, __LINE__); std::abort(); } } while (0) namespace { bool contains(const std::string& haystack, const std::string& needle) { return haystack.find(needle) != std::string::npos; } void test_user_property_permissions_create() { using namespace oatpp_authkit::repo; using namespace oatpp_authkit::db; using namespace oatpp_authkit::dto; std::vector sqls; SqlExec exec = [&](const std::string& sql) { sqls.push_back(sql); }; SchemaBuilder< UserPropertyPermissionSchema, TemporalRepository>::create( "user_property_permissions", exec); // 1 entity table + 3 schema-side indexes + 1 temporal index = 5 REQUIRE(sqls.size() == 5); REQUIRE(contains(sqls[0], "CREATE TABLE IF NOT EXISTS user_property_permissions")); REQUIRE(contains(sqls[0], "user_id TEXT NOT NULL")); REQUIRE(contains(sqls[0], "property_id TEXT NOT NULL")); REQUIRE(contains(sqls[0], "permission TEXT NOT NULL DEFAULT 'readonly'")); REQUIRE(contains(sqls[0], "valid_until TEXT NOT NULL DEFAULT '9999-12-31T23:59:59Z'")); // Indexes: 3 from UserPropertyPermissionSchema in order, then 1 from TemporalRepository. REQUIRE(contains(sqls[1], "ix_user_property_permissions_entity_id")); REQUIRE(contains(sqls[2], "ix_user_property_permissions_user_id")); REQUIRE(contains(sqls[3], "ux_user_property_permissions_user_property_until")); REQUIRE(contains(sqls[3], "(user_id, property_id, valid_until)")); REQUIRE(contains(sqls[4], "ux_user_property_permissions_entity_valid_until")); } void test_user_group_permissions_create() { using namespace oatpp_authkit::repo; using namespace oatpp_authkit::db; using namespace oatpp_authkit::dto; std::vector sqls; SqlExec exec = [&](const std::string& sql) { sqls.push_back(sql); }; SchemaBuilder< UserGroupPermissionSchema, TemporalRepository>::create( "user_group_permissions", exec); REQUIRE(sqls.size() == 5); REQUIRE(contains(sqls[0], "CREATE TABLE IF NOT EXISTS user_group_permissions")); REQUIRE(contains(sqls[0], "set_id TEXT NOT NULL")); REQUIRE(contains(sqls[3], "ux_user_group_permissions_user_set_until")); REQUIRE(contains(sqls[3], "(user_id, set_id, valid_until)")); } } // namespace int main() { test_user_property_permissions_create(); test_user_group_permissions_create(); std::printf("test_user_permission_schema: OK\n"); return 0; }