Add a QMessageBox wrapper class to help gui tests.

QMessageBox displays modal dialogs which blocks the gui tests.
To work around this we add a MessageBox wrapper class where
the tests can set the answer for the next dialog.
The answer is then returned without actually showing the dialog.
This commit is contained in:
Felix Geyer 2013-10-08 22:09:20 +02:00
parent 551637f0c2
commit d5b70b1bef
11 changed files with 176 additions and 41 deletions

View File

@ -87,6 +87,7 @@ set(keepassx_SOURCES
gui/KeePass1OpenWidget.cpp gui/KeePass1OpenWidget.cpp
gui/LineEdit.cpp gui/LineEdit.cpp
gui/MainWindow.cpp gui/MainWindow.cpp
gui/MessageBox.cpp
gui/PasswordGeneratorWidget.cpp gui/PasswordGeneratorWidget.cpp
gui/SettingsWidget.cpp gui/SettingsWidget.cpp
gui/SortFilterHideProxyModel.cpp gui/SortFilterHideProxyModel.cpp

View File

@ -18,11 +18,10 @@
#include "ChangeMasterKeyWidget.h" #include "ChangeMasterKeyWidget.h"
#include "ui_ChangeMasterKeyWidget.h" #include "ui_ChangeMasterKeyWidget.h"
#include <QMessageBox>
#include "keys/FileKey.h" #include "keys/FileKey.h"
#include "keys/PasswordKey.h" #include "keys/PasswordKey.h"
#include "gui/FileDialog.h" #include "gui/FileDialog.h"
#include "gui/MessageBox.h"
ChangeMasterKeyWidget::ChangeMasterKeyWidget(QWidget* parent) ChangeMasterKeyWidget::ChangeMasterKeyWidget(QWidget* parent)
: DialogyWidget(parent) : DialogyWidget(parent)
@ -56,7 +55,7 @@ void ChangeMasterKeyWidget::createKeyFile()
QString errorMsg; QString errorMsg;
bool created = FileKey::create(fileName, &errorMsg); bool created = FileKey::create(fileName, &errorMsg);
if (!created) { if (!created) {
QMessageBox::warning(this, tr("Error"), tr("Unable to create Key File : ") + errorMsg); MessageBox::warning(this, tr("Error"), tr("Unable to create Key File : ") + errorMsg);
} }
else { else {
m_ui->keyFileCombo->setEditText(fileName); m_ui->keyFileCombo->setEditText(fileName);
@ -105,7 +104,7 @@ void ChangeMasterKeyWidget::generateKey()
if (m_ui->passwordGroup->isChecked()) { if (m_ui->passwordGroup->isChecked()) {
if (m_ui->enterPasswordEdit->text() == m_ui->repeatPasswordEdit->text()) { if (m_ui->enterPasswordEdit->text() == m_ui->repeatPasswordEdit->text()) {
if (m_ui->enterPasswordEdit->text().isEmpty()) { if (m_ui->enterPasswordEdit->text().isEmpty()) {
if (QMessageBox::question(this, tr("Question"), if (MessageBox::question(this, tr("Question"),
tr("Do you really want to use an empty string as password?"), tr("Do you really want to use an empty string as password?"),
QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) {
return; return;
@ -114,7 +113,7 @@ void ChangeMasterKeyWidget::generateKey()
m_key.addKey(PasswordKey(m_ui->enterPasswordEdit->text())); m_key.addKey(PasswordKey(m_ui->enterPasswordEdit->text()));
} }
else { else {
QMessageBox::warning(this, tr("Error"), tr("Different passwords supplied.")); MessageBox::warning(this, tr("Error"), tr("Different passwords supplied."));
m_ui->enterPasswordEdit->setText(""); m_ui->enterPasswordEdit->setText("");
m_ui->repeatPasswordEdit->setText(""); m_ui->repeatPasswordEdit->setText("");
return; return;

View File

@ -18,11 +18,10 @@
#include "DatabaseOpenWidget.h" #include "DatabaseOpenWidget.h"
#include "ui_DatabaseOpenWidget.h" #include "ui_DatabaseOpenWidget.h"
#include <QMessageBox>
#include "core/Config.h" #include "core/Config.h"
#include "core/Database.h" #include "core/Database.h"
#include "gui/FileDialog.h" #include "gui/FileDialog.h"
#include "gui/MessageBox.h"
#include "format/KeePass2Reader.h" #include "format/KeePass2Reader.h"
#include "keys/FileKey.h" #include "keys/FileKey.h"
#include "keys/PasswordKey.h" #include "keys/PasswordKey.h"
@ -115,7 +114,7 @@ void DatabaseOpenWidget::openDatabase()
Q_EMIT editFinished(true); Q_EMIT editFinished(true);
} }
else { else {
QMessageBox::warning(this, tr("Error"), tr("Unable to open the database.\n%1") MessageBox::warning(this, tr("Error"), tr("Unable to open the database.\n%1")
.arg(reader.errorString())); .arg(reader.errorString()));
m_ui->editPassword->clear(); m_ui->editPassword->clear();
} }
@ -136,7 +135,7 @@ CompositeKey DatabaseOpenWidget::databaseKey()
QString keyFilename = m_ui->comboKeyFile->currentText(); QString keyFilename = m_ui->comboKeyFile->currentText();
QString errorMsg; QString errorMsg;
if (!key.load(keyFilename, &errorMsg)) { if (!key.load(keyFilename, &errorMsg)) {
QMessageBox::warning(this, tr("Error"), tr("Can't open key file:\n%1").arg(errorMsg)); MessageBox::warning(this, tr("Error"), tr("Can't open key file:\n%1").arg(errorMsg));
return CompositeKey(); return CompositeKey();
} }
masterKey.addKey(key); masterKey.addKey(key);

View File

@ -18,7 +18,6 @@
#include "DatabaseTabWidget.h" #include "DatabaseTabWidget.h"
#include <QFileInfo> #include <QFileInfo>
#include <QMessageBox>
#include <QTabWidget> #include <QTabWidget>
#include "autotype/AutoType.h" #include "autotype/AutoType.h"
@ -30,6 +29,7 @@
#include "gui/DatabaseWidget.h" #include "gui/DatabaseWidget.h"
#include "gui/DragTabBar.h" #include "gui/DragTabBar.h"
#include "gui/FileDialog.h" #include "gui/FileDialog.h"
#include "gui/MessageBox.h"
#include "gui/entry/EntryView.h" #include "gui/entry/EntryView.h"
#include "gui/group/GroupView.h" #include "gui/group/GroupView.h"
@ -106,7 +106,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
QFileInfo fileInfo(fileName); QFileInfo fileInfo(fileName);
QString canonicalFilePath = fileInfo.canonicalFilePath(); QString canonicalFilePath = fileInfo.canonicalFilePath();
if (canonicalFilePath.isEmpty()) { if (canonicalFilePath.isEmpty()) {
QMessageBox::warning(this, tr("Warning"), tr("File not found!")); MessageBox::warning(this, tr("Warning"), tr("File not found!"));
return; return;
} }
@ -191,7 +191,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db)
} }
if (dbStruct.dbWidget->currentMode() == DatabaseWidget::EditMode && db->hasKey()) { if (dbStruct.dbWidget->currentMode() == DatabaseWidget::EditMode && db->hasKey()) {
QMessageBox::StandardButton result = QMessageBox::StandardButton result =
QMessageBox::question( MessageBox::question(
this, tr("Close?"), this, tr("Close?"),
tr("\"%1\" is in edit mode.\nClose anyway?").arg(dbName), tr("\"%1\" is in edit mode.\nClose anyway?").arg(dbName),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
@ -205,7 +205,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db)
} }
else { else {
QMessageBox::StandardButton result = QMessageBox::StandardButton result =
QMessageBox::question( MessageBox::question(
this, tr("Save changes?"), this, tr("Save changes?"),
tr("\"%1\" was modified.\nSave changes?").arg(dbName), tr("\"%1\" was modified.\nSave changes?").arg(dbName),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes);
@ -270,7 +270,7 @@ void DatabaseTabWidget::saveDatabase(Database* db)
updateTabName(db); updateTabName(db);
} }
else { else {
QMessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n" MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString()); + saveFile.errorString());
} }
} }
@ -309,7 +309,7 @@ void DatabaseTabWidget::saveDatabaseAs(Database* db)
updateLastDatabases(dbStruct.filePath); updateLastDatabases(dbStruct.filePath);
} }
else { else {
QMessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n" MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString()); + saveFile.errorString());
} }
} }

View File

@ -23,7 +23,6 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
#include <QMessageBox>
#include <QSplitter> #include <QSplitter>
#include <QTimer> #include <QTimer>
@ -36,6 +35,7 @@
#include "gui/DatabaseOpenWidget.h" #include "gui/DatabaseOpenWidget.h"
#include "gui/DatabaseSettingsWidget.h" #include "gui/DatabaseSettingsWidget.h"
#include "gui/KeePass1OpenWidget.h" #include "gui/KeePass1OpenWidget.h"
#include "gui/MessageBox.h"
#include "gui/UnlockDatabaseWidget.h" #include "gui/UnlockDatabaseWidget.h"
#include "gui/entry/EditEntryWidget.h" #include "gui/entry/EditEntryWidget.h"
#include "gui/entry/EntryView.h" #include "gui/entry/EntryView.h"
@ -248,14 +248,14 @@ void DatabaseWidget::deleteEntries()
QMessageBox::StandardButton result; QMessageBox::StandardButton result;
if (selected.size() == 1) { if (selected.size() == 1) {
result = QMessageBox::question( result = MessageBox::question(
this, tr("Delete entry?"), this, tr("Delete entry?"),
tr("Do you really want to delete the entry \"%1\" for good?") tr("Do you really want to delete the entry \"%1\" for good?")
.arg(selectedEntries.first()->title()), .arg(selectedEntries.first()->title()),
QMessageBox::Yes | QMessageBox::No); QMessageBox::Yes | QMessageBox::No);
} }
else { else {
result = QMessageBox::question( result = MessageBox::question(
this, tr("Delete entries?"), this, tr("Delete entries?"),
tr("Do you really want to delete %1 entries for good?") tr("Do you really want to delete %1 entries for good?")
.arg(selected.size()), .arg(selected.size()),
@ -270,7 +270,7 @@ void DatabaseWidget::deleteEntries()
} }
else { else {
if (selected.size() > 1) { if (selected.size() > 1) {
QMessageBox::StandardButton result = QMessageBox::question( QMessageBox::StandardButton result = MessageBox::question(
this, tr("Move entries to recycle bin?"), this, tr("Move entries to recycle bin?"),
tr("Do you really want to move %1 entries to the recycle bin?") tr("Do you really want to move %1 entries to the recycle bin?")
.arg(selected.size()), .arg(selected.size()),
@ -371,7 +371,7 @@ void DatabaseWidget::deleteGroup()
bool inRecylceBin = Tools::hasChild(m_db->metadata()->recycleBin(), currentGroup); bool inRecylceBin = Tools::hasChild(m_db->metadata()->recycleBin(), currentGroup);
if (inRecylceBin || !m_db->metadata()->recycleBinEnabled()) { if (inRecylceBin || !m_db->metadata()->recycleBinEnabled()) {
QMessageBox::StandardButton result = QMessageBox::question( QMessageBox::StandardButton result = MessageBox::question(
this, tr("Delete group?"), this, tr("Delete group?"),
tr("Do you really want to delete the group \"%1\" for good?") tr("Do you really want to delete the group \"%1\" for good?")
.arg(currentGroup->name()), .arg(currentGroup->name()),

View File

@ -19,12 +19,12 @@
#include "ui_EditWidgetIcons.h" #include "ui_EditWidgetIcons.h"
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox>
#include "core/Group.h" #include "core/Group.h"
#include "core/Metadata.h" #include "core/Metadata.h"
#include "core/Tools.h" #include "core/Tools.h"
#include "gui/IconModels.h" #include "gui/IconModels.h"
#include "gui/MessageBox.h"
IconStruct::IconStruct() IconStruct::IconStruct()
: uuid(Uuid()) : uuid(Uuid())
@ -192,7 +192,7 @@ void EditWidgetIcons::removeCustomIcon()
} }
} }
else { else {
QMessageBox::information(this, tr("Can't delete icon!"), MessageBox::information(this, tr("Can't delete icon!"),
tr("Can't delete icon. Still used by %1 items.") tr("Can't delete icon. Still used by %1 items.")
.arg(iconUsedCount)); .arg(iconUsedCount));
} }

View File

@ -19,12 +19,12 @@
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QMessageBox>
#include "ui_DatabaseOpenWidget.h" #include "ui_DatabaseOpenWidget.h"
#include "core/Database.h" #include "core/Database.h"
#include "core/Metadata.h" #include "core/Metadata.h"
#include "format/KeePass1Reader.h" #include "format/KeePass1Reader.h"
#include "gui/MessageBox.h"
KeePass1OpenWidget::KeePass1OpenWidget(QWidget* parent) KeePass1OpenWidget::KeePass1OpenWidget(QWidget* parent)
: DatabaseOpenWidget(parent) : DatabaseOpenWidget(parent)
@ -64,7 +64,7 @@ void KeePass1OpenWidget::openDatabase()
Q_EMIT editFinished(true); Q_EMIT editFinished(true);
} }
else { else {
QMessageBox::warning(this, tr("Error"), tr("Unable to open the database.\n%1") MessageBox::warning(this, tr("Error"), tr("Unable to open the database.\n%1")
.arg(reader.errorString())); .arg(reader.errorString()));
m_ui->editPassword->clear(); m_ui->editPassword->clear();
} }

86
src/gui/MessageBox.cpp Normal file
View File

@ -0,0 +1,86 @@
/*
* Copyright (C) 2013 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "MessageBox.h"
QMessageBox::StandardButton MessageBox::m_nextAnswer(QMessageBox::NoButton);
QMessageBox::StandardButton MessageBox::critical(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons,
QMessageBox::StandardButton defaultButton)
{
if (m_nextAnswer == QMessageBox::NoButton) {
return QMessageBox::critical(parent, title, text, buttons, defaultButton);
}
else {
QMessageBox::StandardButton returnButton = m_nextAnswer;
m_nextAnswer = QMessageBox::NoButton;
return returnButton;
}
}
QMessageBox::StandardButton MessageBox::information(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons,
QMessageBox::StandardButton defaultButton)
{
if (m_nextAnswer == QMessageBox::NoButton) {
return QMessageBox::information(parent, title, text, buttons, defaultButton);
}
else {
QMessageBox::StandardButton returnButton = m_nextAnswer;
m_nextAnswer = QMessageBox::NoButton;
return returnButton;
}
}
QMessageBox::StandardButton MessageBox::question(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons,
QMessageBox::StandardButton defaultButton)
{
if (m_nextAnswer == QMessageBox::NoButton) {
return QMessageBox::question(parent, title, text, buttons, defaultButton);
}
else {
QMessageBox::StandardButton returnButton = m_nextAnswer;
m_nextAnswer = QMessageBox::NoButton;
return returnButton;
}
}
QMessageBox::StandardButton MessageBox::warning(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons,
QMessageBox::StandardButton defaultButton)
{
if (m_nextAnswer == QMessageBox::NoButton) {
return QMessageBox::warning(parent, title, text, buttons, defaultButton);
}
else {
QMessageBox::StandardButton returnButton = m_nextAnswer;
m_nextAnswer = QMessageBox::NoButton;
return returnButton;
}
}
void MessageBox::setNextAnswer(QMessageBox::StandardButton button)
{
m_nextAnswer = button;
}

51
src/gui/MessageBox.h Normal file
View File

@ -0,0 +1,51 @@
/*
* Copyright (C) 2013 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KEEPASSX_MESSAGEBOX_H
#define KEEPASSX_MESSAGEBOX_H
#include <QMessageBox>
#include "core/Global.h"
class MessageBox
{
public:
static QMessageBox::StandardButton critical(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
static QMessageBox::StandardButton information(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
static QMessageBox::StandardButton question(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
static QMessageBox::StandardButton warning(QWidget* parent,
const QString& title, const QString& text,
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
static void setNextAnswer(QMessageBox::StandardButton button);
private:
static QMessageBox::StandardButton m_nextAnswer;
};
#endif // KEEPASSX_MESSAGEBOX_H

View File

@ -17,10 +17,9 @@
#include "UnlockDatabaseWidget.h" #include "UnlockDatabaseWidget.h"
#include <QMessageBox>
#include "ui_DatabaseOpenWidget.h" #include "ui_DatabaseOpenWidget.h"
#include "core/Database.h" #include "core/Database.h"
#include "gui/MessageBox.h"
UnlockDatabaseWidget::UnlockDatabaseWidget(QWidget* parent) UnlockDatabaseWidget::UnlockDatabaseWidget(QWidget* parent)
: DatabaseOpenWidget(parent) : DatabaseOpenWidget(parent)
@ -50,7 +49,7 @@ void UnlockDatabaseWidget::openDatabase()
Q_EMIT editFinished(true); Q_EMIT editFinished(true);
} }
else { else {
QMessageBox::warning(this, tr("Error"), tr("Wrong key.")); MessageBox::warning(this, tr("Error"), tr("Wrong key."));
m_ui->editPassword->clear(); m_ui->editPassword->clear();
} }
} }

View File

@ -24,7 +24,6 @@
#include <QDesktopServices> #include <QDesktopServices>
#include <QStackedLayout> #include <QStackedLayout>
#include <QMenu> #include <QMenu>
#include <QMessageBox>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include "core/Database.h" #include "core/Database.h"
@ -35,6 +34,7 @@
#include "gui/EditWidgetIcons.h" #include "gui/EditWidgetIcons.h"
#include "gui/EditWidgetProperties.h" #include "gui/EditWidgetProperties.h"
#include "gui/FileDialog.h" #include "gui/FileDialog.h"
#include "gui/MessageBox.h"
#include "gui/entry/AutoTypeAssociationsModel.h" #include "gui/entry/AutoTypeAssociationsModel.h"
#include "gui/entry/EntryAttachmentsModel.h" #include "gui/entry/EntryAttachmentsModel.h"
#include "gui/entry/EntryAttributesModel.h" #include "gui/entry/EntryAttributesModel.h"
@ -381,7 +381,7 @@ void EditEntryWidget::saveEntry()
} }
if (!passwordsEqual()) { if (!passwordsEqual()) {
QMessageBox::warning(this, tr("Error"), tr("Different passwords supplied.")); MessageBox::warning(this, tr("Error"), tr("Different passwords supplied."));
return; return;
} }
@ -614,14 +614,14 @@ void EditEntryWidget::insertAttachment()
QFile file(filename); QFile file(filename);
if (!file.open(QIODevice::ReadOnly)) { if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::warning(this, tr("Error"), MessageBox::warning(this, tr("Error"),
tr("Unable to open file:\n").append(file.errorString())); tr("Unable to open file:\n").append(file.errorString()));
return; return;
} }
QByteArray data; QByteArray data;
if (!Tools::readAllFromDevice(&file, data)) { if (!Tools::readAllFromDevice(&file, data)) {
QMessageBox::warning(this, tr("Error"), MessageBox::warning(this, tr("Error"),
tr("Unable to open file:\n").append(file.errorString())); tr("Unable to open file:\n").append(file.errorString()));
return; return;
} }
@ -646,12 +646,12 @@ void EditEntryWidget::saveCurrentAttachment()
QFile file(savePath); QFile file(savePath);
if (!file.open(QIODevice::WriteOnly)) { if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::warning(this, tr("Error"), MessageBox::warning(this, tr("Error"),
tr("Unable to save the attachment:\n").append(file.errorString())); tr("Unable to save the attachment:\n").append(file.errorString()));
return; return;
} }
if (file.write(attachmentData) != attachmentData.size()) { if (file.write(attachmentData) != attachmentData.size()) {
QMessageBox::warning(this, tr("Error"), MessageBox::warning(this, tr("Error"),
tr("Unable to save the attachment:\n").append(file.errorString())); tr("Unable to save the attachment:\n").append(file.errorString()));
return; return;
} }