#include #include #include #include #include #include #include #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("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("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("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("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(window); candidate && candidate->findChild()) { dialog = candidate; break; } } ASSERT_NE(dialog, nullptr); auto combo = dialog->findChild("cmbbxSsl"); ASSERT_NE(combo, nullptr); combo->setCurrentIndex(combo->findData(QStringLiteral("require"))); auto buttons = dialog->findChild(); 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); } }