18#define ORAL_FACTORY_SQLITE 1
19#define ORAL_FACTORY_POSTGRES 2
21#if ORAL_FACTORY == ORAL_FACTORY_SQLITE
25#elif ORAL_FACTORY == ORAL_FACTORY_POSTGRES
33#error "Unknown oral tests factory"
37template<
typename T,
typename =
decltype (T {}.AsTuple ())>
38auto operator== (
const T& left,
const T& right)
40 return left.AsTuple () == right.AsTuple ();
45 template<
typename T,
typename... Args>
48 return QTest::toString (pkey.
Val_);
52#define TOSTRING(n) inline char* toString (const n& rec) { return toString (#n, rec); }
54template<
typename T,
typename TupleType =
decltype (T {}.AsTuple ())>
57 using QTest::toString;
59 QByteArray ba { name };
62 std::apply ([&ba] (
const auto&... args) { (ba.append (
toString (args)).append (
", "), ...); }, t.AsTuple ());
64 if (std::tuple_size<TupleType>::value >= 1)
68 return qstrdup (ba.data ());
75#if ORAL_FACTORY == ORAL_FACTORY_SQLITE
76 auto db = QSqlDatabase::addDatabase (
"QSQLITE", Util::GenConnectionName (
"TestConnection"));
77 db.setDatabaseName (name);
79 throw std::runtime_error {
"cannot create test database" };
84#elif ORAL_FACTORY == ORAL_FACTORY_POSTGRES
87 auto db = QSqlDatabase::addDatabase (
"QPSQL", Util::GenConnectionName (
"TestConnection"));
89 db.setHostName (
"localhost");
91 db.setUserName (qgetenv (
"TEST_POSTGRES_USERNAME"));
95 DBLock::DumpError (db.lastError ());
96 throw std::runtime_error {
"cannot create test database" };
106 auto adapted = Util::oral::AdaptPtr<T, OralFactory> (db);
107 for (
int i = 0; i < count; ++i)
108 adapted->Insert ({ i, QString::number (i) });
char * toString(const char *name, const T &t)
QSqlQuery RunTextQuery(const QSqlDatabase &db, const QString &text)
Runs the given query text on the given db.
detail::SQLite::ImplFactory SQLiteImplFactory
detail::PostgreSQL::ImplFactory PostgreSQLImplFactory
auto PrepareRecords(QSqlDatabase db, int count=3)
QSqlDatabase MakeDatabase(const QString &name=":memory:")