File indexing completed on 2024-04-28 04:48:44

0001 /*
0002    SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #include "databasetestdata.h"
0008 
0009 #include "databaseinterface.h"
0010 #include "datatypes.h"
0011 #include "models/datamodel.h"
0012 
0013 #include <QObject>
0014 #include <QTemporaryFile>
0015 #include <QUrl>
0016 #include <QString>
0017 #include <QHash>
0018 #include <QVector>
0019 #include <QThread>
0020 #include <QStandardPaths>
0021 #include <QAbstractItemModelTester>
0022 
0023 #include <QDebug>
0024 
0025 #include <QSignalSpy>
0026 #include <QTest>
0027 
0028 class DataModelTests: public QObject, public DatabaseTestData
0029 {
0030     Q_OBJECT
0031 
0032 public:
0033 
0034     explicit DataModelTests(QObject *aParent = nullptr) : QObject(aParent)
0035     {
0036     }
0037 
0038 private Q_SLOTS:
0039 
0040     void initTestCase()
0041     {
0042         qRegisterMetaType<QHash<qulonglong,int>>("QHash<qulonglong,int>");
0043         qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>");
0044         qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>");
0045         qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>");
0046     }
0047 
0048     void removeOneTrack()
0049     {
0050         DatabaseInterface musicDb;
0051         DataModel albumsModel;
0052         QAbstractItemModelTester testModel(&albumsModel);
0053 
0054         connect(&musicDb, &DatabaseInterface::tracksAdded,
0055                 &albumsModel, &DataModel::tracksAdded);
0056         connect(&musicDb, &DatabaseInterface::trackRemoved,
0057                 &albumsModel, &DataModel::trackRemoved);
0058         connect(&musicDb, &DatabaseInterface::trackModified,
0059                 &albumsModel, &DataModel::trackModified);
0060 
0061         musicDb.init(QStringLiteral("testDb"));
0062 
0063         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
0064         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
0065         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
0066         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
0067         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
0068 
0069         QCOMPARE(beginInsertRowsSpy.count(), 0);
0070         QCOMPARE(endInsertRowsSpy.count(), 0);
0071         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0072         QCOMPARE(endRemoveRowsSpy.count(), 0);
0073         QCOMPARE(dataChangedSpy.count(), 0);
0074 
0075         musicDb.insertTracksList(mNewTracks, mNewCovers);
0076 
0077         QCOMPARE(beginInsertRowsSpy.count(), 0);
0078         QCOMPARE(endInsertRowsSpy.count(), 0);
0079         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0080         QCOMPARE(endRemoveRowsSpy.count(), 0);
0081         QCOMPARE(dataChangedSpy.count(), 0);
0082 
0083         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {},
0084                                musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {});
0085 
0086         QCOMPARE(beginInsertRowsSpy.count(), 0);
0087         QCOMPARE(endInsertRowsSpy.count(), 0);
0088         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0089         QCOMPARE(endRemoveRowsSpy.count(), 0);
0090         QCOMPARE(dataChangedSpy.count(), 0);
0091 
0092         albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))));
0093 
0094         QCOMPARE(albumsModel.rowCount(), 4);
0095         QCOMPARE(beginInsertRowsSpy.count(), 1);
0096         QCOMPARE(endInsertRowsSpy.count(), 1);
0097         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0098         QCOMPARE(endRemoveRowsSpy.count(), 0);
0099         QCOMPARE(dataChangedSpy.count(), 0);
0100 
0101         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
0102 
0103         auto firstTrack = musicDb.trackDataFromDatabaseId(trackId);
0104 
0105         musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()});
0106 
0107         QCOMPARE(albumsModel.rowCount(), 3);
0108         QCOMPARE(beginInsertRowsSpy.count(), 1);
0109         QCOMPARE(endInsertRowsSpy.count(), 1);
0110         QCOMPARE(beginRemoveRowsSpy.count(), 1);
0111         QCOMPARE(endRemoveRowsSpy.count(), 1);
0112         QCOMPARE(dataChangedSpy.count(), 0);
0113     }
0114 
0115     void removeOneAlbum()
0116     {
0117         DatabaseInterface musicDb;
0118         DataModel albumsModel;
0119         QAbstractItemModelTester testModel(&albumsModel);
0120 
0121         connect(&musicDb, &DatabaseInterface::tracksAdded,
0122                 &albumsModel, &DataModel::tracksAdded);
0123         connect(&musicDb, &DatabaseInterface::trackRemoved,
0124                 &albumsModel, &DataModel::trackRemoved);
0125         connect(&musicDb, &DatabaseInterface::trackModified,
0126                 &albumsModel, &DataModel::trackModified);
0127 
0128         musicDb.init(QStringLiteral("testDb"));
0129 
0130         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
0131         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
0132         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
0133         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
0134         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
0135 
0136         QCOMPARE(beginInsertRowsSpy.count(), 0);
0137         QCOMPARE(endInsertRowsSpy.count(), 0);
0138         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0139         QCOMPARE(endRemoveRowsSpy.count(), 0);
0140         QCOMPARE(dataChangedSpy.count(), 0);
0141 
0142         musicDb.insertTracksList(mNewTracks, mNewCovers);
0143 
0144         QCOMPARE(beginInsertRowsSpy.count(), 0);
0145         QCOMPARE(endInsertRowsSpy.count(), 0);
0146         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0147         QCOMPARE(endRemoveRowsSpy.count(), 0);
0148         QCOMPARE(dataChangedSpy.count(), 0);
0149 
0150         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {},
0151                                musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/")), {});
0152 
0153         QCOMPARE(beginInsertRowsSpy.count(), 0);
0154         QCOMPARE(endInsertRowsSpy.count(), 0);
0155         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0156         QCOMPARE(endRemoveRowsSpy.count(), 0);
0157         QCOMPARE(dataChangedSpy.count(), 0);
0158 
0159         albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"))));
0160 
0161         QCOMPARE(albumsModel.rowCount(), 3);
0162         QCOMPARE(beginInsertRowsSpy.count(), 1);
0163         QCOMPARE(endInsertRowsSpy.count(), 1);
0164         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0165         QCOMPARE(endRemoveRowsSpy.count(), 0);
0166         QCOMPARE(dataChangedSpy.count(), 0);
0167 
0168         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
0169                                                                          QStringLiteral("album3"), 1, 1);
0170         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
0171         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
0172                                                                           QStringLiteral("album3"), 2, 1);
0173         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
0174         auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"),
0175                                                                          QStringLiteral("album3"), 3, 1);
0176         auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId);
0177 
0178         musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl(),
0179                                   secondTrack[DataTypes::ResourceRole].toUrl(),
0180                                   thirdTrack[DataTypes::ResourceRole].toUrl()});
0181 
0182         QCOMPARE(albumsModel.rowCount(), 0);
0183         QCOMPARE(beginInsertRowsSpy.count(), 1);
0184         QCOMPARE(endInsertRowsSpy.count(), 1);
0185         QCOMPARE(beginRemoveRowsSpy.count(), 3);
0186         QCOMPARE(endRemoveRowsSpy.count(), 3);
0187         QCOMPARE(dataChangedSpy.count(), 0);
0188     }
0189 
0190     void addOneTrack()
0191     {
0192         DatabaseInterface musicDb;
0193         DataModel albumsModel;
0194         QAbstractItemModelTester testModel(&albumsModel);
0195 
0196         connect(&musicDb, &DatabaseInterface::tracksAdded,
0197                 &albumsModel, &DataModel::tracksAdded);
0198         connect(&musicDb, &DatabaseInterface::trackRemoved,
0199                 &albumsModel, &DataModel::trackRemoved);
0200         connect(&musicDb, &DatabaseInterface::trackModified,
0201                 &albumsModel, &DataModel::trackModified);
0202 
0203         musicDb.init(QStringLiteral("testDb"));
0204 
0205         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
0206         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
0207         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
0208         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
0209         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
0210 
0211         QCOMPARE(beginInsertRowsSpy.count(), 0);
0212         QCOMPARE(endInsertRowsSpy.count(), 0);
0213         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0214         QCOMPARE(endRemoveRowsSpy.count(), 0);
0215         QCOMPARE(dataChangedSpy.count(), 0);
0216 
0217         auto newFiles = QList<QUrl>();
0218         const auto &constNewTracks = mNewTracks;
0219         for (const auto &oneTrack : constNewTracks) {
0220             newFiles.push_back(oneTrack.resourceURI());
0221         }
0222 
0223         musicDb.insertTracksList(mNewTracks, mNewCovers);
0224 
0225         QCOMPARE(beginInsertRowsSpy.count(), 0);
0226         QCOMPARE(endInsertRowsSpy.count(), 0);
0227         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0228         QCOMPARE(endRemoveRowsSpy.count(), 0);
0229         QCOMPARE(dataChangedSpy.count(), 0);
0230 
0231         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {},
0232                                musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {});
0233 
0234         QCOMPARE(beginInsertRowsSpy.count(), 0);
0235         QCOMPARE(endInsertRowsSpy.count(), 0);
0236         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0237         QCOMPARE(endRemoveRowsSpy.count(), 0);
0238         QCOMPARE(dataChangedSpy.count(), 0);
0239 
0240         albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))));
0241 
0242         QCOMPARE(albumsModel.rowCount(), 4);
0243         QCOMPARE(beginInsertRowsSpy.count(), 1);
0244         QCOMPARE(endInsertRowsSpy.count(), 1);
0245         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0246         QCOMPARE(endRemoveRowsSpy.count(), 0);
0247         QCOMPARE(dataChangedSpy.count(), 0);
0248 
0249         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
0250                 QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 6, 1,
0251                 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
0252                 QDateTime::fromMSecsSinceEpoch(23),
0253                 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true,
0254         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0255         auto newTracks = DataTypes::ListTrackDataType();
0256         newTracks.push_back(newTrack);
0257 
0258         auto newFiles2 = QList<QUrl>();
0259         for (const auto &oneTrack : newTracks) {
0260             newFiles2.push_back(oneTrack.resourceURI());
0261         }
0262 
0263         musicDb.insertTracksList(newTracks, mNewCovers);
0264 
0265         QCOMPARE(albumsModel.rowCount(), 5);
0266         QCOMPARE(beginInsertRowsSpy.count(), 2);
0267         QCOMPARE(endInsertRowsSpy.count(), 2);
0268         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0269         QCOMPARE(endRemoveRowsSpy.count(), 0);
0270         QCOMPARE(dataChangedSpy.count(), 0);
0271 
0272         QCOMPARE(beginInsertRowsSpy.at(1).at(1).toInt(), 4);
0273         QCOMPARE(beginInsertRowsSpy.at(1).at(2).toInt(), 4);
0274 
0275         QCOMPARE(albumsModel.data(albumsModel.index(4, 0), DataTypes::ColumnsRoles::TitleRole).toString(), QStringLiteral("track6"));
0276 
0277         auto secondNewTrack = DataTypes::TrackDataType{true, QStringLiteral("$24"), QStringLiteral("0"), QStringLiteral("track5"),
0278                 QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 5, 1,
0279                 QTime::fromMSecsSinceStartOfDay(24), {QUrl::fromLocalFile(QStringLiteral("/$24"))},
0280                 QDateTime::fromMSecsSinceEpoch(24),
0281                 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true,
0282         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0283         auto secondNewTracks = DataTypes::ListTrackDataType();
0284         secondNewTracks.push_back(secondNewTrack);
0285 
0286         auto newFiles3 = QList<QUrl>();
0287         for (const auto &oneTrack : secondNewTracks) {
0288             newFiles3.push_back(oneTrack.resourceURI());
0289         }
0290 
0291         musicDb.insertTracksList(secondNewTracks, mNewCovers);
0292 
0293         QCOMPARE(albumsModel.rowCount(), 6);
0294         QCOMPARE(beginInsertRowsSpy.count(), 3);
0295         QCOMPARE(endInsertRowsSpy.count(), 3);
0296         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0297         QCOMPARE(endRemoveRowsSpy.count(), 0);
0298         QCOMPARE(dataChangedSpy.count(), 0);
0299 
0300         QCOMPARE(beginInsertRowsSpy.at(2).at(1).toInt(), 4);
0301         QCOMPARE(beginInsertRowsSpy.at(2).at(2).toInt(), 4);
0302 
0303         QCOMPARE(albumsModel.data(albumsModel.index(4, 0), DataTypes::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
0304     }
0305 
0306     void modifyOneTrack()
0307     {
0308         DatabaseInterface musicDb;
0309         DataModel albumsModel;
0310         QAbstractItemModelTester testModel(&albumsModel);
0311 
0312         connect(&musicDb, &DatabaseInterface::tracksAdded,
0313                 &albumsModel, &DataModel::tracksAdded);
0314         connect(&musicDb, &DatabaseInterface::trackRemoved,
0315                 &albumsModel, &DataModel::trackRemoved);
0316         connect(&musicDb, &DatabaseInterface::trackModified,
0317                 &albumsModel, &DataModel::trackModified);
0318 
0319         musicDb.init(QStringLiteral("testDb"));
0320 
0321         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
0322         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
0323         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
0324         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
0325         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
0326 
0327         QCOMPARE(beginInsertRowsSpy.count(), 0);
0328         QCOMPARE(endInsertRowsSpy.count(), 0);
0329         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0330         QCOMPARE(endRemoveRowsSpy.count(), 0);
0331         QCOMPARE(dataChangedSpy.count(), 0);
0332 
0333         auto newFiles = QList<QUrl>();
0334         const auto &constNewTracks = mNewTracks;
0335         for (const auto &oneTrack : constNewTracks) {
0336             newFiles.push_back(oneTrack.resourceURI());
0337         }
0338 
0339         musicDb.insertTracksList(mNewTracks, mNewCovers);
0340 
0341         QCOMPARE(beginInsertRowsSpy.count(), 0);
0342         QCOMPARE(endInsertRowsSpy.count(), 0);
0343         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0344         QCOMPARE(endRemoveRowsSpy.count(), 0);
0345         QCOMPARE(dataChangedSpy.count(), 0);
0346 
0347         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {},
0348                                musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {});
0349 
0350         QCOMPARE(beginInsertRowsSpy.count(), 0);
0351         QCOMPARE(endInsertRowsSpy.count(), 0);
0352         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0353         QCOMPARE(endRemoveRowsSpy.count(), 0);
0354         QCOMPARE(dataChangedSpy.count(), 0);
0355 
0356         albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))));
0357 
0358         QCOMPARE(albumsModel.rowCount(), 4);
0359         QCOMPARE(beginInsertRowsSpy.count(), 1);
0360         QCOMPARE(endInsertRowsSpy.count(), 1);
0361         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0362         QCOMPARE(endRemoveRowsSpy.count(), 0);
0363         QCOMPARE(dataChangedSpy.count(), 0);
0364 
0365         auto modifiedTrack = DataTypes::TrackDataType{
0366                 true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"),
0367                 QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 5, 3,
0368                 QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$3"))},
0369                 QDateTime::fromMSecsSinceEpoch(23),
0370                 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true,
0371         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0372 
0373         musicDb.insertTracksList({modifiedTrack}, mNewCovers);
0374 
0375         QCOMPARE(albumsModel.rowCount(), 4);
0376         QCOMPARE(beginInsertRowsSpy.count(), 1);
0377         QCOMPARE(endInsertRowsSpy.count(), 1);
0378         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0379         QCOMPARE(endRemoveRowsSpy.count(), 0);
0380         QCOMPARE(dataChangedSpy.count(), 1);
0381 
0382         QCOMPARE(dataChangedSpy.at(0).at(0).toModelIndex(), albumsModel.index(2, 0));
0383         QCOMPARE(dataChangedSpy.at(0).at(1).toModelIndex(), albumsModel.index(2, 0));
0384 
0385         QCOMPARE(albumsModel.data(albumsModel.index(2, 0), DataTypes::ColumnsRoles::TrackNumberRole).toInt(), 5);
0386     }
0387 
0388 
0389     void removeOneTrackAllTracks()
0390     {
0391         DatabaseInterface musicDb;
0392         DataModel tracksModel;
0393         QAbstractItemModelTester testModel(&tracksModel);
0394 
0395         connect(&musicDb, &DatabaseInterface::tracksAdded,
0396                 &tracksModel, &DataModel::tracksAdded);
0397         connect(&musicDb, &DatabaseInterface::trackModified,
0398                 &tracksModel, &DataModel::trackModified);
0399         connect(&musicDb, &DatabaseInterface::trackRemoved,
0400                 &tracksModel, &DataModel::trackRemoved);
0401 
0402         musicDb.init(QStringLiteral("testDb"));
0403 
0404         QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted);
0405         QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted);
0406         QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved);
0407         QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved);
0408         QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged);
0409 
0410         QCOMPARE(beginInsertRowsSpy.count(), 0);
0411         QCOMPARE(endInsertRowsSpy.count(), 0);
0412         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0413         QCOMPARE(endRemoveRowsSpy.count(), 0);
0414         QCOMPARE(dataChangedSpy.count(), 0);
0415 
0416         tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track,  ElisaUtils::NoFilter, {}, {}, 0, {});
0417 
0418         QCOMPARE(beginInsertRowsSpy.count(), 0);
0419         QCOMPARE(endInsertRowsSpy.count(), 0);
0420         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0421         QCOMPARE(endRemoveRowsSpy.count(), 0);
0422         QCOMPARE(dataChangedSpy.count(), 0);
0423 
0424         musicDb.insertTracksList(mNewTracks, mNewCovers);
0425 
0426         QCOMPARE(beginInsertRowsSpy.count(), 1);
0427         QCOMPARE(endInsertRowsSpy.count(), 1);
0428         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0429         QCOMPARE(endRemoveRowsSpy.count(), 0);
0430         QCOMPARE(dataChangedSpy.count(), 0);
0431 
0432         QCOMPARE(tracksModel.rowCount(), 23);
0433 
0434         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
0435                                                                     QStringLiteral("album1"), 1, 1);
0436 
0437         auto firstTrack = musicDb.trackDataFromDatabaseId(trackId);
0438 
0439         musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()});
0440 
0441         QCOMPARE(beginInsertRowsSpy.count(), 1);
0442         QCOMPARE(endInsertRowsSpy.count(), 1);
0443         QCOMPARE(beginRemoveRowsSpy.count(), 1);
0444         QCOMPARE(endRemoveRowsSpy.count(), 1);
0445         QCOMPARE(dataChangedSpy.count(), 0);
0446 
0447         QCOMPARE(tracksModel.rowCount(), 22);
0448     }
0449 
0450     void removeOneAlbumAllTracks()
0451     {
0452         DatabaseInterface musicDb;
0453         DataModel tracksModel;
0454         QAbstractItemModelTester testModel(&tracksModel);
0455 
0456         connect(&musicDb, &DatabaseInterface::tracksAdded,
0457                 &tracksModel, &DataModel::tracksAdded);
0458         connect(&musicDb, &DatabaseInterface::trackModified,
0459                 &tracksModel, &DataModel::trackModified);
0460         connect(&musicDb, &DatabaseInterface::trackRemoved,
0461                 &tracksModel, &DataModel::trackRemoved);
0462 
0463         musicDb.init(QStringLiteral("testDb"));
0464 
0465         QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted);
0466         QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted);
0467         QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved);
0468         QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved);
0469         QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged);
0470 
0471         QCOMPARE(beginInsertRowsSpy.count(), 0);
0472         QCOMPARE(endInsertRowsSpy.count(), 0);
0473         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0474         QCOMPARE(endRemoveRowsSpy.count(), 0);
0475         QCOMPARE(dataChangedSpy.count(), 0);
0476 
0477         tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {});
0478 
0479         QCOMPARE(beginInsertRowsSpy.count(), 0);
0480         QCOMPARE(endInsertRowsSpy.count(), 0);
0481         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0482         QCOMPARE(endRemoveRowsSpy.count(), 0);
0483         QCOMPARE(dataChangedSpy.count(), 0);
0484 
0485         musicDb.insertTracksList(mNewTracks, mNewCovers);
0486 
0487         QCOMPARE(beginInsertRowsSpy.count(), 1);
0488         QCOMPARE(endInsertRowsSpy.count(), 1);
0489         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0490         QCOMPARE(endRemoveRowsSpy.count(), 0);
0491         QCOMPARE(dataChangedSpy.count(), 0);
0492 
0493         QCOMPARE(tracksModel.rowCount(), 23);
0494 
0495         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
0496                                                                          QStringLiteral("album3"), 1, 1);
0497         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
0498         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
0499                                                                           QStringLiteral("album3"), 2, 1);
0500         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
0501         auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"),
0502                                                                          QStringLiteral("album3"), 3, 1);
0503         auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId);
0504 
0505         musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl(),
0506                                   secondTrack[DataTypes::ResourceRole].toUrl(),
0507                                   thirdTrack[DataTypes::ResourceRole].toUrl()});
0508 
0509         QCOMPARE(beginInsertRowsSpy.count(), 1);
0510         QCOMPARE(endInsertRowsSpy.count(), 1);
0511         QCOMPARE(beginRemoveRowsSpy.count(), 3);
0512         QCOMPARE(endRemoveRowsSpy.count(), 3);
0513         QCOMPARE(dataChangedSpy.count(), 0);
0514 
0515         QCOMPARE(tracksModel.rowCount(), 20);
0516     }
0517 
0518     void addOneTrackAllTracks()
0519     {
0520         DatabaseInterface musicDb;
0521         DataModel tracksModel;
0522         QAbstractItemModelTester testModel(&tracksModel);
0523 
0524         connect(&musicDb, &DatabaseInterface::tracksAdded,
0525                 &tracksModel, &DataModel::tracksAdded);
0526         connect(&musicDb, &DatabaseInterface::trackModified,
0527                 &tracksModel, &DataModel::trackModified);
0528         connect(&musicDb, &DatabaseInterface::trackRemoved,
0529                 &tracksModel, &DataModel::trackRemoved);
0530 
0531         musicDb.init(QStringLiteral("testDb"));
0532 
0533         QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted);
0534         QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted);
0535         QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved);
0536         QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved);
0537         QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged);
0538 
0539         QCOMPARE(beginInsertRowsSpy.count(), 0);
0540         QCOMPARE(endInsertRowsSpy.count(), 0);
0541         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0542         QCOMPARE(endRemoveRowsSpy.count(), 0);
0543         QCOMPARE(dataChangedSpy.count(), 0);
0544 
0545         tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {});
0546 
0547         QCOMPARE(beginInsertRowsSpy.count(), 0);
0548         QCOMPARE(endInsertRowsSpy.count(), 0);
0549         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0550         QCOMPARE(endRemoveRowsSpy.count(), 0);
0551         QCOMPARE(dataChangedSpy.count(), 0);
0552 
0553         musicDb.insertTracksList(mNewTracks, mNewCovers);
0554 
0555         QCOMPARE(beginInsertRowsSpy.count(), 1);
0556         QCOMPARE(endInsertRowsSpy.count(), 1);
0557         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0558         QCOMPARE(endRemoveRowsSpy.count(), 0);
0559         QCOMPARE(dataChangedSpy.count(), 0);
0560 
0561         QCOMPARE(tracksModel.rowCount(), 23);
0562 
0563         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"),
0564                 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23),
0565         {QUrl::fromLocalFile(QStringLiteral("/$23"))},
0566                 QDateTime::fromMSecsSinceEpoch(23),
0567         {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true,
0568         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0569         auto newTracks = DataTypes::ListTrackDataType();
0570         newTracks.push_back(newTrack);
0571 
0572         musicDb.insertTracksList(newTracks, mNewCovers);
0573 
0574         QCOMPARE(beginInsertRowsSpy.count(), 2);
0575         QCOMPARE(endInsertRowsSpy.count(), 2);
0576         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0577         QCOMPARE(endRemoveRowsSpy.count(), 0);
0578         QCOMPARE(dataChangedSpy.count(), 0);
0579 
0580         QCOMPARE(tracksModel.rowCount(), 24);
0581     }
0582 
0583     void addOneAlbumAllTracks()
0584     {
0585         DatabaseInterface musicDb;
0586         DataModel tracksModel;
0587         QAbstractItemModelTester testModel(&tracksModel);
0588 
0589         connect(&musicDb, &DatabaseInterface::tracksAdded,
0590                 &tracksModel, &DataModel::tracksAdded);
0591         connect(&musicDb, &DatabaseInterface::trackModified,
0592                 &tracksModel, &DataModel::trackModified);
0593         connect(&musicDb, &DatabaseInterface::trackRemoved,
0594                 &tracksModel, &DataModel::trackRemoved);
0595 
0596         musicDb.init(QStringLiteral("testDb"));
0597 
0598         QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted);
0599         QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted);
0600         QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved);
0601         QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved);
0602         QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged);
0603 
0604         QCOMPARE(beginInsertRowsSpy.count(), 0);
0605         QCOMPARE(endInsertRowsSpy.count(), 0);
0606         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0607         QCOMPARE(endRemoveRowsSpy.count(), 0);
0608         QCOMPARE(dataChangedSpy.count(), 0);
0609 
0610         tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {});
0611 
0612         QCOMPARE(beginInsertRowsSpy.count(), 0);
0613         QCOMPARE(endInsertRowsSpy.count(), 0);
0614         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0615         QCOMPARE(endRemoveRowsSpy.count(), 0);
0616         QCOMPARE(dataChangedSpy.count(), 0);
0617 
0618         auto newFiles = QList<QUrl>();
0619         const auto &constNewTracks = mNewTracks;
0620         for (const auto &oneTrack : constNewTracks) {
0621             newFiles.push_back(oneTrack.resourceURI());
0622         }
0623 
0624         musicDb.insertTracksList(mNewTracks, mNewCovers);
0625 
0626         QCOMPARE(beginInsertRowsSpy.count(), 1);
0627         QCOMPARE(endInsertRowsSpy.count(), 1);
0628         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0629         QCOMPARE(endRemoveRowsSpy.count(), 0);
0630         QCOMPARE(dataChangedSpy.count(), 0);
0631 
0632         QCOMPARE(tracksModel.rowCount(), 23);
0633 
0634         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"),
0635                 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23),
0636         {QUrl::fromLocalFile(QStringLiteral("/$23"))},
0637                 QDateTime::fromMSecsSinceEpoch(23),
0638         {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true,
0639         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0640         auto newTracks = DataTypes::ListTrackDataType();
0641         newTracks.push_back(newTrack);
0642 
0643         auto newCover = QUrl::fromLocalFile(QStringLiteral("album5"));
0644         auto newCovers = QHash<QString, QUrl>();
0645         newCovers[QStringLiteral("album5")] = newCover;
0646 
0647         auto newFiles2 = QList<QUrl>();
0648         for (const auto &oneTrack : newTracks) {
0649             newFiles2.push_back(oneTrack.resourceURI());
0650         }
0651 
0652         musicDb.insertTracksList(newTracks, newCovers);
0653 
0654         QCOMPARE(beginInsertRowsSpy.count(), 2);
0655         QCOMPARE(endInsertRowsSpy.count(), 2);
0656         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0657         QCOMPARE(endRemoveRowsSpy.count(), 0);
0658         QCOMPARE(dataChangedSpy.count(), 0);
0659 
0660         QCOMPARE(tracksModel.rowCount(), 24);
0661     }
0662 
0663     void modifyOneTrackAllTracks()
0664     {
0665         DatabaseInterface musicDb;
0666         DataModel tracksModel;
0667         QAbstractItemModelTester testModel(&tracksModel);
0668 
0669         connect(&musicDb, &DatabaseInterface::tracksAdded,
0670                 &tracksModel, &DataModel::tracksAdded);
0671         connect(&musicDb, &DatabaseInterface::trackModified,
0672                 &tracksModel, &DataModel::trackModified);
0673         connect(&musicDb, &DatabaseInterface::trackRemoved,
0674                 &tracksModel, &DataModel::trackRemoved);
0675 
0676         musicDb.init(QStringLiteral("testDb"));
0677 
0678         QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted);
0679         QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted);
0680         QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved);
0681         QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved);
0682         QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged);
0683 
0684         QCOMPARE(beginInsertRowsSpy.count(), 0);
0685         QCOMPARE(endInsertRowsSpy.count(), 0);
0686         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0687         QCOMPARE(endRemoveRowsSpy.count(), 0);
0688         QCOMPARE(dataChangedSpy.count(), 0);
0689 
0690         tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {});
0691 
0692         QCOMPARE(beginInsertRowsSpy.count(), 0);
0693         QCOMPARE(endInsertRowsSpy.count(), 0);
0694         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0695         QCOMPARE(endRemoveRowsSpy.count(), 0);
0696         QCOMPARE(dataChangedSpy.count(), 0);
0697 
0698         musicDb.insertTracksList(mNewTracks, mNewCovers);
0699 
0700         QCOMPARE(beginInsertRowsSpy.count(), 1);
0701         QCOMPARE(endInsertRowsSpy.count(), 1);
0702         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0703         QCOMPARE(endRemoveRowsSpy.count(), 0);
0704         QCOMPARE(dataChangedSpy.count(), 0);
0705 
0706         QCOMPARE(tracksModel.rowCount(), 23);
0707 
0708         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"),
0709                 QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"),
0710                 1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$1"))},
0711                 QDateTime::fromMSecsSinceEpoch(1),
0712         {QUrl::fromLocalFile(QStringLiteral("file://image$1"))}, 5, true,
0713         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0714         auto newTracks = DataTypes::ListTrackDataType();
0715         newTracks.push_back(newTrack);
0716 
0717         musicDb.insertTracksList(newTracks, mNewCovers);
0718 
0719         QCOMPARE(beginInsertRowsSpy.count(), 1);
0720         QCOMPARE(endInsertRowsSpy.count(), 1);
0721         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0722         QCOMPARE(endRemoveRowsSpy.count(), 0);
0723         QCOMPARE(dataChangedSpy.count(), 1);
0724 
0725         QCOMPARE(tracksModel.rowCount(), 23);
0726 
0727         const auto &dataChangedSignal =  dataChangedSpy.constFirst();
0728 
0729         QCOMPARE(dataChangedSignal.size(), 3);
0730 
0731         auto changedIndex = dataChangedSignal.constFirst().toModelIndex();
0732 
0733         QCOMPARE(tracksModel.data(changedIndex, DataTypes::ColumnsRoles::RatingRole).isValid(), true);
0734         QCOMPARE(tracksModel.data(changedIndex, DataTypes::ColumnsRoles::RatingRole).toInt(), 5);
0735     }
0736 
0737     void addEmptyTracksListAllTracks()
0738     {
0739         DataModel tracksModel;
0740         QAbstractItemModelTester testModel(&tracksModel);
0741 
0742         auto newTracks = DataModel::ListTrackDataType{};
0743 
0744         QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted);
0745         QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted);
0746         QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved);
0747         QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved);
0748         QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged);
0749 
0750         QCOMPARE(beginInsertRowsSpy.count(), 0);
0751         QCOMPARE(endInsertRowsSpy.count(), 0);
0752         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0753         QCOMPARE(endRemoveRowsSpy.count(), 0);
0754         QCOMPARE(dataChangedSpy.count(), 0);
0755 
0756         tracksModel.tracksAdded(newTracks);
0757 
0758         QCOMPARE(beginInsertRowsSpy.count(), 0);
0759         QCOMPARE(endInsertRowsSpy.count(), 0);
0760         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0761         QCOMPARE(endRemoveRowsSpy.count(), 0);
0762         QCOMPARE(dataChangedSpy.count(), 0);
0763 
0764         QCOMPARE(tracksModel.rowCount(), 0);
0765     }
0766 
0767     void addTracksListTwiceAllTracks()
0768     {
0769         DatabaseInterface musicDb;
0770         DataModel tracksModel;
0771         QAbstractItemModelTester testModel(&tracksModel);
0772 
0773         connect(&musicDb, &DatabaseInterface::tracksAdded,
0774                 &tracksModel, &DataModel::tracksAdded);
0775         connect(&musicDb, &DatabaseInterface::trackModified,
0776                 &tracksModel, &DataModel::trackModified);
0777         connect(&musicDb, &DatabaseInterface::trackRemoved,
0778                 &tracksModel, &DataModel::trackRemoved);
0779 
0780         musicDb.init(QStringLiteral("testDb"));
0781 
0782         QSignalSpy beginInsertRowsSpy(&tracksModel, &DataModel::rowsAboutToBeInserted);
0783         QSignalSpy endInsertRowsSpy(&tracksModel, &DataModel::rowsInserted);
0784         QSignalSpy beginRemoveRowsSpy(&tracksModel, &DataModel::rowsAboutToBeRemoved);
0785         QSignalSpy endRemoveRowsSpy(&tracksModel, &DataModel::rowsRemoved);
0786         QSignalSpy dataChangedSpy(&tracksModel, &DataModel::dataChanged);
0787 
0788         QCOMPARE(beginInsertRowsSpy.count(), 0);
0789         QCOMPARE(endInsertRowsSpy.count(), 0);
0790         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0791         QCOMPARE(endRemoveRowsSpy.count(), 0);
0792         QCOMPARE(dataChangedSpy.count(), 0);
0793 
0794         tracksModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::NoFilter, {}, {}, 0, {});
0795 
0796         QCOMPARE(beginInsertRowsSpy.count(), 0);
0797         QCOMPARE(endInsertRowsSpy.count(), 0);
0798         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0799         QCOMPARE(endRemoveRowsSpy.count(), 0);
0800         QCOMPARE(dataChangedSpy.count(), 0);
0801 
0802         musicDb.insertTracksList(mNewTracks, mNewCovers);
0803 
0804         QCOMPARE(beginInsertRowsSpy.count(), 1);
0805         QCOMPARE(endInsertRowsSpy.count(), 1);
0806         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0807         QCOMPARE(endRemoveRowsSpy.count(), 0);
0808         QCOMPARE(dataChangedSpy.count(), 0);
0809 
0810         QCOMPARE(tracksModel.rowCount(), 23);
0811 
0812         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"),
0813                 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23),
0814         {QUrl::fromLocalFile(QStringLiteral("/$23"))},
0815                 QDateTime::fromMSecsSinceEpoch(23),
0816         {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true,
0817         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0818 
0819         auto newTracks = DataTypes::ListTrackDataType();
0820         newTracks.push_back(newTrack);
0821 
0822         musicDb.insertTracksList(newTracks, mNewCovers);
0823 
0824         QCOMPARE(beginInsertRowsSpy.count(), 2);
0825         QCOMPARE(endInsertRowsSpy.count(), 2);
0826         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0827         QCOMPARE(endRemoveRowsSpy.count(), 0);
0828         QCOMPARE(dataChangedSpy.count(), 0);
0829 
0830         QCOMPARE(tracksModel.rowCount(), 24);
0831     }
0832 
0833     void removeOneTrackAllAlbums()
0834     {
0835         DatabaseInterface musicDb;
0836         DataModel albumsModel;
0837         QAbstractItemModelTester testModel(&albumsModel);
0838 
0839         connect(&musicDb, &DatabaseInterface::albumsAdded,
0840                 &albumsModel, &DataModel::albumsAdded);
0841         connect(&musicDb, &DatabaseInterface::albumModified,
0842                 &albumsModel, &DataModel::albumModified);
0843         connect(&musicDb, &DatabaseInterface::albumRemoved,
0844                 &albumsModel, &DataModel::albumRemoved);
0845 
0846         musicDb.init(QStringLiteral("testDb"));
0847 
0848         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
0849         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
0850         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
0851         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
0852         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
0853 
0854         QCOMPARE(beginInsertRowsSpy.count(), 0);
0855         QCOMPARE(endInsertRowsSpy.count(), 0);
0856         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0857         QCOMPARE(endRemoveRowsSpy.count(), 0);
0858         QCOMPARE(dataChangedSpy.count(), 0);
0859 
0860         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {});
0861 
0862         QCOMPARE(beginInsertRowsSpy.count(), 0);
0863         QCOMPARE(endInsertRowsSpy.count(), 0);
0864         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0865         QCOMPARE(endRemoveRowsSpy.count(), 0);
0866         QCOMPARE(dataChangedSpy.count(), 0);
0867 
0868         musicDb.insertTracksList(mNewTracks, mNewCovers);
0869 
0870         QCOMPARE(albumsModel.rowCount(), 5);
0871         QCOMPARE(beginInsertRowsSpy.count(), 1);
0872         QCOMPARE(endInsertRowsSpy.count(), 1);
0873         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0874         QCOMPARE(endRemoveRowsSpy.count(), 0);
0875         QCOMPARE(dataChangedSpy.count(), 0);
0876 
0877         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
0878 
0879         auto firstTrack = musicDb.trackDataFromDatabaseId(trackId);
0880 
0881         QVERIFY(!firstTrack.isEmpty());
0882 
0883         musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()});
0884 
0885         QCOMPARE(albumsModel.rowCount(), 5);
0886         QCOMPARE(beginInsertRowsSpy.count(), 1);
0887         QCOMPARE(endInsertRowsSpy.count(), 1);
0888         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0889         QCOMPARE(endRemoveRowsSpy.count(), 0);
0890         QCOMPARE(dataChangedSpy.count(), 1);
0891     }
0892 
0893     void removeOneAlbumAllAlbums()
0894     {
0895         DatabaseInterface musicDb;
0896         DataModel albumsModel;
0897         QAbstractItemModelTester testModel(&albumsModel);
0898 
0899         connect(&musicDb, &DatabaseInterface::albumsAdded,
0900                 &albumsModel, &DataModel::albumsAdded);
0901         connect(&musicDb, &DatabaseInterface::albumModified,
0902                 &albumsModel, &DataModel::albumModified);
0903         connect(&musicDb, &DatabaseInterface::albumRemoved,
0904                 &albumsModel, &DataModel::albumRemoved);
0905 
0906         musicDb.init(QStringLiteral("testDb"));
0907 
0908         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
0909         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
0910         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
0911         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
0912         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
0913 
0914         QCOMPARE(albumsModel.rowCount(), 0);
0915         QCOMPARE(beginInsertRowsSpy.count(), 0);
0916         QCOMPARE(endInsertRowsSpy.count(), 0);
0917         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0918         QCOMPARE(endRemoveRowsSpy.count(), 0);
0919         QCOMPARE(dataChangedSpy.count(), 0);
0920 
0921         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {});
0922 
0923         QCOMPARE(beginInsertRowsSpy.count(), 0);
0924         QCOMPARE(endInsertRowsSpy.count(), 0);
0925         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0926         QCOMPARE(endRemoveRowsSpy.count(), 0);
0927         QCOMPARE(dataChangedSpy.count(), 0);
0928 
0929         musicDb.insertTracksList(mNewTracks, mNewCovers);
0930 
0931         QCOMPARE(albumsModel.rowCount(), 5);
0932         QCOMPARE(beginInsertRowsSpy.count(), 1);
0933         QCOMPARE(endInsertRowsSpy.count(), 1);
0934         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0935         QCOMPARE(endRemoveRowsSpy.count(), 0);
0936         QCOMPARE(dataChangedSpy.count(), 0);
0937 
0938         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
0939                                                                          QStringLiteral("album3"), 1, 1);
0940         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
0941         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
0942                                                                           QStringLiteral("album3"), 2, 1);
0943         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
0944         auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"),
0945                                                                          QStringLiteral("album3"), 3, 1);
0946         auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId);
0947 
0948         musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl(),
0949                                   secondTrack[DataTypes::ResourceRole].toUrl(),
0950                                   thirdTrack[DataTypes::ResourceRole].toUrl()});
0951 
0952         QCOMPARE(albumsModel.rowCount(), 4);
0953         QCOMPARE(beginInsertRowsSpy.count(), 1);
0954         QCOMPARE(endInsertRowsSpy.count(), 1);
0955         QCOMPARE(beginRemoveRowsSpy.count(), 1);
0956         QCOMPARE(endRemoveRowsSpy.count(), 1);
0957         QCOMPARE(dataChangedSpy.count(), 0);
0958     }
0959 
0960     void addOneTrackAllAlbums()
0961     {
0962         DatabaseInterface musicDb;
0963         DataModel albumsModel;
0964         QAbstractItemModelTester testModel(&albumsModel);
0965 
0966         connect(&musicDb, &DatabaseInterface::albumsAdded,
0967                 &albumsModel, &DataModel::albumsAdded);
0968         connect(&musicDb, &DatabaseInterface::albumModified,
0969                 &albumsModel, &DataModel::albumModified);
0970         connect(&musicDb, &DatabaseInterface::albumRemoved,
0971                 &albumsModel, &DataModel::albumRemoved);
0972 
0973         musicDb.init(QStringLiteral("testDb"));
0974 
0975         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
0976         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
0977         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
0978         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
0979         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
0980 
0981         QCOMPARE(beginInsertRowsSpy.count(), 0);
0982         QCOMPARE(endInsertRowsSpy.count(), 0);
0983         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0984         QCOMPARE(endRemoveRowsSpy.count(), 0);
0985         QCOMPARE(dataChangedSpy.count(), 0);
0986 
0987         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {});
0988 
0989         QCOMPARE(beginInsertRowsSpy.count(), 0);
0990         QCOMPARE(endInsertRowsSpy.count(), 0);
0991         QCOMPARE(beginRemoveRowsSpy.count(), 0);
0992         QCOMPARE(endRemoveRowsSpy.count(), 0);
0993         QCOMPARE(dataChangedSpy.count(), 0);
0994 
0995         musicDb.insertTracksList(mNewTracks, mNewCovers);
0996 
0997         QCOMPARE(beginInsertRowsSpy.count(), 1);
0998         QCOMPARE(endInsertRowsSpy.count(), 1);
0999         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1000         QCOMPARE(endRemoveRowsSpy.count(), 0);
1001         QCOMPARE(dataChangedSpy.count(), 0);
1002 
1003         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"),
1004                 QStringLiteral("artist2"), QStringLiteral("album4"), QStringLiteral("artist2"), 23, 1, QTime::fromMSecsSinceStartOfDay(23),
1005         {QUrl::fromLocalFile(QStringLiteral("/$23"))},
1006                 QDateTime::fromMSecsSinceEpoch(23),
1007         {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true,
1008         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
1009         auto newTracks = DataTypes::ListTrackDataType();
1010         newTracks.push_back(newTrack);
1011 
1012         musicDb.insertTracksList(newTracks, mNewCovers);
1013 
1014         QCOMPARE(beginInsertRowsSpy.count(), 1);
1015         QCOMPARE(endInsertRowsSpy.count(), 1);
1016         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1017         QCOMPARE(endRemoveRowsSpy.count(), 0);
1018         QCOMPARE(dataChangedSpy.count(), 1);
1019     }
1020 
1021     void addOneAlbumAllAlbums()
1022     {
1023         DatabaseInterface musicDb;
1024         DataModel albumsModel;
1025         QAbstractItemModelTester testModel(&albumsModel);
1026 
1027         connect(&musicDb, &DatabaseInterface::albumsAdded,
1028                 &albumsModel, &DataModel::albumsAdded);
1029         connect(&musicDb, &DatabaseInterface::albumModified,
1030                 &albumsModel, &DataModel::albumModified);
1031         connect(&musicDb, &DatabaseInterface::albumRemoved,
1032                 &albumsModel, &DataModel::albumRemoved);
1033 
1034         musicDb.init(QStringLiteral("testDb"));
1035 
1036         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
1037         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
1038         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
1039         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
1040         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
1041 
1042         QCOMPARE(beginInsertRowsSpy.count(), 0);
1043         QCOMPARE(endInsertRowsSpy.count(), 0);
1044         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1045         QCOMPARE(endRemoveRowsSpy.count(), 0);
1046         QCOMPARE(dataChangedSpy.count(), 0);
1047 
1048         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Album, ElisaUtils::NoFilter, {}, {}, 0, {});
1049 
1050         QCOMPARE(beginInsertRowsSpy.count(), 0);
1051         QCOMPARE(endInsertRowsSpy.count(), 0);
1052         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1053         QCOMPARE(endRemoveRowsSpy.count(), 0);
1054         QCOMPARE(dataChangedSpy.count(), 0);
1055 
1056         auto newFiles = QList<QUrl>();
1057         const auto &constNewTracks = mNewTracks;
1058         for (const auto &oneTrack : constNewTracks) {
1059             newFiles.push_back(oneTrack.resourceURI());
1060         }
1061 
1062         musicDb.insertTracksList(mNewTracks, mNewCovers);
1063 
1064         QCOMPARE(beginInsertRowsSpy.count(), 1);
1065         QCOMPARE(endInsertRowsSpy.count(), 1);
1066         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1067         QCOMPARE(endRemoveRowsSpy.count(), 0);
1068         QCOMPARE(dataChangedSpy.count(), 0);
1069 
1070         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track1"),
1071                 QStringLiteral("artist2"), QStringLiteral("album5"), QStringLiteral("artist2"), 1, 1,
1072                 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
1073                 QDateTime::fromMSecsSinceEpoch(23),
1074         {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true,
1075         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
1076         auto newTracks = DataTypes::ListTrackDataType();
1077         newTracks.push_back(newTrack);
1078 
1079         auto newCover = QUrl::fromLocalFile(QStringLiteral("album5"));
1080         auto newCovers = QHash<QString, QUrl>();
1081         newCovers[QStringLiteral("album5")] = newCover;
1082 
1083         musicDb.insertTracksList(newTracks, newCovers);
1084 
1085         QCOMPARE(beginInsertRowsSpy.count(), 2);
1086         QCOMPARE(endInsertRowsSpy.count(), 2);
1087         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1088         QCOMPARE(endRemoveRowsSpy.count(), 0);
1089         QCOMPARE(dataChangedSpy.count(), 0);
1090     }
1091 
1092     void removeOneArtistAllArtists()
1093     {
1094         DatabaseInterface musicDb;
1095         DataModel artistsModel;
1096         QAbstractItemModelTester testModel(&artistsModel);
1097 
1098         musicDb.init(QStringLiteral("testDb"));
1099 
1100         QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted);
1101         QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted);
1102         QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved);
1103         QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved);
1104         QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged);
1105 
1106         QCOMPARE(artistsModel.rowCount(), 0);
1107         QCOMPARE(beginInsertRowsSpy.count(), 0);
1108         QCOMPARE(endInsertRowsSpy.count(), 0);
1109         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1110         QCOMPARE(endRemoveRowsSpy.count(), 0);
1111         QCOMPARE(dataChangedSpy.count(), 0);
1112 
1113         artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Artist, ElisaUtils::NoFilter, {}, {}, 0, {});
1114 
1115         QCOMPARE(artistsModel.rowCount(), 0);
1116         QCOMPARE(beginInsertRowsSpy.count(), 0);
1117         QCOMPARE(endInsertRowsSpy.count(), 0);
1118         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1119         QCOMPARE(endRemoveRowsSpy.count(), 0);
1120         QCOMPARE(dataChangedSpy.count(), 0);
1121 
1122         auto newFiles = QList<QUrl>();
1123         const auto &constNewTracks = mNewTracks;
1124         for (const auto &oneTrack : constNewTracks) {
1125             newFiles.push_back(oneTrack.resourceURI());
1126         }
1127 
1128         musicDb.insertTracksList(mNewTracks, mNewCovers);
1129 
1130         beginInsertRowsSpy.wait();
1131 
1132         QCOMPARE(artistsModel.rowCount(), 7);
1133         QCOMPARE(beginInsertRowsSpy.count(), 1);
1134         QCOMPARE(endInsertRowsSpy.count(), 1);
1135         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1136         QCOMPARE(endRemoveRowsSpy.count(), 0);
1137         QCOMPARE(dataChangedSpy.count(), 0);
1138 
1139         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
1140 
1141         auto firstTrack = musicDb.trackDataFromDatabaseId(trackId);
1142 
1143         musicDb.removeTracksList({firstTrack[DataTypes::ResourceRole].toUrl()});
1144 
1145         beginRemoveRowsSpy.wait();
1146 
1147         QCOMPARE(artistsModel.rowCount(), 6);
1148         QCOMPARE(beginInsertRowsSpy.count(), 1);
1149         QCOMPARE(endInsertRowsSpy.count(), 1);
1150         QCOMPARE(beginRemoveRowsSpy.count(), 1);
1151         QCOMPARE(endRemoveRowsSpy.count(), 1);
1152         QCOMPARE(dataChangedSpy.count(), 0);
1153     }
1154 
1155     void addOneArtistAllArtists()
1156     {
1157         DatabaseInterface musicDb;
1158         DataModel artistsModel;
1159         QAbstractItemModelTester testModel(&artistsModel);
1160 
1161         musicDb.init(QStringLiteral("testDb"));
1162 
1163         QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted);
1164         QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted);
1165         QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved);
1166         QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved);
1167         QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged);
1168 
1169         QCOMPARE(artistsModel.rowCount(), 0);
1170         QCOMPARE(beginInsertRowsSpy.count(), 0);
1171         QCOMPARE(endInsertRowsSpy.count(), 0);
1172         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1173         QCOMPARE(endRemoveRowsSpy.count(), 0);
1174         QCOMPARE(dataChangedSpy.count(), 0);
1175 
1176         artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Artist, ElisaUtils::NoFilter, {}, {}, 0, {});
1177 
1178         QCOMPARE(artistsModel.rowCount(), 0);
1179         QCOMPARE(beginInsertRowsSpy.count(), 0);
1180         QCOMPARE(endInsertRowsSpy.count(), 0);
1181         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1182         QCOMPARE(endRemoveRowsSpy.count(), 0);
1183         QCOMPARE(dataChangedSpy.count(), 0);
1184 
1185         auto newFiles = QList<QUrl>();
1186         const auto &constNewTracks = mNewTracks;
1187         for (const auto &oneTrack : constNewTracks) {
1188             newFiles.push_back(oneTrack.resourceURI());
1189         }
1190 
1191         musicDb.insertTracksList(mNewTracks, mNewCovers);
1192 
1193         beginInsertRowsSpy.wait();
1194 
1195         QCOMPARE(artistsModel.rowCount(), 7);
1196         QCOMPARE(beginInsertRowsSpy.count(), 1);
1197         QCOMPARE(endInsertRowsSpy.count(), 1);
1198         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1199         QCOMPARE(endRemoveRowsSpy.count(), 0);
1200         QCOMPARE(dataChangedSpy.count(), 0);
1201 
1202         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track23"),
1203                 QStringLiteral("artist6"), QStringLiteral("album4"), QStringLiteral("Various Artists"), 23, 1, QTime::fromMSecsSinceStartOfDay(23),
1204         {QUrl::fromLocalFile(QStringLiteral("/$23"))},
1205                 QDateTime::fromMSecsSinceEpoch(23),
1206         {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 5, true,
1207         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
1208         auto newTracks = DataTypes::ListTrackDataType();
1209         newTracks.push_back(newTrack);
1210 
1211         auto newFiles2 = QList<QUrl>();
1212         for (const auto &oneTrack : newTracks) {
1213             newFiles2.push_back(oneTrack.resourceURI());
1214         }
1215 
1216         musicDb.insertTracksList(newTracks, mNewCovers);
1217 
1218         beginInsertRowsSpy.wait();
1219 
1220         QCOMPARE(artistsModel.rowCount(), 8);
1221         QCOMPARE(beginInsertRowsSpy.count(), 2);
1222         QCOMPARE(endInsertRowsSpy.count(), 2);
1223         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1224         QCOMPARE(endRemoveRowsSpy.count(), 0);
1225         QCOMPARE(dataChangedSpy.count(), 0);
1226     }
1227 
1228     void displayAlbumsFromOneArtist()
1229     {
1230         QTemporaryFile databaseFile;
1231         databaseFile.open();
1232 
1233         qDebug() << "displayAlbumsFromOneArtist" << databaseFile.fileName();
1234 
1235         DatabaseInterface musicDb;
1236         DataModel artistsModel;
1237         QAbstractItemModelTester testModel(&artistsModel);
1238 
1239         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
1240 
1241         QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted);
1242         QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted);
1243         QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved);
1244         QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved);
1245         QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset);
1246         QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset);
1247         QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged);
1248 
1249         QCOMPARE(artistsModel.rowCount(), 0);
1250         QCOMPARE(beginInsertRowsSpy.count(), 0);
1251         QCOMPARE(endInsertRowsSpy.count(), 0);
1252         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1253         QCOMPARE(endRemoveRowsSpy.count(), 0);
1254         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1255         QCOMPARE(modelResetSpy.count(), 0);
1256         QCOMPARE(dataChangedSpy.count(), 0);
1257 
1258         artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Album, ElisaUtils::FilterByArtist, {}, QStringLiteral("artist1"), 0, {});
1259 
1260         QCOMPARE(artistsModel.rowCount(), 0);
1261         QCOMPARE(beginInsertRowsSpy.count(), 0);
1262         QCOMPARE(endInsertRowsSpy.count(), 0);
1263         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1264         QCOMPARE(endRemoveRowsSpy.count(), 0);
1265         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1266         QCOMPARE(modelResetSpy.count(), 0);
1267         QCOMPARE(dataChangedSpy.count(), 0);
1268 
1269         auto newFiles = QList<QUrl>();
1270         const auto &constNewTracks = mNewTracks;
1271         for (const auto &oneTrack : constNewTracks) {
1272             newFiles.push_back(oneTrack.resourceURI());
1273         }
1274 
1275         musicDb.insertTracksList(mNewTracks, mNewCovers);
1276 
1277         beginInsertRowsSpy.wait();
1278 
1279         QCOMPARE(artistsModel.rowCount(), 1);
1280         QCOMPARE(beginInsertRowsSpy.count(), 1);
1281         QCOMPARE(endInsertRowsSpy.count(), 1);
1282         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1283         QCOMPARE(endRemoveRowsSpy.count(), 0);
1284         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1285         QCOMPARE(modelResetSpy.count(), 0);
1286         QCOMPARE(dataChangedSpy.count(), 0);
1287     }
1288 
1289     void displayArtistsFromOneGenre()
1290     {
1291         QTemporaryFile databaseFile;
1292         databaseFile.open();
1293 
1294         qDebug() << "displayArtistsFromOneGenre" << databaseFile.fileName();
1295 
1296         DatabaseInterface musicDb;
1297         DataModel artistsModel;
1298         QAbstractItemModelTester testModel(&artistsModel);
1299 
1300         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
1301 
1302         QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted);
1303         QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted);
1304         QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved);
1305         QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved);
1306         QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset);
1307         QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset);
1308         QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged);
1309 
1310         QCOMPARE(artistsModel.rowCount(), 0);
1311         QCOMPARE(beginInsertRowsSpy.count(), 0);
1312         QCOMPARE(endInsertRowsSpy.count(), 0);
1313         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1314         QCOMPARE(endRemoveRowsSpy.count(), 0);
1315         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1316         QCOMPARE(modelResetSpy.count(), 0);
1317         QCOMPARE(dataChangedSpy.count(), 0);
1318 
1319         artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Artist, ElisaUtils::FilterByGenre, QStringLiteral("genre1"), {}, 0, {});
1320 
1321         QCOMPARE(artistsModel.rowCount(), 0);
1322         QCOMPARE(beginInsertRowsSpy.count(), 0);
1323         QCOMPARE(endInsertRowsSpy.count(), 0);
1324         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1325         QCOMPARE(endRemoveRowsSpy.count(), 0);
1326         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1327         QCOMPARE(modelResetSpy.count(), 0);
1328         QCOMPARE(dataChangedSpy.count(), 0);
1329 
1330         auto newFiles = QList<QUrl>();
1331         const auto &constNewTracks = mNewTracks;
1332         for (const auto &oneTrack : constNewTracks) {
1333             newFiles.push_back(oneTrack.resourceURI());
1334         }
1335 
1336         musicDb.insertTracksList(mNewTracks, mNewCovers);
1337 
1338         beginInsertRowsSpy.wait();
1339 
1340         QCOMPARE(artistsModel.rowCount(), 4);
1341         QCOMPARE(beginInsertRowsSpy.count(), 1);
1342         QCOMPARE(endInsertRowsSpy.count(), 1);
1343         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1344         QCOMPARE(endRemoveRowsSpy.count(), 0);
1345         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1346         QCOMPARE(modelResetSpy.count(), 0);
1347         QCOMPARE(dataChangedSpy.count(), 0);
1348     }
1349 
1350     void displayAlbumsFromOneArtistAndGenre()
1351     {
1352         QTemporaryFile databaseFile;
1353         databaseFile.open();
1354 
1355         qDebug() << "displayAlbumsFromOneArtistAndGenre" << databaseFile.fileName();
1356 
1357         DatabaseInterface musicDb;
1358         DataModel artistsModel;
1359         QAbstractItemModelTester testModel(&artistsModel);
1360 
1361         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
1362 
1363         QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted);
1364         QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted);
1365         QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved);
1366         QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved);
1367         QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset);
1368         QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset);
1369         QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged);
1370 
1371         QCOMPARE(artistsModel.rowCount(), 0);
1372         QCOMPARE(beginInsertRowsSpy.count(), 0);
1373         QCOMPARE(endInsertRowsSpy.count(), 0);
1374         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1375         QCOMPARE(endRemoveRowsSpy.count(), 0);
1376         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1377         QCOMPARE(modelResetSpy.count(), 0);
1378         QCOMPARE(dataChangedSpy.count(), 0);
1379 
1380         artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Album, ElisaUtils::FilterByGenreAndArtist,
1381                                 QStringLiteral("genre3"), QStringLiteral("artist2"), 0, {});
1382 
1383         QCOMPARE(artistsModel.rowCount(), 0);
1384         QCOMPARE(beginInsertRowsSpy.count(), 0);
1385         QCOMPARE(endInsertRowsSpy.count(), 0);
1386         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1387         QCOMPARE(endRemoveRowsSpy.count(), 0);
1388         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1389         QCOMPARE(modelResetSpy.count(), 0);
1390         QCOMPARE(dataChangedSpy.count(), 0);
1391 
1392         auto newFiles = QList<QUrl>();
1393         const auto &constNewTracks = mNewTracks;
1394         for (const auto &oneTrack : constNewTracks) {
1395             newFiles.push_back(oneTrack.resourceURI());
1396         }
1397 
1398         musicDb.insertTracksList(mNewTracks, mNewCovers);
1399 
1400         beginInsertRowsSpy.wait();
1401 
1402         QCOMPARE(artistsModel.rowCount(), 2);
1403         QCOMPARE(beginInsertRowsSpy.count(), 1);
1404         QCOMPARE(endInsertRowsSpy.count(), 1);
1405         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1406         QCOMPARE(endRemoveRowsSpy.count(), 0);
1407         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1408         QCOMPARE(modelResetSpy.count(), 0);
1409         QCOMPARE(dataChangedSpy.count(), 0);
1410     }
1411 
1412     void displayTracksFromOneAlbum()
1413     {
1414         QTemporaryFile databaseFile;
1415         databaseFile.open();
1416 
1417         qDebug() << "displayTracksFromOneAlbum" << databaseFile.fileName();
1418 
1419         DatabaseInterface musicDb;
1420         DataModel artistsModel;
1421         QAbstractItemModelTester testModel(&artistsModel);
1422 
1423         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
1424 
1425         QSignalSpy beginInsertRowsSpy(&artistsModel, &DataModel::rowsAboutToBeInserted);
1426         QSignalSpy endInsertRowsSpy(&artistsModel, &DataModel::rowsInserted);
1427         QSignalSpy beginRemoveRowsSpy(&artistsModel, &DataModel::rowsAboutToBeRemoved);
1428         QSignalSpy endRemoveRowsSpy(&artistsModel, &DataModel::rowsRemoved);
1429         QSignalSpy modelAboutToBeResetSpy(&artistsModel, &DataModel::modelAboutToBeReset);
1430         QSignalSpy modelResetSpy(&artistsModel, &DataModel::modelReset);
1431         QSignalSpy dataChangedSpy(&artistsModel, &DataModel::dataChanged);
1432 
1433         QCOMPARE(artistsModel.rowCount(), 0);
1434         QCOMPARE(beginInsertRowsSpy.count(), 0);
1435         QCOMPARE(endInsertRowsSpy.count(), 0);
1436         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1437         QCOMPARE(endRemoveRowsSpy.count(), 0);
1438         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1439         QCOMPARE(modelResetSpy.count(), 0);
1440         QCOMPARE(dataChangedSpy.count(), 0);
1441 
1442         musicDb.insertTracksList(mNewTracks, mNewCovers);
1443 
1444         QCOMPARE(artistsModel.rowCount(), 0);
1445         QCOMPARE(beginInsertRowsSpy.count(), 0);
1446         QCOMPARE(endInsertRowsSpy.count(), 0);
1447         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1448         QCOMPARE(endRemoveRowsSpy.count(), 0);
1449         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1450         QCOMPARE(modelResetSpy.count(), 0);
1451         QCOMPARE(dataChangedSpy.count(), 0);
1452 
1453         auto albumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"),
1454                                                          QStringLiteral("Various Artists"),
1455                                                          QStringLiteral("/"));
1456 
1457         QVERIFY(albumId != 0);
1458 
1459         artistsModel.initialize(nullptr, &musicDb, ElisaUtils::Track, ElisaUtils::FilterById, {}, {}, albumId, {});
1460 
1461         beginInsertRowsSpy.wait();
1462 
1463         QCOMPARE(artistsModel.rowCount(), 4);
1464         QCOMPARE(beginInsertRowsSpy.count(), 1);
1465         QCOMPARE(endInsertRowsSpy.count(), 1);
1466         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1467         QCOMPARE(endRemoveRowsSpy.count(), 0);
1468         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1469         QCOMPARE(modelResetSpy.count(), 0);
1470         QCOMPARE(dataChangedSpy.count(), 0);
1471 
1472         auto newTracks = DataTypes::ListTrackDataType();
1473 
1474         newTracks = {{true, QStringLiteral("$31"), QStringLiteral("0"), QStringLiteral("track12"),
1475                       QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"),
1476                       12, 1, QTime::fromMSecsSinceStartOfDay(31),
1477                       {QUrl::fromLocalFile(QStringLiteral("/$31"))},
1478                       QDateTime::fromMSecsSinceEpoch(31),
1479                       {QUrl::fromLocalFile(QStringLiteral("album1"))}, 5, true,
1480                       QStringLiteral("genre4"), QStringLiteral("composer4"), QStringLiteral("lyricist4"), true},
1481                      {true, QStringLiteral("$32"), QStringLiteral("0"), QStringLiteral("track13"),
1482                       QStringLiteral("artist3"), QStringLiteral("album3"), QStringLiteral("artist3"),
1483                       13, 1, QTime::fromMSecsSinceStartOfDay(32),
1484                       {QUrl::fromLocalFile(QStringLiteral("/$32"))},
1485                       QDateTime::fromMSecsSinceEpoch(32),
1486                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 4, true,
1487                       QStringLiteral("genre3"), QStringLiteral("composer3"), QStringLiteral("lyricist3"), false}};
1488 
1489         auto newCovers = mNewCovers;
1490         newCovers[QStringLiteral("file:///$31")] = QUrl::fromLocalFile(QStringLiteral("album1"));
1491         newCovers[QStringLiteral("file:///$32")] = QUrl::fromLocalFile(QStringLiteral("album3"));
1492 
1493         musicDb.insertTracksList(newTracks, newCovers);
1494 
1495         beginInsertRowsSpy.wait();
1496 
1497         QCOMPARE(artistsModel.rowCount(), 5);
1498         QCOMPARE(beginInsertRowsSpy.count(), 2);
1499         QCOMPARE(endInsertRowsSpy.count(), 2);
1500         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1501         QCOMPARE(endRemoveRowsSpy.count(), 0);
1502         QCOMPARE(modelAboutToBeResetSpy.count(), 0);
1503         QCOMPARE(modelResetSpy.count(), 0);
1504         QCOMPARE(dataChangedSpy.count(), 0);
1505     }
1506 
1507     void addOneTrackWrongOrder()
1508     {
1509         DatabaseInterface musicDb;
1510         DataModel albumsModel;
1511         QAbstractItemModelTester testModel(&albumsModel);
1512 
1513         connect(&musicDb, &DatabaseInterface::tracksAdded,
1514                 &albumsModel, &DataModel::tracksAdded);
1515         connect(&musicDb, &DatabaseInterface::trackRemoved,
1516                 &albumsModel, &DataModel::trackRemoved);
1517         connect(&musicDb, &DatabaseInterface::trackModified,
1518                 &albumsModel, &DataModel::trackModified);
1519 
1520         musicDb.init(QStringLiteral("testDb"));
1521 
1522         QSignalSpy beginInsertRowsSpy(&albumsModel, &DataModel::rowsAboutToBeInserted);
1523         QSignalSpy endInsertRowsSpy(&albumsModel, &DataModel::rowsInserted);
1524         QSignalSpy beginRemoveRowsSpy(&albumsModel, &DataModel::rowsAboutToBeRemoved);
1525         QSignalSpy endRemoveRowsSpy(&albumsModel, &DataModel::rowsRemoved);
1526         QSignalSpy dataChangedSpy(&albumsModel, &DataModel::dataChanged);
1527 
1528         QCOMPARE(beginInsertRowsSpy.count(), 0);
1529         QCOMPARE(endInsertRowsSpy.count(), 0);
1530         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1531         QCOMPARE(endRemoveRowsSpy.count(), 0);
1532         QCOMPARE(dataChangedSpy.count(), 0);
1533 
1534         auto newFiles = QList<QUrl>();
1535         const auto &constNewTracks = mNewTracks;
1536         for (const auto &oneTrack : constNewTracks) {
1537             newFiles.push_back(oneTrack.resourceURI());
1538         }
1539 
1540         musicDb.insertTracksList(mNewTracks, mNewCovers);
1541 
1542         QCOMPARE(beginInsertRowsSpy.count(), 0);
1543         QCOMPARE(endInsertRowsSpy.count(), 0);
1544         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1545         QCOMPARE(endRemoveRowsSpy.count(), 0);
1546         QCOMPARE(dataChangedSpy.count(), 0);
1547 
1548         albumsModel.initialize(nullptr, nullptr, ElisaUtils::Track, ElisaUtils::FilterById, {}, {},
1549                                musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")), {});
1550 
1551         QCOMPARE(beginInsertRowsSpy.count(), 0);
1552         QCOMPARE(endInsertRowsSpy.count(), 0);
1553         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1554         QCOMPARE(endRemoveRowsSpy.count(), 0);
1555         QCOMPARE(dataChangedSpy.count(), 0);
1556 
1557         albumsModel.tracksAdded(musicDb.albumData(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))));
1558 
1559         QCOMPARE(albumsModel.rowCount(), 4);
1560         QCOMPARE(beginInsertRowsSpy.count(), 1);
1561         QCOMPARE(endInsertRowsSpy.count(), 1);
1562         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1563         QCOMPARE(endRemoveRowsSpy.count(), 0);
1564         QCOMPARE(dataChangedSpy.count(), 0);
1565 
1566         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
1567                 QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 2, 1,
1568                 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
1569                 QDateTime::fromMSecsSinceEpoch(23),
1570                 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true,
1571         {}, QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
1572         auto newTracks = DataTypes::ListTrackDataType();
1573         newTracks.push_back(newTrack);
1574 
1575         auto newFiles2 = QList<QUrl>();
1576         for (const auto &oneTrack : newTracks) {
1577             newFiles2.push_back(oneTrack.resourceURI());
1578         }
1579 
1580         musicDb.insertTracksList(newTracks, mNewCovers);
1581 
1582         QCOMPARE(albumsModel.rowCount(), 5);
1583         QCOMPARE(beginInsertRowsSpy.count(), 2);
1584         QCOMPARE(endInsertRowsSpy.count(), 2);
1585         QCOMPARE(beginRemoveRowsSpy.count(), 0);
1586         QCOMPARE(endRemoveRowsSpy.count(), 0);
1587         QCOMPARE(dataChangedSpy.count(), 0);
1588 
1589         QCOMPARE(beginInsertRowsSpy.at(1).at(1).toInt(), 2);
1590         QCOMPARE(beginInsertRowsSpy.at(1).at(2).toInt(), 2);
1591     }
1592 };
1593 
1594 QTEST_GUILESS_MAIN(DataModelTests)
1595 
1596 
1597 #include "datamodeltest.moc"