pgLab/tests/pgintegration/DbTest.cpp
2026-10-18 12:32:16 +02:00

62 lines
1.5 KiB
C++

#include "DbTest.h"
#include "PgTestEnvironment.h"
#include <atomic>
#include <stdexcept>
namespace pgtest {
namespace {
std::atomic<int> g_counter{0};
}
QString DbTest::dbUrl() const
{
return urlForDb(dbName_);
}
std::unique_ptr<Pgsql::Connection> DbTest::plainConn() const
{
auto c = std::make_unique<Pgsql::Connection>();
c->connect(urlForDbAsPlainRole(dbName_));
return c;
}
void DbTest::SetUp()
{
if (!available())
GTEST_SKIP() << "TEST_DATABASE_URL not set or template database unavailable";
dbName_ = QString("t_%1_%2").arg(g_counter++).arg(processId());
try {
{
Pgsql::Connection admin;
admin.connect(*baseUrl());
admin.query(QString("CREATE DATABASE %1 TEMPLATE %2")
.arg(quoteIdent(dbName_), quoteIdent(templateDbName())));
}
conn_ = std::make_unique<Pgsql::Connection>();
conn_->connect(dbUrl());
}
catch (const std::exception &e) {
FAIL() << "Creating test database failed: " << e.what();
}
}
void DbTest::TearDown()
{
conn_.reset();
if (dbName_.isEmpty())
return;
try {
Pgsql::Connection admin;
admin.connect(*baseUrl());
admin.query(QString("DROP DATABASE IF EXISTS %1 WITH (FORCE)").arg(quoteIdent(dbName_)));
}
catch (const std::exception &e) {
ADD_FAILURE() << "Dropping test database failed: " << e.what();
}
dbName_.clear();
}
} // namespace pgtest