keepassxc/tests/gui/attachments/TestTextAttachmentsWidget.cpp
Kuznetsov Oleg f2a4cc7e66
Refactor attachment handling system with enhanced UI (#12085)
* Renamed NewEntryAttachmentsDialog to EditEntryAttachmentsDialog for clarity.
* Introduced EditEntryAttachmentsDialog class to manage editing of existing attachments.
* Added functionality to preview attachments while editing them.
* Enhanced EntryAttachmentsModel with rowByKey method for better key management.
* Add image attachment support with zoom functionality.
* Add html and markdown detection.
* Improve button layout on the attachment section when editing an entry
2025-06-19 13:27:23 -04:00

224 lines
7 KiB
C++

#include "TestTextAttachmentsWidget.h"
#include <attachments/TextAttachmentsEditWidget.h>
#include <attachments/TextAttachmentsPreviewWidget.h>
#include <attachments/TextAttachmentsWidget.h>
#include <QPushButton>
#include <QSignalSpy>
#include <QSplitter>
#include <QTest>
#include <QTestMouseEvent>
#include <QTextEdit>
#include <QTimer>
void TestTextAttachmentsWidget::initTestCase()
{
m_textWidget.reset(new TextAttachmentsWidget());
}
void TestTextAttachmentsWidget::testInitTextWidget()
{
auto splitter = m_textWidget->findChild<QSplitter*>();
QVERIFY2(splitter, "Splitter not found");
QCOMPARE(splitter->count(), 2);
QVERIFY2(qobject_cast<TextAttachmentsEditWidget*>(splitter->widget(0)), "EditTextWidget not found");
QVERIFY2(qobject_cast<TextAttachmentsPreviewWidget*>(splitter->widget(1)), "PreviewTextWidget not found");
}
void TestTextAttachmentsWidget::testTextReadWriteWidget()
{
const attachments::Attachment Test{.name = "text.txt", .data = "Test"};
m_textWidget->openAttachment(Test, attachments::OpenMode::ReadWrite);
m_textWidget->show();
QCoreApplication::processEvents();
auto splitter = m_textWidget->findChild<QSplitter*>();
QVERIFY2(splitter, "Splitter not found");
auto sizes = splitter->sizes();
QCOMPARE(sizes.size(), 2);
QVERIFY2(sizes[0] > 0, "EditTextWidget width must be greater than zero");
QCOMPARE(sizes[1], 0);
auto widget = qobject_cast<TextAttachmentsEditWidget*>(splitter->widget(0));
QVERIFY(widget);
auto attachments = widget->getAttachment();
QCOMPARE(attachments.name, Test.name);
QCOMPARE(attachments.data, Test.data);
auto previewWidget = qobject_cast<TextAttachmentsPreviewWidget*>(splitter->widget(1));
QVERIFY(previewWidget);
attachments = previewWidget->getAttachment();
QCOMPARE(attachments.name, Test.name);
QCOMPARE(attachments.data, Test.data);
}
void TestTextAttachmentsWidget::testTextReadWidget()
{
const attachments::Attachment Test{.name = "text.txt", .data = "Test"};
m_textWidget->openAttachment(Test, attachments::OpenMode::ReadOnly);
m_textWidget->show();
QCoreApplication::processEvents();
auto splitter = m_textWidget->findChild<QSplitter*>();
QVERIFY2(splitter, "Splitter not found");
auto sizes = splitter->sizes();
QCOMPARE(sizes.size(), 2);
QVERIFY2(sizes[1] > 0, "PreviewTextWidget width must be greater then zero");
QVERIFY(splitter->widget(0)->isHidden());
auto widget = qobject_cast<TextAttachmentsEditWidget*>(splitter->widget(0));
QVERIFY(widget);
auto attachments = widget->getAttachment();
QCOMPARE(attachments.name, Test.name);
QCOMPARE(attachments.data, Test.data);
auto previewWidget = qobject_cast<TextAttachmentsPreviewWidget*>(splitter->widget(1));
QVERIFY(previewWidget);
attachments = previewWidget->getAttachment();
QCOMPARE(attachments.name, Test.name);
QCOMPARE(attachments.data, Test.data);
}
void TestTextAttachmentsWidget::testTextChanged()
{
const attachments::Attachment Test{.name = "text.txt", .data = "Test"};
m_textWidget->openAttachment(Test, attachments::OpenMode::ReadWrite);
QCoreApplication::processEvents();
auto splitter = m_textWidget->findChild<QSplitter*>();
QVERIFY2(splitter, "Splitter not found");
QCOMPARE(splitter->sizes().size(), 2);
auto editWidget = qobject_cast<TextAttachmentsEditWidget*>(splitter->widget(0));
QVERIFY2(editWidget, "Edit widget not found");
auto textEdit = editWidget->findChild<QTextEdit*>();
QVERIFY(textEdit);
const QByteArray NewText = "New test text";
textEdit->setText(NewText);
QCoreApplication::processEvents();
auto attachments = m_textWidget->getAttachment();
QCOMPARE(attachments.data, NewText);
}
void TestTextAttachmentsWidget::testTextChangedInReadOnlyMode()
{
const attachments::Attachment Test{.name = "text.txt", .data = "Test"};
m_textWidget->openAttachment(Test, attachments::OpenMode::ReadOnly);
QCoreApplication::processEvents();
auto splitter = m_textWidget->findChild<QSplitter*>();
QVERIFY2(splitter, "Splitter not found");
QCOMPARE(splitter->sizes().size(), 2);
auto editWidget = qobject_cast<TextAttachmentsEditWidget*>(splitter->widget(0));
QVERIFY2(editWidget, "Edit widget not found");
auto textEdit = editWidget->findChild<QTextEdit*>();
QVERIFY(textEdit);
const QByteArray NewText = "New test text";
textEdit->setText(NewText);
QCoreApplication::processEvents();
auto attachments = m_textWidget->getAttachment();
QCOMPARE(attachments.data, Test.data);
}
void TestTextAttachmentsWidget::testPreviewTextChanged()
{
const attachments::Attachment Test{.name = "text.txt", .data = "Test"};
auto previewTimer = m_textWidget->findChild<QTimer*>();
QVERIFY2(previewTimer, "PreviewTimer not found!");
QSignalSpy timeout(previewTimer, &QTimer::timeout);
m_textWidget->openAttachment(Test, attachments::OpenMode::ReadWrite);
// Waiting for the first timeout
while (timeout.count() < 1) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 50);
}
auto splitter = m_textWidget->findChild<QSplitter*>();
QVERIFY2(splitter, "Splitter not found");
QCOMPARE(splitter->sizes().size(), 2);
splitter->setSizes({1, 1});
QCoreApplication::processEvents();
auto editWidget = qobject_cast<TextAttachmentsEditWidget*>(splitter->widget(0));
QVERIFY2(editWidget, "Edit widget not found");
auto textEdit = editWidget->findChild<QTextEdit*>();
QVERIFY(textEdit);
const QByteArray NewText = "New test text";
textEdit->setText(NewText);
// Waiting for the second timeout
while (timeout.count() < 2) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 50);
}
auto previewWidget = qobject_cast<TextAttachmentsPreviewWidget*>(splitter->widget(1));
auto attachments = previewWidget->getAttachment();
QCOMPARE(attachments.data, NewText);
}
void TestTextAttachmentsWidget::testOpenPreviewButton()
{
const attachments::Attachment Test{.name = "text.txt", .data = "Test"};
m_textWidget->openAttachment(Test, attachments::OpenMode::ReadWrite);
m_textWidget->show();
QCoreApplication::processEvents();
auto splitter = m_textWidget->findChild<QSplitter*>();
QVERIFY2(splitter, "Splitter not found");
QCOMPARE(splitter->sizes().size(), 2);
auto editWidget = qobject_cast<TextAttachmentsEditWidget*>(splitter->widget(0));
QVERIFY2(editWidget, "Edit widget not found");
QVERIFY(editWidget->isVisible());
auto previewButton = editWidget->findChild<QPushButton*>("previewPushButton");
auto sizes = splitter->sizes();
QVERIFY(sizes[0] > 0);
QCOMPARE(sizes[1], 0);
QTest::mouseClick(previewButton, Qt::LeftButton);
sizes = splitter->sizes();
QCOMPARE(sizes.size(), 2);
QVERIFY(sizes[0] > 0);
QVERIFY(sizes[1] > 0);
QTest::mouseClick(previewButton, Qt::LeftButton);
sizes = splitter->sizes();
QCOMPARE(sizes.size(), 2);
QVERIFY(sizes[0] > 0);
QCOMPARE(sizes[1], 0);
}