feat: email grouping by date + stability fixes

- EmailTreeModel: hierarchical model for grouped email view (QTreeView)
- DateGroupProxyModel: proxy model for date-based grouping logic
- MailListView: migrated from QTableView to QTreeView with grouping support
- ReaderView: subject frame with shadow, avatar moved to header, body inside header
- MainWindow: frameless with rounded corners, 1px border, edge resize, no status bar

- Stability fixes for grouping mode switch:
  * Proper tree cleanup (no double-delete of root)
  * Bounds checking on all array accesses
  * Null pointer checks in index/parent/data methods
  * Date validity checks before grouping
  * Index validation before accessing m_emails
This commit is contained in:
2026-08-24 01:04:00 +02:00
parent e28ab35fa9
commit 2281b01f49
19 changed files with 1998 additions and 219 deletions
+23
View File
@@ -0,0 +1,23 @@
QMAKE_CXX.QT_COMPILER_STDCXX = 201703L
QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 15
QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 2
QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
QMAKE_CXX.COMPILER_MACROS = \
QT_COMPILER_STDCXX \
QMAKE_GCC_MAJOR_VERSION \
QMAKE_GCC_MINOR_VERSION \
QMAKE_GCC_PATCH_VERSION
QMAKE_CXX.INCDIRS = \
/usr/include/c++/15 \
/usr/include/x86_64-linux-gnu/c++/15 \
/usr/include/c++/15/backward \
/usr/lib/gcc/x86_64-linux-gnu/15/include \
/usr/local/include \
/usr/include/x86_64-linux-gnu \
/usr/include
QMAKE_CXX.LIBDIRS = \
/usr/lib/gcc/x86_64-linux-gnu/15 \
/usr/lib/x86_64-linux-gnu \
/usr/lib \
/lib/x86_64-linux-gnu \
/lib
+400
View File
@@ -0,0 +1,400 @@
#############################################################################
# Makefile for building: test_accountdao
# Generated by qmake (3.1) (Qt 6.10.2)
# Project: test_accountdao.pro
# Template: app
# Command: /usr/bin/qmake6 -o Makefile test_accountdao.pro
#############################################################################
MAKEFILE = Makefile
EQ = =
####### Compiler, tools and options
CC = gcc
CXX = g++
DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_TESTLIB_LIB -DQT_SQL_LIB -DQT_CORE_LIB -DQT_TESTCASE_BUILDDIR='"/mnt/c/Users/javie/wino-mail-dtkqt/tests/unit"'
CFLAGS = -pipe -O2 -Wall -Wextra -D_REENTRANT $(DEFINES)
CXXFLAGS = -pipe -O2 -std=gnu++1z -Wall -Wextra -D_REENTRANT $(DEFINES)
INCPATH = -I. -I../../src -I../../src/services -I../../src/db -I../../src/db/dao -I../../src/core -I../../src/core/models -I/usr/include/x86_64-linux-gnu/qt6 -I/usr/include/x86_64-linux-gnu/qt6/QtGui -I/usr/include/x86_64-linux-gnu/qt6/QtTest -I/usr/include/x86_64-linux-gnu/qt6/QtSql -I/usr/include/x86_64-linux-gnu/qt6/QtCore -I. -I/usr/lib/x86_64-linux-gnu/qt6/mkspecs/linux-g++
QMAKE = /usr/bin/qmake6
DEL_FILE = rm -f
CHK_DIR_EXISTS= test -d
MKDIR = mkdir -p
COPY = cp -f
COPY_FILE = cp -f
COPY_DIR = cp -f -R
INSTALL_FILE = install -m 644 -p
INSTALL_PROGRAM = install -m 755 -p
INSTALL_DIR = cp -f -R
QINSTALL = /usr/bin/qmake6 -install qinstall
QINSTALL_PROGRAM = /usr/bin/qmake6 -install qinstall -exe
DEL_FILE = rm -f
SYMLINK = ln -f -s
DEL_DIR = rmdir
MOVE = mv -f
TAR = tar -cf
COMPRESS = gzip -9f
DISTNAME = test_accountdao1.0.0
DISTDIR = /mnt/c/Users/javie/wino-mail-dtkqt/tests/unit/.tmp/test_accountdao1.0.0
LINK = g++
LFLAGS = -Wl,-O1 -Wl,-rpath-link,/usr/lib/x86_64-linux-gnu
LIBS = $(SUBLIBS) /usr/lib/x86_64-linux-gnu/libQt6Gui.so /usr/lib/x86_64-linux-gnu/libGLX.so /usr/lib/x86_64-linux-gnu/libOpenGL.so /usr/lib/x86_64-linux-gnu/libQt6Test.so /usr/lib/x86_64-linux-gnu/libQt6Sql.so /usr/lib/x86_64-linux-gnu/libQt6Core.so -lpthread -lGLX -lOpenGL
AR = ar cqs
RANLIB =
SED = sed
STRIP = strip
####### Output directory
OBJECTS_DIR = ./
####### Files
SOURCES = ../../src/db/dao/accountdao.cpp \
../../src/db/databasemanager.cpp \
../../src/core/models/account.cpp \
test_accountdao.cpp
OBJECTS = accountdao.o \
databasemanager.o \
account.o \
test_accountdao.o
DIST = /usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/spec_pre.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/unix.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/linux.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/sanitize.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/gcc-base.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/gcc-base-unix.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/g++-base.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/g++-unix.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/qconfig.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_concurrent.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_core.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_core_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_dbus.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_dbus_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfs_kms_gbm_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_example_icons_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_examples_asset_downloader_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_fb_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_gui.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_gui_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_input_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_kms_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_network.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_network_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_opengl.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_opengl_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_openglwidgets.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_printsupport.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_printsupport_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_sql.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_sql_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testinternals_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testlib.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testlib_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandclient.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandclient_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandglobal_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_widgets.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_widgets_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_wl_shell_integration_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xml.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xml_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt_functions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt_config.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/linux-g++/qmake.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/spec_post.prf \
.qmake.stash \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/exclusive_builds.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/toolchain.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/default_pre.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resolve_config.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/default_post.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/warn_on.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/permissions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resources_functions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resources.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/moc.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/testlib_defines.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/unix/opengl.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/unix/thread.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qmake_use.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/file_copies.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/testcase_targets.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/exceptions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/yacc.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/lex.prf \
test_accountdao.pro ../../src/db/dao/accountdao.cpp \
../../src/db/databasemanager.cpp \
../../src/core/models/account.cpp \
test_accountdao.cpp
QMAKE_TARGET = test_accountdao
DESTDIR =
TARGET = test_accountdao
first: all
####### Build rules
test_accountdao: $(OBJECTS)
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
Makefile: test_accountdao.pro /usr/lib/x86_64-linux-gnu/qt6/mkspecs/linux-g++/qmake.conf /usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/spec_pre.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/unix.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/linux.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/sanitize.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/gcc-base.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/gcc-base-unix.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/g++-base.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/g++-unix.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/qconfig.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_concurrent.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_core.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_core_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_dbus.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_dbus_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfs_kms_gbm_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_example_icons_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_examples_asset_downloader_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_fb_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_gui.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_gui_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_input_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_kms_support_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_network.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_network_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_opengl.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_opengl_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_openglwidgets.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_printsupport.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_printsupport_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_sql.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_sql_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testinternals_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testlib.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testlib_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandclient.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandclient_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandglobal_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_widgets.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_widgets_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_wl_shell_integration_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xml.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xml_private.pri \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt_functions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt_config.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/linux-g++/qmake.conf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/spec_post.prf \
.qmake.stash \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/exclusive_builds.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/toolchain.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/default_pre.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resolve_config.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/default_post.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/warn_on.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/permissions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resources_functions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resources.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/moc.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/testlib_defines.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/unix/opengl.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/unix/thread.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qmake_use.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/file_copies.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/testcase_targets.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/exceptions.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/yacc.prf \
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/lex.prf \
test_accountdao.pro \
/usr/lib/x86_64-linux-gnu/libQt6Gui.prl \
/usr/lib/x86_64-linux-gnu/libQt6Test.prl \
/usr/lib/x86_64-linux-gnu/libQt6Sql.prl \
/usr/lib/x86_64-linux-gnu/libQt6Core.prl
$(QMAKE) -o Makefile test_accountdao.pro
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/spec_pre.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/unix.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/linux.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/sanitize.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/gcc-base.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/gcc-base-unix.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/g++-base.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/common/g++-unix.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/qconfig.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_concurrent.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_core.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_core_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_dbus.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_dbus_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_devicediscovery_support_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfs_kms_gbm_support_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_example_icons_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_examples_asset_downloader_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_fb_support_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_gui.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_gui_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_input_support_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_kms_support_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_network.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_network_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_opengl.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_opengl_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_openglwidgets.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_printsupport.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_printsupport_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_sql.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_sql_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testinternals_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testlib.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_testlib_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandclient.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandclient_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_waylandglobal_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_widgets.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_widgets_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_wl_shell_integration_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xml.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/modules/qt_lib_xml_private.pri:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt_functions.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt_config.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/linux-g++/qmake.conf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/spec_post.prf:
.qmake.stash:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/exclusive_builds.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/toolchain.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/default_pre.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resolve_config.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/default_post.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/warn_on.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/permissions.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qt.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resources_functions.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/resources.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/moc.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/testlib_defines.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/unix/opengl.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/unix/thread.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/qmake_use.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/file_copies.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/testcase_targets.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/exceptions.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/yacc.prf:
/usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/lex.prf:
test_accountdao.pro:
/usr/lib/x86_64-linux-gnu/libQt6Gui.prl:
/usr/lib/x86_64-linux-gnu/libQt6Test.prl:
/usr/lib/x86_64-linux-gnu/libQt6Sql.prl:
/usr/lib/x86_64-linux-gnu/libQt6Core.prl:
qmake: FORCE
@$(QMAKE) -o Makefile test_accountdao.pro
qmake_all: FORCE
all: Makefile test_accountdao
dist: distdir FORCE
(cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR)
distdir: FORCE
@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
$(COPY_FILE) --parents /usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/data/dummy.cpp $(DISTDIR)/
$(COPY_FILE) --parents ../../src/db/dao/accountdao.cpp ../../src/db/databasemanager.cpp ../../src/core/models/account.cpp test_accountdao.cpp $(DISTDIR)/
clean: compiler_clean
-$(DEL_FILE) $(OBJECTS)
-$(DEL_FILE) *~ core *.core
distclean: clean
-$(DEL_FILE) $(TARGET)
-$(DEL_FILE) .qmake.stash
-$(DEL_FILE) Makefile
####### Sub-libraries
mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean
mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all
check: first
benchmark: first
compiler_rcc_make_all:
compiler_rcc_clean:
compiler_moc_predefs_make_all: moc_predefs.h
compiler_moc_predefs_clean:
-$(DEL_FILE) moc_predefs.h
moc_predefs.h: /usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/data/dummy.cpp
g++ -pipe -O2 -std=gnu++1z -Wall -Wextra -dM -E -o moc_predefs.h /usr/lib/x86_64-linux-gnu/qt6/mkspecs/features/data/dummy.cpp
compiler_moc_header_make_all:
compiler_moc_header_clean:
compiler_moc_objc_header_make_all:
compiler_moc_objc_header_clean:
compiler_moc_source_make_all: test_accountdao.moc
compiler_moc_source_clean:
-$(DEL_FILE) test_accountdao.moc
test_accountdao.moc: test_accountdao.cpp \
../../src/db/dao/accountdao.h \
../../src/db/databasemanager.h \
../../src/core/models/account.h \
moc_predefs.h \
/usr/lib/qt6/libexec/moc
/usr/lib/qt6/libexec/moc $(DEFINES) --include /mnt/c/Users/javie/wino-mail-dtkqt/tests/unit/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt6/mkspecs/linux-g++ -I/mnt/c/Users/javie/wino-mail-dtkqt/tests/unit -I/mnt/c/Users/javie/wino-mail-dtkqt/src -I/mnt/c/Users/javie/wino-mail-dtkqt/src/services -I/mnt/c/Users/javie/wino-mail-dtkqt/src/db -I/mnt/c/Users/javie/wino-mail-dtkqt/src/db/dao -I/mnt/c/Users/javie/wino-mail-dtkqt/src/core -I/mnt/c/Users/javie/wino-mail-dtkqt/src/core/models -I/usr/include/x86_64-linux-gnu/qt6 -I/usr/include/x86_64-linux-gnu/qt6/QtGui -I/usr/include/x86_64-linux-gnu/qt6/QtTest -I/usr/include/x86_64-linux-gnu/qt6/QtSql -I/usr/include/x86_64-linux-gnu/qt6/QtCore -I/usr/include/c++/15 -I/usr/include/x86_64-linux-gnu/c++/15 -I/usr/include/c++/15/backward -I/usr/lib/gcc/x86_64-linux-gnu/15/include -I/usr/local/include -I/usr/include/x86_64-linux-gnu -I/usr/include test_accountdao.cpp -o test_accountdao.moc
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: compiler_moc_predefs_clean compiler_moc_source_clean
####### Compile
accountdao.o: ../../src/db/dao/accountdao.cpp ../../src/db/dao/accountdao.h \
../../src/db/databasemanager.h \
../../src/core/models/account.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o accountdao.o ../../src/db/dao/accountdao.cpp
databasemanager.o: ../../src/db/databasemanager.cpp ../../src/db/databasemanager.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o databasemanager.o ../../src/db/databasemanager.cpp
account.o: ../../src/core/models/account.cpp ../../src/core/models/account.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o account.o ../../src/core/models/account.cpp
test_accountdao.o: test_accountdao.cpp ../../src/db/dao/accountdao.h \
../../src/db/databasemanager.h \
../../src/core/models/account.h \
test_accountdao.moc
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o test_accountdao.o test_accountdao.cpp
####### Install
install: FORCE
uninstall: FORCE
FORCE:
.SUFFIXES:
+475
View File
@@ -0,0 +1,475 @@
#define __DBL_MIN_EXP__ (-1021)
#define __LDBL_MANT_DIG__ 64
#define __cpp_nontype_template_parameter_auto 201606L
#define __UINT_LEAST16_MAX__ 0xffff
#define __FLT16_HAS_QUIET_NAN__ 1
#define __ATOMIC_ACQUIRE 2
#define __FLT128_MAX_10_EXP__ 4932
#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F
#define __GCC_IEC_559_COMPLEX 2
#define __cpp_aggregate_nsdmi 201304L
#define __UINT_LEAST8_TYPE__ unsigned char
#define __SIZEOF_FLOAT80__ 16
#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16
#define __INTMAX_C(c) c ## L
#define __CHAR_BIT__ 8
#define __UINT8_MAX__ 0xff
#define __SCHAR_WIDTH__ 8
#define __WINT_MAX__ 0xffffffffU
#define __FLT32_MIN_EXP__ (-125)
#define __cpp_static_assert 201411L
#define __BFLT16_MIN_10_EXP__ (-37)
#define __cpp_inheriting_constructors 201511L
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __WCHAR_MAX__ 0x7fffffff
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_IEC_559 2
#define __FLT32X_DECIMAL_DIG__ 17
#define __FLT_EVAL_METHOD__ 0
#define __cpp_binary_literals 201304L
#define __FLT64_DECIMAL_DIG__ 17
#define __CET__ 3
#define __cpp_noexcept_function_type 201510L
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __cpp_variadic_templates 200704L
#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL
#define __SIG_ATOMIC_TYPE__ int
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __cpp_variable_templates 201304L
#define __FLT32X_MAX_EXP__ 1024
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __FLT32_HAS_DENORM__ 1
#define __UINT_FAST8_MAX__ 0xff
#define __cpp_rvalue_reference 200610L
#define __cpp_nested_namespace_definitions 201411L
#define __DEC64_MAX_EXP__ 385
#define __INT8_C(c) c
#define __LDBL_HAS_INFINITY__ 1
#define __INT_LEAST8_WIDTH__ 8
#define __cpp_variadic_using 201611L
#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL
#define __INT_LEAST8_MAX__ 0x7f
#define __cpp_attributes 200809L
#define __cpp_capture_star_this 201603L
#define __SHRT_MAX__ 0x7fff
#define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L
#define __FLT64X_MAX_10_EXP__ 4932
#define __cpp_if_constexpr 201606L
#define __BFLT16_MAX_10_EXP__ 38
#define __BFLT16_MAX_EXP__ 128
#define __LDBL_IS_IEC_60559__ 1
#define __FLT64X_HAS_QUIET_NAN__ 1
#define __UINT_LEAST8_MAX__ 0xff
#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128
#define __UINTMAX_TYPE__ long unsigned int
#define __cpp_nsdmi 200809L
#define __BFLT16_DECIMAL_DIG__ 4
#define __linux 1
#define __DEC32_EPSILON__ 1E-6DF
#define __FLT_EVAL_METHOD_TS_18661_3__ 0
#define __OPTIMIZE__ 1
#define __UINT32_MAX__ 0xffffffffU
#define __GXX_EXPERIMENTAL_CXX0X__ 1
#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L)
#define __FLT128_MIN_EXP__ (-16381)
#define __DEC64X_MAX_EXP__ 6145
#define __WINT_MIN__ 0U
#define __FLT128_MIN_10_EXP__ (-4931)
#define __FLT32X_IS_IEC_60559__ 1
#define __INT_LEAST16_WIDTH__ 16
#define __SCHAR_MAX__ 0x7f
#define __FLT128_MANT_DIG__ 113
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __INT64_C(c) c ## L
#define __SSP_STRONG__ 3
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __ATOMIC_SEQ_CST 5
#define _FORTIFY_SOURCE 3
#define __unix 1
#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL
#define __FLT32X_MANT_DIG__ 53
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __cpp_aligned_new 201606L
#define __FLT32_MAX_10_EXP__ 38
#define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x
#define __STDC_HOSTED__ 1
#define __DEC64_MIN_EXP__ (-382)
#define __cpp_decltype_auto 201304L
#define __DBL_DIG__ 15
#define __STDC_EMBED_EMPTY__ 2
#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F
#define __GXX_WEAK__ 1
#define __SHRT_WIDTH__ 16
#define __FLT32_IS_IEC_60559__ 1
#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
#define __DBL_IS_IEC_60559__ 1
#define __DEC32_MAX__ 9.999999E96DF
#define __cpp_threadsafe_static_init 200806L
#define __cpp_enumerator_attributes 201411L
#define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x
#define __FLT32X_HAS_INFINITY__ 1
#define __unix__ 1
#define __INT_WIDTH__ 32
#define __STDC_IEC_559__ 1
#define __STDC_ISO_10646__ 201706L
#define __DECIMAL_DIG__ 21
#define __STDC_IEC_559_COMPLEX__ 1
#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64
#define __gnu_linux__ 1
#define __INT16_MAX__ 0x7fff
#define __FLT64_MIN_EXP__ (-1021)
#define __DEC64X_EPSILON__ 1E-33D64x
#define __FLT64X_MIN_10_EXP__ (-4931)
#define __LDBL_HAS_QUIET_NAN__ 1
#define __FLT16_MIN_EXP__ (-13)
#define __FLT64_MANT_DIG__ 53
#define __FLT64X_MANT_DIG__ 64
#define __BFLT16_DIG__ 2
#define __GNUC__ 15
#define __GXX_RTTI 1
#define __pie__ 2
#define __MMX__ 1
#define __FLT_HAS_DENORM__ 1
#define __SIZEOF_LONG_DOUBLE__ 16
#define __BIGGEST_ALIGNMENT__ 16
#define __STDC_UTF_16__ 1
#define __FLT64_MAX_10_EXP__ 308
#define __BFLT16_IS_IEC_60559__ 0
#define __FLT16_MAX_10_EXP__ 4
#define __cpp_delegating_constructors 200604L
#define __DBL_MAX__ double(1.79769313486231570814527423731704357e+308L)
#define __cpp_raw_strings 200710L
#define __INT_FAST32_MAX__ 0x7fffffffffffffffL
#define __DBL_HAS_INFINITY__ 1
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __SIZEOF_FLOAT__ 4
#define __HAVE_SPECULATION_SAFE_VALUE 1
#define __cpp_fold_expressions 201603L
#define __DEC32_MIN_EXP__ (-94)
#define __INTPTR_WIDTH__ 64
#define __UINT_LEAST32_MAX__ 0xffffffffU
#define __FLT32X_HAS_DENORM__ 1
#define __INT_FAST16_TYPE__ long int
#define __MMX_WITH_SSE__ 1
#define __LDBL_HAS_DENORM__ 1
#define __SEG_GS 1
#define __cplusplus 201703L
#define __cpp_ref_qualifiers 200710L
#define __DEC32_MIN__ 1E-95DF
#define __DEPRECATED 1
#define __cpp_rvalue_references 200610L
#define __DBL_MAX_EXP__ 1024
#define __WCHAR_WIDTH__ 32
#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32
#define __DEC128_EPSILON__ 1E-33DL
#define __FLT16_DECIMAL_DIG__ 5
#define __SSE2_MATH__ 1
#define __ATOMIC_HLE_RELEASE 131072
#define __PTRDIFF_MAX__ 0x7fffffffffffffffL
#define __amd64 1
#define __DEC64X_MAX__ 9.999999999999999999999999999999999E6144D64x
#define __ATOMIC_HLE_ACQUIRE 65536
#define __GNUG__ 15
#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL
#define __SIZEOF_SIZE_T__ 8
#define __BFLT16_HAS_INFINITY__ 1
#define __FLT64X_MIN_EXP__ (-16381)
#define __SIZEOF_WINT_T__ 4
#define __FLT32X_DIG__ 15
#define __LONG_LONG_WIDTH__ 64
#define __cpp_initializer_lists 200806L
#define __FLT32_MAX_EXP__ 128
#define __cpp_hex_float 201603L
#define __GXX_ABI_VERSION 1020
#define __FLT_MIN_EXP__ (-125)
#define __GCC_HAVE_DWARF2_CFI_ASM 1
#define __x86_64 1
#define __cpp_lambdas 200907L
#define __INT_FAST64_TYPE__ long int
#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16
#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64
#define __cpp_template_auto 201606L
#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16
#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128
#define __FLT64X_NORM_MAX__ 1.18973149535723176502126385303097021e+4932F64x
#define __SIZEOF_POINTER__ 8
#define __SIZE_TYPE__ long unsigned int
#define __LP64__ 1
#define __DBL_HAS_QUIET_NAN__ 1
#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x
#define __LDBL_MAX_EXP__ 16384
#define __DECIMAL_BID_FORMAT__ 1
#define __FLT64_MIN_10_EXP__ (-307)
#define __FLT16_MIN_10_EXP__ (-4)
#define __FLT64X_DECIMAL_DIG__ 21
#define __DEC128_MIN__ 1E-6143DL
#define __REGISTER_PREFIX__
#define __UINT16_MAX__ 0xffff
#define __FLT128_HAS_INFINITY__ 1
#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32
#define __UINT8_TYPE__ unsigned char
#define __FLT_DIG__ 6
#define __DEC_EVAL_METHOD__ 2
#define __FLT_MANT_DIG__ 24
#define __LDBL_DECIMAL_DIG__ 21
#define __VERSION__ "15.2.0"
#define __UINT64_C(c) c ## UL
#define __cpp_unicode_characters 201411L
#define __DEC64X_MIN__ 1E-6143D64x
#define _STDC_PREDEF_H 1
#define __INT_LEAST32_MAX__ 0x7fffffff
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __FLT128_MAX_EXP__ 16384
#define __FLT32_MANT_DIG__ 24
#define __cpp_decltype 200707L
#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __FLT32X_MIN_EXP__ (-1021)
#define __STDC_IEC_60559_COMPLEX__ 201404L
#define __cpp_aggregate_bases 201603L
#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16
#define __FLT128_HAS_DENORM__ 1
#define __FLT32_DECIMAL_DIG__ 9
#define __FLT128_DIG__ 33
#define __INT32_C(c) c
#define __DEC64_EPSILON__ 1E-15DD
#define __ORDER_PDP_ENDIAN__ 3412
#define __DEC128_MIN_EXP__ (-6142)
#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
#define __INT_FAST32_TYPE__ long int
#define __UINT_LEAST16_TYPE__ short unsigned int
#define __DEC64X_MANT_DIG__ 34
#define __DEC128_MAX_EXP__ 6145
#define unix 1
#define __DBL_HAS_DENORM__ 1
#define __cpp_rtti 199711L
#define __UINT64_MAX__ 0xffffffffffffffffUL
#define __FLT_IS_IEC_60559__ 1
#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE"
#define __FLT64X_DIG__ 18
#define __INT8_TYPE__ signed char
#define __cpp_digit_separators 201309L
#define __ELF__ 1
#define __GCC_ASM_FLAG_OUTPUTS__ 1
#define __UINT32_TYPE__ unsigned int
#define __BFLT16_HAS_QUIET_NAN__ 1
#define __FLT_RADIX__ 2
#define __INT_LEAST16_TYPE__ short int
#define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L
#define __UINTMAX_C(c) c ## UL
#define __FLT16_DIG__ 3
#define __k8 1
#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x
#define __SIG_ATOMIC_MAX__ 0x7fffffff
#define __cpp_constexpr 201603L
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __USER_LABEL_PREFIX__
#define __STDC_IEC_60559_BFP__ 201404L
#define __SIZEOF_PTRDIFF_T__ 8
#define __FLT64X_HAS_INFINITY__ 1
#define __SIZEOF_LONG__ 8
#define __LDBL_DIG__ 18
#define __FLT64_IS_IEC_60559__ 1
#define __x86_64__ 1
#define __FLT16_IS_IEC_60559__ 1
#define __FLT16_MAX_EXP__ 16
#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
#define __STDC_EMBED_FOUND__ 1
#define __INT_FAST16_MAX__ 0x7fffffffffffffffL
#define __GCC_CONSTRUCTIVE_SIZE 64
#define __FLT64_DIG__ 15
#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL
#define __UINT_LEAST64_TYPE__ long unsigned int
#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MAX_10_EXP__ 38
#define __FLT64X_HAS_DENORM__ 1
#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
#define __FLT_HAS_INFINITY__ 1
#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8"
#define __cpp_unicode_literals 200710L
#define __UINT_FAST16_TYPE__ long unsigned int
#define __DEC64_MAX__ 9.999999999999999E384DD
#define __STDC_EMBED_NOT_FOUND__ 0
#define __INT_FAST32_WIDTH__ 64
#define __CHAR16_TYPE__ short unsigned int
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __DEC64X_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143D64x
#define __SIZE_WIDTH__ 64
#define __SEG_FS 1
#define __INT_LEAST16_MAX__ 0x7fff
#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16
#define __DEC64_MANT_DIG__ 16
#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32
#define __SIG_ATOMIC_WIDTH__ 32
#define __INT_LEAST64_TYPE__ long int
#define __INT16_TYPE__ short int
#define __INT_LEAST8_TYPE__ signed char
#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16
#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128
#define __cpp_structured_bindings 201606L
#define __SIZEOF_INT__ 4
#define __DEC32_MAX_EXP__ 97
#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16
#define __INT_FAST8_MAX__ 0x7f
#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128
#define __INTPTR_MAX__ 0x7fffffffffffffffL
#define __cpp_sized_deallocation 201309L
#define __cpp_guaranteed_copy_elision 201606L
#define linux 1
#define __FLT64_HAS_QUIET_NAN__ 1
#define __FLT32_MIN_10_EXP__ (-37)
#define __EXCEPTIONS 1
#define __UINT16_C(c) c
#define __PTRDIFF_WIDTH__ 64
#define __cpp_range_based_for 201603L
#define __INT_FAST16_WIDTH__ 64
#define __FLT64_HAS_INFINITY__ 1
#define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x
#define __FLT16_HAS_INFINITY__ 1
#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16
#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
#define __code_model_small__ 1
#define __GCC_ATOMIC_LONG_LOCK_FREE 2
#define __cpp_nontype_template_args 201411L
#define __DEC32_MANT_DIG__ 7
#define __k8__ 1
#define __INTPTR_TYPE__ long int
#define __UINT16_TYPE__ short unsigned int
#define __WCHAR_TYPE__ int
#define __pic__ 2
#define __UINTPTR_MAX__ 0xffffffffffffffffUL
#define __INT_FAST64_WIDTH__ 64
#define __INT_FAST64_MAX__ 0x7fffffffffffffffL
#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F
#define __FLT32_HAS_INFINITY__ 1
#define __FLT64X_MAX_EXP__ 16384
#define __UINT_FAST64_TYPE__ long unsigned int
#define __cpp_inline_variables 201606L
#define __BFLT16_MIN_EXP__ (-125)
#define __INT_MAX__ 0x7fffffff
#define __linux__ 1
#define __INT64_TYPE__ long int
#define __FLT_MAX_EXP__ 128
#define __ORDER_BIG_ENDIAN__ 4321
#define __DBL_MANT_DIG__ 53
#define __SIZEOF_FLOAT128__ 16
#define __BFLT16_MANT_DIG__ 8
#define __DEC64_MIN__ 1E-383DD
#define __WINT_TYPE__ unsigned int
#define __UINT_LEAST32_TYPE__ unsigned int
#define __SIZEOF_SHORT__ 2
#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32
#define __SSE__ 1
#define __LDBL_MIN_EXP__ (-16381)
#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64
#define __DEC64X_MIN_EXP__ (-6142)
#define __amd64__ 1
#define __WINT_WIDTH__ 32
#define __INT_LEAST64_WIDTH__ 64
#define __FLT32X_MAX_10_EXP__ 308
#define __cpp_namespace_attributes 201411L
#define __SIZEOF_INT128__ 16
#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16
#define __FLT64X_IS_IEC_60559__ 1
#define __GXX_CONSTEXPR_ASM__ 1
#define __LDBL_MAX_10_EXP__ 4932
#define __ATOMIC_RELAXED 0
#define __DBL_EPSILON__ double(2.22044604925031308084726333618164062e-16L)
#define __INT_LEAST32_TYPE__ int
#define _LP64 1
#define __UINT8_C(c) c
#define __FLT64_MAX_EXP__ 1024
#define __cpp_return_type_deduction 201304L
#define __SIZEOF_WCHAR_T__ 4
#define __GNUC_PATCHLEVEL__ 0
#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128
#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64
#define __FLT128_HAS_QUIET_NAN__ 1
#define __INTMAX_MAX__ 0x7fffffffffffffffL
#define __INT_FAST8_TYPE__ signed char
#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x
#define __STDCPP_THREADS__ 1
#define __BFLT16_HAS_DENORM__ 1
#define __GNUC_STDC_INLINE__ 1
#define __FLT64_HAS_DENORM__ 1
#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32
#define __FLT16_HAS_DENORM__ 1
#define __DBL_DECIMAL_DIG__ 17
#define __STDC_UTF_32__ 1
#define __INT_FAST8_WIDTH__ 8
#define __FXSR__ 1
#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x
#define __DBL_NORM_MAX__ double(1.79769313486231570814527423731704357e+308L)
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __GCC_DESTRUCTIVE_SIZE 64
#define __INTMAX_WIDTH__ 64
#define __cpp_runtime_arrays 198712L
#define __FLT32_DIG__ 6
#define __UINT64_TYPE__ long unsigned int
#define __UINT32_C(c) c ## U
#define __cpp_alias_templates 200704L
#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F
#define __FLT128_IS_IEC_60559__ 1
#define __INT8_MAX__ 0x7f
#define __LONG_WIDTH__ 64
#define __DBL_MIN__ double(2.22507385850720138309023271733240406e-308L)
#define __PIC__ 2
#define __INT32_MAX__ 0x7fffffff
#define __UINT_FAST32_TYPE__ long unsigned int
#define __FLT16_MANT_DIG__ 11
#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x
#define __CHAR32_TYPE__ unsigned int
#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F
#define __SSE2__ 1
#define __cpp_deduction_guides 201703L
#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16
#define __INT32_TYPE__ int
#define __SIZEOF_DOUBLE__ 8
#define __cpp_exceptions 199711L
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64
#define __INT_LEAST32_WIDTH__ 32
#define __INTMAX_TYPE__ long int
#define __GLIBCXX_BITSIZE_INT_N_0 128
#define __FLT32X_HAS_QUIET_NAN__ 1
#define __ATOMIC_CONSUME 1
#define __GNUC_MINOR__ 2
#define __GLIBCXX_TYPE_INT_N_0 __int128
#define __UINTMAX_MAX__ 0xffffffffffffffffUL
#define __PIE__ 2
#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x
#define __cpp_template_template_args 201611L
#define __DBL_MAX_10_EXP__ 308
#define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L
#define __INT16_C(c) c
#define __STDC__ 1
#define __PTRDIFF_TYPE__ long int
#define __LONG_MAX__ 0x7fffffffffffffffL
#define __FLT32X_MIN_10_EXP__ (-307)
#define __UINTPTR_TYPE__ long unsigned int
#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
#define __DEC128_MANT_DIG__ 34
#define __LDBL_MIN_10_EXP__ (-4931)
#define __cpp_generic_lambdas 201304L
#define __SSE_MATH__ 1
#define __SIZEOF_LONG_LONG__ 8
#define __cpp_user_defined_literals 200809L
#define __FLT128_DECIMAL_DIG__ 36
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
#define __FLT32_HAS_QUIET_NAN__ 1
#define __FLT_DECIMAL_DIG__ 9
#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL
#define __LDBL_NORM_MAX__ 1.18973149535723176502126385303097021e+4932L
#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
#define __SIZE_MAX__ 0xffffffffffffffffUL
#define __UINT_FAST8_TYPE__ unsigned char
#define _GNU_SOURCE 1
#define __cpp_init_captures 201304L
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_RELEASE 3
Binary file not shown.
+109 -52
View File
@@ -2,6 +2,8 @@
#include "../../src/db/dao/accountdao.h"
#include "../../src/db/databasemanager.h"
#include "../../src/core/models/account.h"
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
class TestAccountDao : public QObject
{
@@ -16,90 +18,145 @@ private slots:
void TestAccountDao::initTestCase()
{
DatabaseManager::instance().openDatabase(":memory:");
DatabaseManager::instance().createTables();
// Use in-memory SQLite database
// Ensure fresh connection by removing previous connection
QSqlDatabase::removeDatabase(QStringLiteral("wino_mail_connection"));
QVERIFY(DatabaseManager::instance().initialize(QStringLiteral(":memory:")));
// Create tables (initialize will do it)
}
void TestAccountDao::cleanupTestCase()
{
DatabaseManager::instance().closeDatabase();
// Database will be closed automatically in destructor
}
void TestAccountDao::testInsertAndFind()
{
Account account;
account.setEmail("test@example.com");
account.setProvider("IMAP");
account.setHost("imap.example.com");
account.setPort(993);
account.setUsername("testuser");
account.setPassword("testpass");
account.setUseSsl(true);
account.setEmail(QStringLiteral("test@example.com"));
account.setDisplayName(QStringLiteral("Test User"));
account.setSignature(QStringLiteral("Test sig"));
account.setType(AccountType::IMAP);
Account::ConnectionSettings settings;
settings.type = QStringLiteral("imap");
settings.incomingHost = QStringLiteral("imap.example.com");
settings.incomingPort = 993;
settings.incomingSsl = true;
settings.outgoingHost = QStringLiteral("smtp.example.com");
settings.outgoingPort = 465;
settings.outgoingSsl = true;
settings.username = QStringLiteral("testuser");
settings.password = QStringLiteral("testpass");
settings.authMethod = QStringLiteral("plain");
account.setConnectionSettings(settings);
bool inserted = AccountDao::insert(account);
QVERIFY(inserted);
QVERIFY(account.id() > 0);
qint64 insertedId = AccountDao::insert(account);
QVERIFY(insertedId != -1);
// Optionally set id on account for later use (if needed)
// account.setId(insertedId);
Account found = AccountDao::findById(account.id());
QVERIFY(found.isValid());
QCOMPARE(found.email(), QString("test@example.com"));
QCOMPARE(found.provider(), QString("IMAP"));
QCOMPARE(found.host(), QString("imap.example.com"));
QCOMPARE(found.port(), 993);
QCOMPARE(found.username(), QString("testuser"));
QCOMPARE(found.password(), QString("testpass"));
QVERIFY(found.useSsl());
Account* foundPtr = AccountDao::findById(insertedId);
QVERIFY(foundPtr != nullptr);
Account found = *foundPtr;
QCOMPARE(found.id(), insertedId);
QCOMPARE(found.email(), QStringLiteral("test@example.com"));
QCOMPARE(found.displayName(), QStringLiteral("Test User"));
QCOMPARE(found.signature(), QStringLiteral("Test sig"));
QCOMPARE(found.type(), AccountType::IMAP);
QCOMPARE(found.connectionSettings().incomingHost, QStringLiteral("imap.example.com"));
QCOMPARE(found.connectionSettings().incomingPort, 993);
QVERIFY(found.connectionSettings().incomingSsl);
QCOMPARE(found.connectionSettings().username, QStringLiteral("testuser"));
QCOMPARE(found.connectionSettings().password, QStringLiteral("testpass"));
QCOMPARE(found.connectionSettings().authMethod, QStringLiteral("plain"));
}
void TestAccountDao::testUpdate()
{
Account account;
account.setEmail("original@example.com");
account.setProvider("IMAP");
account.setHost("imap.example.com");
account.setPort(993);
account.setUsername("user");
account.setPassword("pass");
account.setUseSsl(true);
account.setEmail(QStringLiteral("original@example.com"));
account.setDisplayName(QStringLiteral("Original User"));
account.setType(AccountType::IMAP);
Account::ConnectionSettings settings;
settings.type = QStringLiteral("imap");
settings.incomingHost = QStringLiteral("imap.example.com");
settings.incomingPort = 993;
settings.incomingSsl = true;
settings.outgoingHost = QStringLiteral("smtp.example.com");
settings.outgoingPort = 465;
settings.outgoingSsl = true;
settings.username = QStringLiteral("user");
settings.password = QStringLiteral("pass");
settings.authMethod = QStringLiteral("plain");
account.setConnectionSettings(settings);
bool inserted = AccountDao::insert(account);
QVERIFY(inserted);
qint64 id = account.id();
qint64 insertedId = AccountDao::insert(account);
QVERIFY(insertedId != -1);
qint64 id = insertedId;
account.setEmail("updated@example.com");
account.setProvider("Gmail");
account.setUseSsl(false);
// Modify
account.setEmail(QStringLiteral("updated@example.com"));
account.setDisplayName(QStringLiteral("Updated User"));
account.setType(AccountType::Gmail);
Account::ConnectionSettings newSettings;
newSettings.type = QStringLiteral("imap");
newSettings.incomingHost = QStringLiteral("imap.gmail.com");
newSettings.incomingPort = 993;
newSettings.incomingSsl = true;
newSettings.outgoingHost = QStringLiteral("smtp.gmail.com");
newSettings.outgoingPort = 465;
newSettings.outgoingSsl = true;
newSettings.username = QStringLiteral("user2");
newSettings.password = QStringLiteral("newpass");
newSettings.authMethod = QStringLiteral("plain");
account.setConnectionSettings(newSettings);
bool updated = AccountDao::update(account);
QVERIFY(updated);
Account found = AccountDao::findById(id);
QVERIFY(found.isValid());
QCOMPARE(found.email(), QString("updated@example.com"));
QCOMPARE(found.provider(), QString("Gmail"));
QVERIFY(!found.useSsl());
Account* foundPtr = AccountDao::findById(id);
QVERIFY(foundPtr != nullptr);
Account found = *foundPtr;
QCOMPARE(found.id(), id);
QCOMPARE(found.email(), QStringLiteral("updated@example.com"));
QCOMPARE(found.displayName(), QStringLiteral("Updated User"));
QCOMPARE(found.type(), AccountType::Gmail);
QCOMPARE(found.connectionSettings().incomingHost, QStringLiteral("imap.gmail.com"));
QCOMPARE(found.connectionSettings().incomingPort, 993);
QVERIFY(found.connectionSettings().incomingSsl);
QCOMPARE(found.connectionSettings().username, QStringLiteral("user2"));
QCOMPARE(found.connectionSettings().password, QStringLiteral("newpass"));
QCOMPARE(found.connectionSettings().authMethod, QStringLiteral("plain"));
}
void TestAccountDao::testRemove()
{
Account account;
account.setEmail("todelete@example.com");
account.setProvider("IMAP");
account.setHost("imap.example.com");
account.setPort(993);
account.setUsername("user");
account.setPassword("pass");
account.setUseSsl(true);
account.setEmail(QStringLiteral("todelete@example.com"));
account.setType(AccountType::IMAP);
Account::ConnectionSettings settings;
settings.type = QStringLiteral("imap");
settings.incomingHost = QStringLiteral("imap.example.com");
settings.incomingPort = 993;
settings.incomingSsl = true;
settings.outgoingHost = QStringLiteral("smtp.example.com");
settings.outgoingPort = 465;
settings.outgoingSsl = true;
settings.username = QStringLiteral("user");
settings.password = QStringLiteral("pass");
settings.authMethod = QStringLiteral("plain");
account.setConnectionSettings(settings);
bool inserted = AccountDao::insert(account);
QVERIFY(inserted);
qint64 id = account.id();
qint64 insertedId = AccountDao::insert(account);
QVERIFY(insertedId != -1);
qint64 id = insertedId;
bool removed = AccountDao::remove(id);
QVERIFY(removed);
Account found = AccountDao::findById(id);
QVERIFY(!found.isValid());
Account* foundPtr = AccountDao::findById(id);
QVERIFY(foundPtr == nullptr);
}
QTEST_MAIN(TestAccountDao)
+124
View File
@@ -0,0 +1,124 @@
/****************************************************************************
** Meta object code from reading C++ file 'test_accountdao.cpp'
**
** Created by: The Qt Meta Object Compiler version 69 (Qt 6.10.2)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
#include <QtCore/qmetatype.h>
#include <QtCore/qtmochelpers.h>
#include <memory>
#include <QtCore/qxptype_traits.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'test_accountdao.cpp' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 69
#error "This file was generated using the moc from 6.10.2. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
#ifndef Q_CONSTINIT
#define Q_CONSTINIT
#endif
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
QT_WARNING_DISABLE_GCC("-Wuseless-cast")
namespace {
struct qt_meta_tag_ZN14TestAccountDaoE_t {};
} // unnamed namespace
template <> constexpr inline auto TestAccountDao::qt_create_metaobjectdata<qt_meta_tag_ZN14TestAccountDaoE_t>()
{
namespace QMC = QtMocConstants;
QtMocHelpers::StringRefStorage qt_stringData {
"TestAccountDao",
"initTestCase",
"",
"cleanupTestCase",
"testInsertAndFind",
"testUpdate",
"testRemove"
};
QtMocHelpers::UintData qt_methods {
// Slot 'initTestCase'
QtMocHelpers::SlotData<void()>(1, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'cleanupTestCase'
QtMocHelpers::SlotData<void()>(3, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'testInsertAndFind'
QtMocHelpers::SlotData<void()>(4, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'testUpdate'
QtMocHelpers::SlotData<void()>(5, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'testRemove'
QtMocHelpers::SlotData<void()>(6, 2, QMC::AccessPrivate, QMetaType::Void),
};
QtMocHelpers::UintData qt_properties {
};
QtMocHelpers::UintData qt_enums {
};
return QtMocHelpers::metaObjectData<TestAccountDao, qt_meta_tag_ZN14TestAccountDaoE_t>(QMC::MetaObjectFlag{}, qt_stringData,
qt_methods, qt_properties, qt_enums);
}
Q_CONSTINIT const QMetaObject TestAccountDao::staticMetaObject = { {
QMetaObject::SuperData::link<QObject::staticMetaObject>(),
qt_staticMetaObjectStaticContent<qt_meta_tag_ZN14TestAccountDaoE_t>.stringdata,
qt_staticMetaObjectStaticContent<qt_meta_tag_ZN14TestAccountDaoE_t>.data,
qt_static_metacall,
nullptr,
qt_staticMetaObjectRelocatingContent<qt_meta_tag_ZN14TestAccountDaoE_t>.metaTypes,
nullptr
} };
void TestAccountDao::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
auto *_t = static_cast<TestAccountDao *>(_o);
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: _t->initTestCase(); break;
case 1: _t->cleanupTestCase(); break;
case 2: _t->testInsertAndFind(); break;
case 3: _t->testUpdate(); break;
case 4: _t->testRemove(); break;
default: ;
}
}
(void)_a;
}
const QMetaObject *TestAccountDao::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}
void *TestAccountDao::qt_metacast(const char *_clname)
{
if (!_clname) return nullptr;
if (!strcmp(_clname, qt_staticMetaObjectStaticContent<qt_meta_tag_ZN14TestAccountDaoE_t>.strings))
return static_cast<void*>(this);
return QObject::qt_metacast(_clname);
}
int TestAccountDao::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QObject::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
if (_id < 5)
qt_static_metacall(this, _c, _id, _a);
_id -= 5;
}
if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
if (_id < 5)
*reinterpret_cast<QMetaType *>(_a[0]) = QMetaType();
_id -= 5;
}
return _id;
}
QT_WARNING_POP
+7
View File
@@ -0,0 +1,7 @@
QT += core testlib sql
CONFIG += console c++17
SOURCES += ../../src/db/dao/accountdao.cpp \
../../src/db/databasemanager.cpp \
../../src/core/models/account.cpp \
test_accountdao.cpp
INCLUDEPATH += ../../src ../../src/services ../../src/db ../../src/db/dao ../../src/core ../../src/core/models
+64
View File
@@ -0,0 +1,64 @@
#include <QtTest/QtTest>
#include <QFile>
#include <QStandardPaths>
#include "services/mimestorage.h"
class TestMimeStorage : public QObject
{
Q_OBJECT
private slots:
void storesRawMessageAndDecodedAttachments();
};
void TestMimeStorage::storesRawMessageAndDecodedAttachments()
{
QStandardPaths::setTestModeEnabled(true);
const QByteArray rawMime =
"Message-ID: <mime-test@example.com>\r\n"
"From: =?UTF-8?B?Sm9zw6k=?= <sender@example.com>\r\n"
"To: receiver@example.com\r\n"
"Subject: =?UTF-8?Q?Informe_de_prueba?=\r\n"
"Date: Tue, 11 Aug 2026 12:00:00 +0000\r\n"
"MIME-Version: 1.0\r\n"
"Content-Type: multipart/mixed; boundary=\"wino-boundary\"\r\n"
"\r\n"
"--wino-boundary\r\n"
"Content-Type: text/html; charset=UTF-8\r\n"
"Content-Transfer-Encoding: 8bit\r\n"
"\r\n"
"<p>Contenido completo</p>\r\n"
"--wino-boundary\r\n"
"Content-Type: application/octet-stream; name=\"datos.bin\"\r\n"
"Content-Disposition: attachment; filename=\"datos.bin\"\r\n"
"Content-Transfer-Encoding: base64\r\n"
"\r\n"
"AAECAwQF\r\n"
"--wino-boundary--\r\n";
MimeStorageService storage;
ParsedMimeMessage parsed;
QVERIFY(storage.parseMessage(rawMime, parsed));
QCOMPARE(parsed.subject, QStringLiteral("Informe de prueba"));
QCOMPARE(parsed.attachments.size(), 1);
QCOMPARE(parsed.attachments.first().fileName, QStringLiteral("datos.bin"));
QCOMPARE(parsed.attachments.first().data, QByteArray::fromHex("000102030405"));
MailItem item;
item.setMessageId(QStringLiteral("mime-test@example.com"));
QVector<QString> attachmentPaths;
QVERIFY(storage.storeMessage(QStringLiteral("account-test"), QStringLiteral("inbox"),
item, rawMime, &attachmentPaths));
QVERIFY(!item.fileId().isEmpty());
QCOMPARE(storage.readEmlFile(item.fileId()), rawMime);
QCOMPARE(item.attachments(), QVector<QString>{QStringLiteral("datos.bin")});
QCOMPARE(attachmentPaths.size(), 1);
QFile attachment(attachmentPaths.first());
QVERIFY(attachment.open(QIODevice::ReadOnly));
QCOMPARE(attachment.readAll(), QByteArray::fromHex("000102030405"));
QVERIFY(storage.getEmlFilePath(item.fileId()).endsWith(QStringLiteral(".eml")));
}
QTEST_MAIN(TestMimeStorage)
#include "test_mimestorage.moc"