Fix SSL mode combobox did not work properly

This commit is contained in:
Eelke Klein 2026-10-26 14:47:19 +01:00
parent 04f525e2e9
commit 0dcee5f76c
No known key found for this signature in database
6 changed files with 228 additions and 34 deletions

View file

@ -21,10 +21,12 @@ add_executable(pglabtests
tst_Range.cpp
ResultSourceMappingTest.cpp
tst_RecordPanel.cpp
${CMAKE_SOURCE_DIR}/pglab/crud/RecordPanel.cpp
tst_SslModeModel.cpp
tst_ConnectionConfigurationWidget.cpp
)
target_link_libraries(pglabtests PRIVATE
pglabapp
pglablib
pgsql
core

View file

@ -0,0 +1,111 @@
#include <gtest/gtest.h>
#include <QApplication>
#include <QComboBox>
#include <QDialog>
#include <QDialogButtonBox>
#include <QEvent>
#include <QPushButton>
#include "ConnectionConfig.h"
#include "ConnectionConfigurationWidget.h"
#include "ConnectionController.h"
#include "PrintTo_Qt.h"
class ConnectionConfigurationWidgetTest : public ::testing::Test {
protected:
// SSL settings do not need the controller's database or connection tree initialized.
ConnectionController controller;
};
TEST_F(ConnectionConfigurationWidgetTest, SelectedSslModesRoundTripThroughTheWidget)
{
ConnectionConfigurationWidget widget(&controller);
widget.setData(ConnectionConfig());
auto combo = widget.findChild<QComboBox *>("cmbbxSsl");
ASSERT_NE(combo, nullptr);
EXPECT_FALSE(combo->isEditable());
const QStringList modes = {"disable", "allow", "prefer", "require", "verify-ca", "verify-full"};
for (const auto &mode : modes) {
SCOPED_TRACE(mode.toStdString());
auto index = combo->findData(mode);
ASSERT_GT(index, 0);
combo->setCurrentIndex(index);
EXPECT_EQ(combo->currentText(), mode);
auto saved = widget.data();
EXPECT_EQ(saved.getParameter("sslmode"), mode);
ConnectionConfigurationWidget reopened(&controller);
reopened.setData(saved);
EXPECT_EQ(reopened.data().getParameter("sslmode"), mode);
EXPECT_EQ(reopened.findChild<QComboBox *>("cmbbxSsl")->currentText(), mode);
}
combo->setCurrentIndex(combo->findData(QString()));
EXPECT_TRUE(widget.data().getParameter("sslmode").isEmpty());
EXPECT_EQ(widget.data().getParameters().count("sslmode"), 0);
}
TEST_F(ConnectionConfigurationWidgetTest, LegacyVerificationModesAreCanonicalized)
{
ConnectionConfigurationWidget widget(&controller);
for (const auto &mode : {QStringLiteral("verify_ca"), QStringLiteral("verify_full")}) {
ConnectionConfig config;
config.setParameter("sslmode", mode);
widget.setData(config);
auto canonical = QString(mode).replace('_', '-');
EXPECT_EQ(widget.findChild<QComboBox *>("cmbbxSsl")->currentText(), canonical);
EXPECT_EQ(widget.data().getParameter("sslmode"), canonical);
EXPECT_EQ(config.getParameter("sslmode"), mode);
}
}
TEST_F(ConnectionConfigurationWidgetTest, MissingOrUnknownModesResetToDefault)
{
ConnectionConfigurationWidget widget(&controller);
for (const auto &mode : {QString(), QStringLiteral("unknown")}) {
ConnectionConfig config;
config.setParameter("sslmode", "require");
widget.setData(config);
config.setParameter("sslmode", mode);
widget.setData(config);
EXPECT_EQ(widget.findChild<QComboBox *>("cmbbxSsl")->currentText(), QStringLiteral("Default"));
EXPECT_TRUE(widget.data().getParameter("sslmode").isEmpty());
}
}
TEST_F(ConnectionConfigurationWidgetTest, DialogOnlySavesOnAccept)
{
ConnectionConfig config;
config.setParameter("sslmode", "allow");
for (bool accept : {false, true}) {
bool saved = false;
ConnectionConfigurationWidget::editExistingInWindow(&controller, config,
[&](ConnectionConfigurationWidget &widget) {
saved = true;
EXPECT_EQ(widget.data().getParameter("sslmode"), QStringLiteral("require"));
});
QDialog *dialog = nullptr;
for (auto window : QApplication::topLevelWidgets()) {
if (auto candidate = qobject_cast<QDialog *>(window);
candidate && candidate->findChild<ConnectionConfigurationWidget *>()) {
dialog = candidate;
break;
}
}
ASSERT_NE(dialog, nullptr);
auto combo = dialog->findChild<QComboBox *>("cmbbxSsl");
ASSERT_NE(combo, nullptr);
combo->setCurrentIndex(combo->findData(QStringLiteral("require")));
auto buttons = dialog->findChild<QDialogButtonBox *>();
ASSERT_NE(buttons, nullptr);
buttons->button(accept ? QDialogButtonBox::Ok : QDialogButtonBox::Cancel)->click();
EXPECT_EQ(saved, accept);
EXPECT_EQ(config.getParameter("sslmode"), QStringLiteral("allow"));
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
}
}

View file

@ -0,0 +1,67 @@
#include <gtest/gtest.h>
#include <QComboBox>
#include "ConnectionConfig.h"
#include "PrintTo_Qt.h"
#include "SslModeModel.h"
TEST(SslModeModelTest, SelectedModesKeepTheirTextAndCanonicalValue)
{
SslModeModel model;
QComboBox combo;
combo.setModel(&model);
ASSERT_FALSE(combo.isEditable());
const QStringList modes = {"disable", "allow", "prefer", "require", "verify-ca", "verify-full"};
ASSERT_EQ(combo.count(), modes.size() + 1);
for (const auto &mode : modes) {
SCOPED_TRACE(mode.toStdString());
auto index = combo.findData(mode);
ASSERT_GT(index, 0);
combo.setCurrentIndex(index);
EXPECT_EQ(combo.currentText(), mode);
EXPECT_EQ(combo.currentData().toString(), mode);
ConnectionConfig config;
config.setParameter("sslmode", combo.currentData().toString());
EXPECT_EQ(config.getParameter("sslmode"), mode);
EXPECT_TRUE(config.connectionString().contains("sslmode=" + mode));
QComboBox reopened;
reopened.setModel(&model);
reopened.setCurrentIndex(reopened.findData(config.getParameter("sslmode")));
EXPECT_EQ(reopened.currentText(), mode);
EXPECT_EQ(reopened.currentData().toString(), mode);
}
}
TEST(SslModeModelTest, DefaultClearsAnExplicitMode)
{
SslModeModel model;
QComboBox combo;
combo.setModel(&model);
EXPECT_EQ(combo.currentText(), QStringLiteral("Default"));
EXPECT_EQ(combo.currentData().toString(), QString());
EXPECT_EQ(combo.findData(QString()), 0);
ConnectionConfig config;
config.setParameter("sslmode", "require");
combo.setCurrentIndex(combo.findData(QStringLiteral("require")));
combo.setCurrentIndex(combo.findData(QString()));
config.setParameter("sslmode", combo.currentData().toString());
EXPECT_TRUE(config.getParameter("sslmode").isEmpty());
EXPECT_EQ(config.getParameters().count("sslmode"), 0);
EXPECT_FALSE(config.connectionString().contains("sslmode="));
}
TEST(SslModeModelTest, InvalidIndexesAndChildRowsAreEmpty)
{
SslModeModel model;
EXPECT_FALSE(model.data(QModelIndex()).isValid());
EXPECT_FALSE(model.data(model.index(model.rowCount(), 0)).isValid());
EXPECT_EQ(model.rowCount(model.index(0, 0)), 0);
}