111 lines
4.2 KiB
C++
111 lines
4.2 KiB
C++
#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);
|
|
}
|
|
}
|