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

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 
0012 #include "config-upnp-qt.h"
0013 
0014 #include <QObject>
0015 #include <QUrl>
0016 #include <QString>
0017 #include <QHash>
0018 #include <QVector>
0019 #include <QThread>
0020 #include <QStandardPaths>
0021 #include <QDir>
0022 #include <QFile>
0023 #include <QSqlError>
0024 #include <QSqlDatabase>
0025 #include <QSqlQuery>
0026 #include <QTemporaryFile>
0027 
0028 #include <QDebug>
0029 
0030 #include <QTest>
0031 #include <QSignalSpy>
0032 
0033 #include <algorithm>
0034 
0035 class DatabaseInterfaceTests: public QObject, public DatabaseTestData
0036 {
0037     Q_OBJECT
0038 
0039 public:
0040 
0041     explicit DatabaseInterfaceTests(QObject *aParent = nullptr) : QObject(aParent)
0042     {
0043     }
0044 
0045 private Q_SLOTS:
0046 
0047     void initTestCase()
0048     {
0049         qRegisterMetaType<QHash<qulonglong,int>>("QHash<qulonglong,int>");
0050         qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>");
0051         qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>");
0052         qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>");
0053         qRegisterMetaType<QHash<QUrl,QDateTime>>("QHash<QUrl,QDateTime>");
0054         qRegisterMetaType<DataTypes::ListTrackDataType>("ListTrackDataType");
0055         qRegisterMetaType<DataTypes::ListAlbumDataType>("ListAlbumDataType");
0056         qRegisterMetaType<DataTypes::ListArtistDataType>("ListArtistDataType");
0057         qRegisterMetaType<DataTypes::ListGenreDataType>("ListGenreDataType");
0058         qRegisterMetaType<DataTypes::TrackDataType>("TrackDataType");
0059         qRegisterMetaType<DataTypes::AlbumDataType>("AlbumDataType");
0060         qRegisterMetaType<DataTypes::ArtistDataType>("ArtistDataType");
0061         qRegisterMetaType<DataTypes::GenreDataType>("GenreDataType");
0062         qRegisterMetaType<DataTypes::ListRadioDataType>("ListRadioDataType");
0063     }
0064 
0065     void avoidCrashInTrackIdFromTitleAlbumArtist()
0066     {
0067         DatabaseInterface musicDb;
0068         musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album3"), 1, 1);
0069     }
0070 
0071     void avoidCrashInAllArtists()
0072     {
0073         DatabaseInterface musicDb;
0074         musicDb.allArtistsData();
0075     }
0076 
0077     void avoidCrashInallAlbumsData()
0078     {
0079         DatabaseInterface musicDb;
0080         musicDb.allAlbumsData();
0081     }
0082 
0083     void avoidCrashInAllRadios()
0084     {
0085         DatabaseInterface musicDb;
0086         musicDb.allRadiosData();
0087     }
0088 
0089     void verifyNumberOfRadioStations()
0090     {
0091         QTemporaryFile databaseFile;
0092         databaseFile.open();
0093         qDebug() << "verifyNumberOfRadioStations" << databaseFile.fileName();
0094         DatabaseInterface musicDb;
0095         musicDb.init(QStringLiteral("testDb"),databaseFile.fileName());
0096         QSignalSpy musicDbRadioAddedSpy(&musicDb,&DatabaseInterface::radioAdded);
0097         QCOMPARE(musicDb.allRadiosData().count(), 18);
0098     }
0099 
0100     void addOneRadio()
0101     {
0102         QTemporaryFile databaseFile;
0103         databaseFile.open();
0104         qDebug() << "addOneRadio" << databaseFile.fileName();
0105         DatabaseInterface musicDb;
0106         musicDb.init(QStringLiteral("testDb"),databaseFile.fileName());
0107         QSignalSpy musicDbRadioAddedSpy(&musicDb,&DatabaseInterface::radioAdded);
0108         int initialCount = musicDb.allRadiosData().count();
0109 
0110         auto newRadio = DataTypes::TrackDataType();
0111         newRadio[DataTypes::CommentRole]=QStringLiteral("Test Comment");
0112         newRadio[DataTypes::ResourceRole]=QUrl::fromEncoded("http://ice2.somafm.com/defcon-128-aac");
0113         newRadio[DataTypes::TitleRole]=QStringLiteral("Test Radio");
0114         newRadio[DataTypes::RatingRole]=9;
0115         newRadio[DataTypes::ImageUrlRole]=QUrl::fromEncoded("https://somafm.com/img3/defcon400.png");
0116         newRadio[DataTypes::ElementTypeRole]=ElisaUtils::Radio;
0117         auto newRadios = DataTypes::ListRadioDataType();
0118 
0119         newRadios.push_back(newRadio);
0120         //Covers are ignored for radios.
0121         musicDb.insertTracksList(newRadios,mNewCovers);
0122         musicDbRadioAddedSpy.wait(300);
0123 
0124         QCOMPARE(musicDb.allRadiosData().count(),initialCount + 1);
0125         QCOMPARE(musicDbRadioAddedSpy.count(),1);
0126         databaseFile.close();
0127     }
0128 
0129     void modifyOneRadio(){
0130         QTemporaryFile databaseFile;
0131         databaseFile.open();
0132         qDebug() << "modifyOneRadio" << databaseFile.fileName();
0133         DatabaseInterface musicDb;
0134         musicDb.init(QStringLiteral("testDb"),databaseFile.fileName());
0135         QSignalSpy musicDbRadioAddedSpy(&musicDb,&DatabaseInterface::radioAdded);
0136         QSignalSpy musicDbRadioModifiedSpy(&musicDb,&DatabaseInterface::radioModified);
0137         int initialCount = musicDb.allRadiosData().count();
0138 
0139         auto newRadio = DataTypes::TrackDataType();
0140         newRadio[DataTypes::CommentRole]=QStringLiteral("Test Comment");
0141         newRadio[DataTypes::ResourceRole]=QUrl::fromEncoded("http://ice2.somafm.com/defcon-128-aac");
0142         newRadio[DataTypes::TitleRole]=QStringLiteral("Test Radio");
0143         newRadio[DataTypes::RatingRole]=9;
0144         newRadio[DataTypes::ImageUrlRole]=QUrl::fromEncoded("https://somafm.com/img3/defcon400.png");
0145         newRadio[DataTypes::ElementTypeRole]=ElisaUtils::Radio;
0146         auto newRadios = DataTypes::ListRadioDataType();
0147 
0148         newRadios.push_back(newRadio);
0149         //Covers are ignored for radios.
0150         musicDb.insertTracksList(newRadios,mNewCovers);
0151         musicDbRadioAddedSpy.wait(300);
0152 
0153         QCOMPARE(musicDb.allRadiosData().count(),initialCount + 1);
0154         QCOMPARE(musicDbRadioAddedSpy.count(),1);
0155 
0156         newRadios.clear();
0157 
0158         auto radioId = musicDb.radioIdFromFileName(QUrl::fromEncoded("http://ice2.somafm.com/defcon-128-aac"));
0159         auto modifiedRadio = musicDb.radioDataFromDatabaseId(radioId);
0160         modifiedRadio[DataTypes::CommentRole]=QStringLiteral("News Test Comment");
0161         newRadios.push_back(modifiedRadio);
0162         musicDb.insertTracksList(newRadios,mNewCovers);
0163 
0164         QCOMPARE(musicDb.allRadiosData().count(),initialCount + 1);
0165         QCOMPARE(musicDbRadioAddedSpy.count(),1);
0166         QCOMPARE(musicDbRadioModifiedSpy.count(),1);
0167         databaseFile.close();
0168     }
0169 
0170     void addOneTrackWithoutAlbumArtist()
0171     {
0172         QTemporaryFile databaseFile;
0173         databaseFile.open();
0174 
0175         qDebug() << "addOneTrackWithoutAlbumArtist" << databaseFile.fileName();
0176 
0177         DatabaseInterface musicDb;
0178 
0179         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
0180 
0181         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0182         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0183         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0184         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0185         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0186         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0187         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0188         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0189         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0190 
0191         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0192         QCOMPARE(musicDb.allArtistsData().count(), 0);
0193         QCOMPARE(musicDb.allTracksData().count(), 0);
0194         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0195         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0196         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0197         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0198         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0199         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0200         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0201         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0202         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0203 
0204         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
0205                 QStringLiteral("artist2"), QStringLiteral("album3"), {},
0206                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
0207                 QDateTime::fromMSecsSinceEpoch(23),
0208         {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
0209                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0210         auto newTracks = DataTypes::ListTrackDataType();
0211         newTracks.push_back(newTrack);
0212 
0213         auto newCovers = mNewCovers;
0214         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0215 
0216         musicDb.insertTracksList(newTracks, newCovers);
0217 
0218         musicDbTrackAddedSpy.wait(300);
0219 
0220         QCOMPARE(musicDb.allAlbumsData().count(), 1);
0221         QCOMPARE(musicDb.allArtistsData().count(), 1);
0222         QCOMPARE(musicDb.allTracksData().count(), 1);
0223         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0224         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0225         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0226         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0227         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0228         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0229         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0230         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0231         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0232 
0233         auto track = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
0234                                                                                                   QStringLiteral("album3"), 6, 1));
0235 
0236         QCOMPARE(track.isValid(), true);
0237         QCOMPARE(track.title(), QStringLiteral("track6"));
0238         QCOMPARE(track.artist(), QStringLiteral("artist2"));
0239         QCOMPARE(track.album(), QStringLiteral("album3"));
0240         QVERIFY(!track.albumArtist().isEmpty());
0241         QCOMPARE(track.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
0242         QCOMPARE(track.trackNumber(), 6);
0243         QCOMPARE(track.discNumber(), 1);
0244         QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(23));
0245         QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$23")));
0246         QCOMPARE(track.rating(), 5);
0247         QCOMPARE(track.genre(), QStringLiteral("genre1"));
0248         QCOMPARE(track.composer(), QStringLiteral("composer1"));
0249         QCOMPARE(track.lyricist(), QStringLiteral("lyricist1"));
0250 
0251         auto albumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"));
0252         QVERIFY(albumId != 0);
0253         auto album = musicDb.albumDataFromDatabaseId(albumId);
0254         auto albumData = musicDb.albumData(albumId);
0255 
0256         QCOMPARE(album.isValid(), true);
0257         QCOMPARE(albumData.count(), 1);
0258         QCOMPARE(album.title(), QStringLiteral("album3"));
0259         QCOMPARE(album.artist(), QStringLiteral("artist2"));
0260         QCOMPARE(album[DataTypes::ColumnsRoles::SecondaryTextRole], QStringLiteral("artist2"));
0261         QVERIFY(album.isValidArtist());
0262         QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3")));
0263         QCOMPARE(album.isSingleDiscAlbum(), true);
0264     }
0265 
0266     void addAndRemoveOneTrackWithoutAlbum()
0267     {
0268         QTemporaryFile databaseFile;
0269         databaseFile.open();
0270 
0271         qDebug() << "addAndRemoveOneTrackWithoutAlbum" << databaseFile.fileName();
0272 
0273         DatabaseInterface musicDb;
0274 
0275         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
0276 
0277         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0278         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0279         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0280         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0281         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0282         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0283         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0284         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0285         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0286 
0287         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0288         QCOMPARE(musicDb.allArtistsData().count(), 0);
0289         QCOMPARE(musicDb.allTracksData().count(), 0);
0290         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0291         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0292         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0293         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0294         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0295         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0296         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0297         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0298         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0299 
0300         auto newTrack = DataTypes::TrackDataType {true, QStringLiteral("$24"), QStringLiteral("0"), QStringLiteral("track10"),
0301                 QStringLiteral("artist8"), {}, QStringLiteral("artist8"),
0302                 9, 1, QTime::fromMSecsSinceStartOfDay(24), {QUrl::fromLocalFile(QStringLiteral("/$24"))}, QDateTime::fromMSecsSinceEpoch(24),
0303         {}, 9, true, QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0304 
0305         auto newTracks = DataTypes::ListTrackDataType();
0306         newTracks.push_back(newTrack);
0307 
0308         auto newCovers = mNewCovers;
0309         newCovers[QStringLiteral("file:///$24")] = QUrl::fromLocalFile(QStringLiteral("album4"));
0310 
0311         musicDb.insertTracksList(newTracks, newCovers);
0312 
0313         musicDbTrackAddedSpy.wait(300);
0314 
0315         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0316         QCOMPARE(musicDb.allArtistsData().count(), 1);
0317         QCOMPARE(musicDb.allTracksData().count(), 1);
0318         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0319         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0320         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0321         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0322         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0323         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0324         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0325         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0326         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0327 
0328         auto trackId = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/$24")));
0329         QVERIFY(trackId != 0);
0330         auto track = musicDb.trackDataFromDatabaseId(trackId);
0331 
0332         QCOMPARE(track.isValid(), true);
0333         QCOMPARE(track.title(), QStringLiteral("track10"));
0334         QCOMPARE(track.artist(), QStringLiteral("artist8"));
0335         QCOMPARE(track.album(), QString());
0336         QVERIFY(!track.albumArtist().isEmpty());
0337         QCOMPARE(track.albumCover(), QUrl());
0338         QCOMPARE(track.trackNumber(), 9);
0339         QCOMPARE(track.discNumber(), 1);
0340         QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(24));
0341         QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$24")));
0342         QCOMPARE(track.rating(), 9);
0343         QCOMPARE(track.genre(), QStringLiteral("genre1"));
0344         QCOMPARE(track.composer(), QStringLiteral("composer1"));
0345         QCOMPARE(track.lyricist(), QStringLiteral("lyricist1"));
0346 
0347         musicDb.removeTracksList({track.resourceURI()});
0348 
0349         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0350         QCOMPARE(musicDb.allArtistsData().count(), 0);
0351         QCOMPARE(musicDb.allTracksData().count(), 0);
0352         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0353         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0354         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0355         QCOMPARE(musicDbArtistRemovedSpy.count(), 1);
0356         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0357         QCOMPARE(musicDbTrackRemovedSpy.count(), 1);
0358         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0359         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0360         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0361     }
0362 
0363     void addAndRemoveOneTrackWithoutTrackNumber()
0364     {
0365         DatabaseInterface musicDb;
0366 
0367         musicDb.init(QStringLiteral("testDb"));
0368 
0369         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0370         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0371         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0372         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0373         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0374         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0375         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0376         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0377         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0378 
0379         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0380         QCOMPARE(musicDb.allArtistsData().count(), 0);
0381         QCOMPARE(musicDb.allTracksData().count(), 0);
0382         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0383         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0384         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0385         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0386         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0387         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0388         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0389         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0390         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0391 
0392         auto newTrack = DataTypes::TrackDataType {true, QStringLiteral("$26"), QStringLiteral("0"), QStringLiteral("track12"),
0393                 QStringLiteral("artist8"), QStringLiteral("album4"), QStringLiteral("artist8"),
0394                 -1, 1, QTime::fromMSecsSinceStartOfDay(26), {QUrl::fromLocalFile(QStringLiteral("/$26"))}, QDateTime::fromMSecsSinceEpoch(26),
0395                 QUrl::fromLocalFile(QStringLiteral("file://image$26")), 9, true,
0396                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0397         newTrack.remove(DataTypes::TrackNumberRole);
0398         auto newTracks = DataTypes::ListTrackDataType();
0399         newTracks.push_back(newTrack);
0400 
0401         auto newCovers = mNewCovers;
0402         newCovers[QStringLiteral("file:///$26")] = QUrl::fromLocalFile(QStringLiteral("album4"));
0403 
0404         musicDb.insertTracksList(newTracks, newCovers);
0405 
0406         musicDbTrackAddedSpy.wait(300);
0407 
0408         QCOMPARE(musicDb.allAlbumsData().count(), 1);
0409         QCOMPARE(musicDb.allArtistsData().count(), 1);
0410         QCOMPARE(musicDb.allTracksData().count(), 1);
0411         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0412         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0413         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0414         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0415         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0416         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0417         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0418         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0419         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0420 
0421         auto track = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/$26"))));
0422 
0423         QCOMPARE(track.isValid(), true);
0424         QCOMPARE(track.title(), QStringLiteral("track12"));
0425         QCOMPARE(track.artist(), QStringLiteral("artist8"));
0426         QCOMPARE(track.album(), QStringLiteral("album4"));
0427         QCOMPARE(track.albumArtist(), QStringLiteral("artist8"));
0428         QCOMPARE(track.albumCover(), QUrl::fromLocalFile(QStringLiteral("album4")));
0429         QCOMPARE(track.hasTrackNumber(), false);
0430         QCOMPARE(track.discNumber(), 1);
0431         QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(26));
0432         QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$26")));
0433         QCOMPARE(track.rating(), 9);
0434         QCOMPARE(track.genre(), QStringLiteral("genre1"));
0435         QCOMPARE(track.composer(), QStringLiteral("composer1"));
0436         QCOMPARE(track.lyricist(), QStringLiteral("lyricist1"));
0437 
0438         musicDb.removeTracksList({track.resourceURI()});
0439 
0440         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0441         QCOMPARE(musicDb.allArtistsData().count(), 0);
0442         QCOMPARE(musicDb.allTracksData().count(), 0);
0443         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0444         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0445         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0446         QCOMPARE(musicDbArtistRemovedSpy.count(), 1);
0447         QCOMPARE(musicDbAlbumRemovedSpy.count(), 1);
0448         QCOMPARE(musicDbTrackRemovedSpy.count(), 1);
0449         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0450         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0451         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0452     }
0453 
0454     void addAndRemoveOneTrackWithoutArtist()
0455     {
0456         DatabaseInterface musicDb;
0457 
0458         musicDb.init(QStringLiteral("testDb"));
0459 
0460         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0461         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0462         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0463         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0464         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0465         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0466         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0467         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0468         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0469 
0470         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0471         QCOMPARE(musicDb.allArtistsData().count(), 0);
0472         QCOMPARE(musicDb.allTracksData().count(), 0);
0473         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0474         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0475         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0476         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0477         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0478         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0479         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0480         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0481         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0482 
0483         auto newTrack = DataTypes::TrackDataType {true, QStringLiteral("$26"), QStringLiteral("0"), QStringLiteral("track11"),
0484         {}, QStringLiteral("album4"), {},
0485                 9, 1, QTime::fromMSecsSinceStartOfDay(26), {QUrl::fromLocalFile(QStringLiteral("/$26"))}, QDateTime::fromMSecsSinceEpoch(26),
0486                 QUrl::fromLocalFile(QStringLiteral("file://image$26")), 9, true,
0487                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0488         auto newTracks = DataTypes::ListTrackDataType();
0489         newTracks.push_back(newTrack);
0490 
0491         auto newCovers = mNewCovers;
0492         newCovers[QStringLiteral("file:///$26")] = QUrl::fromLocalFile(QStringLiteral("album4"));
0493 
0494         musicDb.insertTracksList(newTracks, newCovers);
0495 
0496         musicDbTrackAddedSpy.wait(300);
0497 
0498         QCOMPARE(musicDb.allAlbumsData().count(), 1);
0499         QCOMPARE(musicDb.allArtistsData().count(), 0);
0500         QCOMPARE(musicDb.allTracksData().count(), 1);
0501         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0502         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0503         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0504         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0505         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0506         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0507         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0508         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0509         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0510 
0511         auto track = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/$26"))));
0512 
0513         QCOMPARE(track.isValid(), true);
0514         QCOMPARE(track.title(), QStringLiteral("track11"));
0515         QCOMPARE(track.artist(), QString());
0516         QCOMPARE(track.album(), QStringLiteral("album4"));
0517         QVERIFY(track.albumArtist().isEmpty());
0518         QCOMPARE(track.albumCover(), QUrl::fromLocalFile(QStringLiteral("album4")));
0519         QCOMPARE(track.trackNumber(), 9);
0520         QCOMPARE(track.discNumber(), 1);
0521         QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(26));
0522         QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$26")));
0523         QCOMPARE(track.rating(), 9);
0524         QCOMPARE(track.genre(), QStringLiteral("genre1"));
0525         QCOMPARE(track.composer(), QStringLiteral("composer1"));
0526         QCOMPARE(track.lyricist(), QStringLiteral("lyricist1"));
0527 
0528         musicDb.removeTracksList({track.resourceURI()});
0529 
0530         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0531         QCOMPARE(musicDb.allArtistsData().count(), 0);
0532         QCOMPARE(musicDb.allTracksData().count(), 0);
0533         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0534         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0535         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0536         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0537         QCOMPARE(musicDbAlbumRemovedSpy.count(), 1);
0538         QCOMPARE(musicDbTrackRemovedSpy.count(), 1);
0539         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0540         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0541         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0542     }
0543 
0544     void addOneTrackWithoutAlbumArtistAndAnotherTrackWith()
0545     {
0546         DatabaseInterface musicDb;
0547 
0548         musicDb.init(QStringLiteral("testDb"));
0549 
0550         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0551         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0552         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0553         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0554         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0555         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0556         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0557         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0558         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0559 
0560         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0561         QCOMPARE(musicDb.allArtistsData().count(), 0);
0562         QCOMPARE(musicDb.allTracksData().count(), 0);
0563         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0564         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0565         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0566         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0567         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0568         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0569         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0570         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0571         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0572 
0573         auto newTrack = DataTypes::TrackDataType {true, QStringLiteral("$26"), QStringLiteral("0"), QStringLiteral("track11"),
0574         {}, QStringLiteral("album4"), {},
0575                 9, 1, QTime::fromMSecsSinceStartOfDay(26), {QUrl::fromLocalFile(QStringLiteral("/$26"))}, QDateTime::fromMSecsSinceEpoch(26),
0576                 QUrl::fromLocalFile(QStringLiteral("file://image$26")), 9, true,
0577                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0578         auto newTracks = DataTypes::ListTrackDataType();
0579         newTracks.push_back(newTrack);
0580 
0581         auto newCovers = mNewCovers;
0582         newCovers[QStringLiteral("file:///$26")] = QUrl::fromLocalFile(QStringLiteral("album4"));
0583 
0584         musicDb.insertTracksList(newTracks, newCovers);
0585 
0586         musicDbTrackAddedSpy.wait(300);
0587 
0588         QCOMPARE(musicDb.allAlbumsData().count(), 1);
0589         QCOMPARE(musicDb.allArtistsData().count(), 0);
0590         QCOMPARE(musicDb.allTracksData().count(), 1);
0591         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0592         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0593         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0594         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0595         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0596         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0597         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0598         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0599         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0600 
0601         auto track = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/$26"))));
0602 
0603         QCOMPARE(track.isValid(), true);
0604         QCOMPARE(track.title(), QStringLiteral("track11"));
0605         QCOMPARE(track.artist(), QString());
0606         QCOMPARE(track.album(), QStringLiteral("album4"));
0607         QCOMPARE(track.albumArtist(), QString());
0608         QVERIFY(track.albumArtist().isEmpty());
0609         QCOMPARE(track.albumCover(), QUrl::fromLocalFile(QStringLiteral("album4")));
0610         QCOMPARE(track.trackNumber(), 9);
0611         QCOMPARE(track.discNumber(), 1);
0612         QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(26));
0613         QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$26")));
0614         QCOMPARE(track.rating(), 9);
0615         QCOMPARE(track.genre(), QStringLiteral("genre1"));
0616         QCOMPARE(track.composer(), QStringLiteral("composer1"));
0617         QCOMPARE(track.lyricist(), QStringLiteral("lyricist1"));
0618 
0619         newTrack = DataTypes::TrackDataType {true, QStringLiteral("$27"), QStringLiteral("0"), QStringLiteral("track12"),
0620                 QStringLiteral("artist1"), QStringLiteral("album4"), QStringLiteral("artist2"),
0621                 10, 1, QTime::fromMSecsSinceStartOfDay(27), {QUrl::fromLocalFile(QStringLiteral("/autre/$27"))}, QDateTime::fromMSecsSinceEpoch(27),
0622                 QUrl::fromLocalFile(QStringLiteral("file://image$27")), 10, true,
0623                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
0624         newTracks = DataTypes::ListTrackDataType();
0625         newTracks.push_back(newTrack);
0626 
0627         newCovers = mNewCovers;
0628         newCovers[QStringLiteral("file:///autre/$27")] = QUrl::fromLocalFile(QStringLiteral("album4"));
0629 
0630         musicDb.insertTracksList(newTracks, newCovers);
0631 
0632         musicDbTrackAddedSpy.wait(300);
0633 
0634         QCOMPARE(musicDb.allAlbumsData().count(), 2);
0635         QCOMPARE(musicDb.allArtistsData().count(), 2);
0636         QCOMPARE(musicDb.allTracksData().count(), 2);
0637         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0638         QCOMPARE(musicDbAlbumAddedSpy.count(), 2);
0639         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
0640         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0641         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0642         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0643         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0644         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0645         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0646     }
0647 
0648     void addTwoTracksWithoutAlbumArtist()
0649     {
0650         QTemporaryFile databaseFile;
0651         databaseFile.open();
0652 
0653         qDebug() << "addTwoTracksWithoutAlbumArtist" << databaseFile.fileName();
0654 
0655         DatabaseInterface musicDb;
0656 
0657         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
0658 
0659         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0660         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0661         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0662         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0663         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0664         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0665         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0666         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0667         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0668 
0669         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0670         QCOMPARE(musicDb.allArtistsData().count(), 0);
0671         QCOMPARE(musicDb.allTracksData().count(), 0);
0672         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0673         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0674         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0675         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0676         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0677         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0678         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0679         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0680         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0681 
0682         auto newTracks = DataTypes::ListTrackDataType();
0683 
0684         newTracks = {{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"),
0685                       QStringLiteral("artist2"), QStringLiteral("album3"), {}, 6, 1, QTime::fromMSecsSinceStartOfDay(19),
0686                       {QUrl::fromLocalFile(QStringLiteral("/$19"))},
0687                       QDateTime::fromMSecsSinceEpoch(23),
0688                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
0689                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), true},
0690                      {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"),
0691                       QStringLiteral("artist3"), QStringLiteral("album3"), {}, 7, 1, QTime::fromMSecsSinceStartOfDay(20),
0692                       {QUrl::fromLocalFile(QStringLiteral("/$20"))},
0693                       QDateTime::fromMSecsSinceEpoch(23),
0694                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
0695                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
0696 
0697         auto newCovers = mNewCovers;
0698         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0699         newCovers[QStringLiteral("file:///$20")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0700 
0701         musicDb.insertTracksList(newTracks, newCovers);
0702 
0703         musicDbTrackAddedSpy.wait(300);
0704 
0705         QCOMPARE(musicDb.allAlbumsData().count(), 1);
0706         QCOMPARE(musicDb.allArtistsData().count(), 2);
0707         QCOMPARE(musicDb.allTracksData().count(), 2);
0708         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0709         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0710         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0711         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0712         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0713         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0714         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0715         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0716         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0717 
0718         auto firstTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
0719                                                                                                        QStringLiteral("album3"), 6, 1));
0720 
0721         QCOMPARE(firstTrack.isValid(), true);
0722         QCOMPARE(firstTrack.title(), QStringLiteral("track6"));
0723         QCOMPARE(firstTrack.artist(), QStringLiteral("artist2"));
0724         QCOMPARE(firstTrack.album(), QStringLiteral("album3"));
0725         QVERIFY(!firstTrack.albumArtist().isEmpty());
0726         QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
0727         QCOMPARE(firstTrack.trackNumber(), 6);
0728         QCOMPARE(firstTrack.discNumber(), 1);
0729         QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(19));
0730         QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19")));
0731         QCOMPARE(firstTrack.rating(), 5);
0732         QCOMPARE(firstTrack.genre(), QStringLiteral("genre1"));
0733         QCOMPARE(firstTrack.composer(), QStringLiteral("composer1"));
0734         QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1"));
0735         QCOMPARE(firstTrack.hasEmbeddedCover(), true);
0736 
0737         auto secondTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist3"),
0738                                                                                                         QStringLiteral("album3"), 7, 1));
0739 
0740         QCOMPARE(secondTrack.isValid(), true);
0741         QCOMPARE(secondTrack.title(), QStringLiteral("track7"));
0742         QCOMPARE(secondTrack.artist(), QStringLiteral("artist3"));
0743         QCOMPARE(secondTrack.album(), QStringLiteral("album3"));
0744         QVERIFY(!secondTrack.albumArtist().isEmpty());
0745         QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
0746         QCOMPARE(secondTrack.trackNumber(), 7);
0747         QCOMPARE(secondTrack.discNumber(), 1);
0748         QCOMPARE(secondTrack.duration(), QTime::fromMSecsSinceStartOfDay(20));
0749         QCOMPARE(secondTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$20")));
0750         QCOMPARE(secondTrack.rating(), 5);
0751         QCOMPARE(secondTrack.genre(), QStringLiteral("genre1"));
0752         QCOMPARE(secondTrack.composer(), QStringLiteral("composer1"));
0753         QCOMPARE(secondTrack.lyricist(), QStringLiteral("lyricist1"));
0754         QCOMPARE(secondTrack.hasEmbeddedCover(), false);
0755 
0756         auto albumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), {}, QStringLiteral("/"));
0757         auto album = musicDb.albumDataFromDatabaseId(albumId);
0758         auto albumData = musicDb.albumData(albumId);
0759 
0760         QCOMPARE(album.isValid(), true);
0761         QCOMPARE(albumData.count(), 2);
0762         QCOMPARE(album.title(), QStringLiteral("album3"));
0763         QVERIFY(album.isValidArtist());
0764         QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3")));
0765         QCOMPARE(album.isSingleDiscAlbum(), true);
0766     }
0767 
0768     void addThreeTracksWithoutAlbumArtistButSameArtist()
0769     {
0770         DatabaseInterface musicDb;
0771 
0772         musicDb.init(QStringLiteral("testDb"));
0773 
0774         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0775         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0776         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0777         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0778         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0779         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0780         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0781         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0782         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0783 
0784         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0785         QCOMPARE(musicDb.allArtistsData().count(), 0);
0786         QCOMPARE(musicDb.allTracksData().count(), 0);
0787         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0788         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0789         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0790         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0791         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0792         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0793         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0794         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0795         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0796 
0797         auto newTracks = DataTypes::ListTrackDataType();
0798 
0799         newTracks = {{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"),
0800                       QStringLiteral("artist2"), QStringLiteral("album3"), {}, 6, 1,
0801                       QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))},
0802                       QDateTime::fromMSecsSinceEpoch(19),
0803                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
0804                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
0805                      {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"),
0806                       QStringLiteral("artist2"), QStringLiteral("album3"), {}, 7, 1,
0807                       QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/$20"))},
0808                       QDateTime::fromMSecsSinceEpoch(20),
0809                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 4, true,
0810                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
0811                      {true, QStringLiteral("$21"), QStringLiteral("0"), QStringLiteral("track8"),
0812                       QStringLiteral("artist2"), QStringLiteral("album3"), {}, 8, 1,
0813                       QTime::fromMSecsSinceStartOfDay(21), {QUrl::fromLocalFile(QStringLiteral("/$21"))},
0814                       QDateTime::fromMSecsSinceEpoch(21),
0815                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 3, true,
0816                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
0817 
0818         auto newCovers = mNewCovers;
0819         newCovers[QStringLiteral("file:///$19")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0820         newCovers[QStringLiteral("file:///$20")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0821         newCovers[QStringLiteral("file:///$21")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0822 
0823         musicDb.insertTracksList(newTracks, newCovers);
0824 
0825         musicDbTrackAddedSpy.wait(300);
0826 
0827         QCOMPARE(musicDb.allAlbumsData().count(), 1);
0828         QCOMPARE(musicDb.allArtistsData().count(), 1);
0829         QCOMPARE(musicDb.allTracksData().count(), 3);
0830         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0831         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0832         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0833         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0834         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0835         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0836         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0837         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0838         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0839 
0840         auto firstTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
0841                                                                                                        QStringLiteral("album3"), 6, 1));
0842 
0843         QCOMPARE(firstTrack.isValid(), true);
0844         QCOMPARE(firstTrack.title(), QStringLiteral("track6"));
0845         QCOMPARE(firstTrack.artist(), QStringLiteral("artist2"));
0846         QCOMPARE(firstTrack.album(), QStringLiteral("album3"));
0847         QVERIFY(!firstTrack.albumArtist().isEmpty());
0848         QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
0849         QCOMPARE(firstTrack.trackNumber(), 6);
0850         QCOMPARE(firstTrack.discNumber(), 1);
0851         QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(19));
0852         QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19")));
0853         QCOMPARE(firstTrack.rating(), 5);
0854         QCOMPARE(firstTrack.genre(), QStringLiteral("genre1"));
0855         QCOMPARE(firstTrack.composer(), QStringLiteral("composer1"));
0856         QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1"));
0857         QCOMPARE(firstTrack.isSingleDiscAlbum(), true);
0858 
0859         auto secondTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist2"),
0860                                                                                                         QStringLiteral("album3"), 7, 1));
0861 
0862         QCOMPARE(secondTrack.isValid(), true);
0863         QCOMPARE(secondTrack.title(), QStringLiteral("track7"));
0864         QCOMPARE(secondTrack.artist(), QStringLiteral("artist2"));
0865         QCOMPARE(secondTrack.album(), QStringLiteral("album3"));
0866         QVERIFY(!secondTrack.albumArtist().isEmpty());
0867         QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
0868         QCOMPARE(secondTrack.trackNumber(), 7);
0869         QCOMPARE(secondTrack.discNumber(), 1);
0870         QCOMPARE(secondTrack.duration(), QTime::fromMSecsSinceStartOfDay(20));
0871         QCOMPARE(secondTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$20")));
0872         QCOMPARE(secondTrack.rating(), 4);
0873         QCOMPARE(secondTrack.genre(), QStringLiteral("genre1"));
0874         QCOMPARE(secondTrack.composer(), QStringLiteral("composer1"));
0875         QCOMPARE(secondTrack.lyricist(), QStringLiteral("lyricist1"));
0876         QCOMPARE(secondTrack.isSingleDiscAlbum(), true);
0877         QCOMPARE(secondTrack.hasEmbeddedCover(), false);
0878 
0879         auto thirdTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track8"), QStringLiteral("artist2"),
0880                                                                                                        QStringLiteral("album3"), 8, 1));
0881 
0882         QCOMPARE(thirdTrack.isValid(), true);
0883         QCOMPARE(thirdTrack.title(), QStringLiteral("track8"));
0884         QCOMPARE(thirdTrack.artist(), QStringLiteral("artist2"));
0885         QCOMPARE(thirdTrack.album(), QStringLiteral("album3"));
0886         QVERIFY(!thirdTrack.albumArtist().isEmpty());
0887         QCOMPARE(thirdTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
0888         QCOMPARE(thirdTrack.trackNumber(), 8);
0889         QCOMPARE(thirdTrack.discNumber(), 1);
0890         QCOMPARE(thirdTrack.duration(), QTime::fromMSecsSinceStartOfDay(21));
0891         QCOMPARE(thirdTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$21")));
0892         QCOMPARE(thirdTrack.rating(), 3);
0893         QCOMPARE(thirdTrack.genre(), QStringLiteral("genre1"));
0894         QCOMPARE(thirdTrack.composer(), QStringLiteral("composer1"));
0895         QCOMPARE(thirdTrack.lyricist(), QStringLiteral("lyricist1"));
0896         QCOMPARE(thirdTrack.isSingleDiscAlbum(), true);
0897 
0898         auto albumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), {}, QStringLiteral("/"));
0899         auto album = musicDb.albumDataFromDatabaseId(albumId);
0900         auto albumData = musicDb.albumData(albumId);
0901 
0902         QCOMPARE(album.isValid(), true);
0903         QCOMPARE(albumData.count(), 3);
0904         QCOMPARE(album.title(), QStringLiteral("album3"));
0905         QVERIFY(album.isValidArtist());
0906         QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3")));
0907         QCOMPARE(album.isSingleDiscAlbum(), true);
0908     }
0909 
0910     void addTwoTracksWithPartialAlbumArtist()
0911     {
0912         QTemporaryFile databaseFile;
0913         databaseFile.open();
0914 
0915         qDebug() << "addTwoTracksWithPartialAlbumArtist" << databaseFile.fileName();
0916 
0917         DatabaseInterface musicDb;
0918 
0919         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
0920 
0921         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
0922         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
0923         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
0924         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
0925         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
0926         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
0927         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
0928         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
0929         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
0930 
0931         QCOMPARE(musicDb.allAlbumsData().count(), 0);
0932         QCOMPARE(musicDb.allArtistsData().count(), 0);
0933         QCOMPARE(musicDb.allTracksData().count(), 0);
0934         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
0935         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
0936         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
0937         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0938         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0939         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0940         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0941         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0942         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0943 
0944         auto newTracks = DataTypes::ListTrackDataType();
0945 
0946         newTracks = {{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"),
0947                       QStringLiteral("artist2"), QStringLiteral("album3"), {}, 6, 1,
0948                       QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))},
0949                       QDateTime::fromMSecsSinceEpoch(19),
0950                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
0951                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), true},
0952                      {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"),
0953                       QStringLiteral("artist3"), QStringLiteral("album3"), {QStringLiteral("artist4")}, 7, 1,
0954                       QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/$20"))},
0955                       QDateTime::fromMSecsSinceEpoch(20),
0956                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
0957                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
0958 
0959         auto newCovers = mNewCovers;
0960         newCovers[QStringLiteral("file:///$19")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0961         newCovers[QStringLiteral("file:///$20")] = QUrl::fromLocalFile(QStringLiteral("album3"));
0962 
0963         musicDb.insertTracksList(newTracks, newCovers);
0964 
0965         musicDbTrackAddedSpy.wait(300);
0966 
0967         QCOMPARE(musicDb.allAlbumsData().count(), 1);
0968         QCOMPARE(musicDb.allArtistsData().count(), 3);
0969         QCOMPARE(musicDb.allTracksData().count(), 2);
0970         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
0971         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
0972         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
0973         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
0974         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
0975         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
0976         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
0977         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
0978         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
0979 
0980         auto firstTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
0981                                                                                                        QStringLiteral("album3"), 6, 1));
0982 
0983         QCOMPARE(firstTrack.isValid(), true);
0984         QCOMPARE(firstTrack.title(), QStringLiteral("track6"));
0985         QCOMPARE(firstTrack.artist(), QStringLiteral("artist2"));
0986         QCOMPARE(firstTrack.album(), QStringLiteral("album3"));
0987         QCOMPARE(firstTrack.albumArtist(), QStringLiteral("artist4"));
0988         QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
0989         QCOMPARE(firstTrack.trackNumber(), 6);
0990         QCOMPARE(firstTrack.discNumber(), 1);
0991         QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(19));
0992         QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19")));
0993         QCOMPARE(firstTrack.rating(), 5);
0994         QCOMPARE(firstTrack.genre(), QStringLiteral("genre1"));
0995         QCOMPARE(firstTrack.composer(), QStringLiteral("composer1"));
0996         QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1"));
0997         QCOMPARE(firstTrack.isSingleDiscAlbum(), true);
0998         QCOMPARE(firstTrack.hasEmbeddedCover(), true);
0999 
1000         auto secondTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist3"),
1001                                                                                                         QStringLiteral("album3"), 7, 1));
1002 
1003         QCOMPARE(secondTrack.isValid(), true);
1004         QCOMPARE(secondTrack.title(), QStringLiteral("track7"));
1005         QCOMPARE(secondTrack.artist(), QStringLiteral("artist3"));
1006         QCOMPARE(secondTrack.album(), QStringLiteral("album3"));
1007         QCOMPARE(secondTrack.albumArtist(), QStringLiteral("artist4"));
1008         QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
1009         QCOMPARE(secondTrack.trackNumber(), 7);
1010         QCOMPARE(secondTrack.discNumber(), 1);
1011         QCOMPARE(secondTrack.duration(), QTime::fromMSecsSinceStartOfDay(20));
1012         QCOMPARE(secondTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$20")));
1013         QCOMPARE(secondTrack.rating(), 5);
1014         QCOMPARE(secondTrack.genre(), QStringLiteral("genre1"));
1015         QCOMPARE(secondTrack.composer(), QStringLiteral("composer1"));
1016         QCOMPARE(secondTrack.lyricist(), QStringLiteral("lyricist1"));
1017         QCOMPARE(secondTrack.isSingleDiscAlbum(), true);
1018         QCOMPARE(secondTrack.hasEmbeddedCover(), false);
1019 
1020         auto albumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist4"), QStringLiteral("/"));
1021         auto album = musicDb.albumDataFromDatabaseId(albumId);
1022         auto albumData = musicDb.albumData(albumId);
1023 
1024         QCOMPARE(album.isValid(), true);
1025         QCOMPARE(albumData.count(), 2);
1026         QCOMPARE(album.title(), QStringLiteral("album3"));
1027         QCOMPARE(album.artist(), QStringLiteral("artist4"));
1028         QCOMPARE(album.isValidArtist(), true);
1029         QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3")));
1030         QCOMPARE(album.isSingleDiscAlbum(), true);
1031     }
1032 
1033     void addMultipleTimeSameTracks()
1034     {
1035         QTemporaryFile databaseFile;
1036         databaseFile.open();
1037 
1038         qDebug() << "addMultipleTimeSameTracks" << databaseFile.fileName();
1039 
1040         DatabaseInterface musicDb;
1041 
1042         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1043         QSignalSpy musicDbErrorSpy(&musicDb, &DatabaseInterface::databaseError);
1044 
1045         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
1046 
1047         musicDb.insertTracksList(mNewTracks, mNewCovers);
1048 
1049         musicDbTrackAddedSpy.wait(300);
1050 
1051         QCOMPARE(musicDb.allAlbumsData().count(), 5);
1052         QCOMPARE(musicDbErrorSpy.count(), 0);
1053 
1054         musicDb.insertTracksList(mNewTracks, mNewCovers);
1055 
1056         musicDbTrackAddedSpy.wait(300);
1057 
1058         QCOMPARE(musicDb.allAlbumsData().count(), 5);
1059         QCOMPARE(musicDbErrorSpy.count(), 0);
1060 
1061         musicDb.insertTracksList(mNewTracks, mNewCovers);
1062 
1063         musicDbTrackAddedSpy.wait(300);
1064 
1065         QCOMPARE(musicDb.allAlbumsData().count(), 5);
1066         QCOMPARE(musicDbErrorSpy.count(), 0);
1067 
1068         musicDb.insertTracksList(mNewTracks, mNewCovers);
1069 
1070         musicDbTrackAddedSpy.wait(300);
1071 
1072         QCOMPARE(musicDb.allAlbumsData().count(), 5);
1073         QCOMPARE(musicDbErrorSpy.count(), 0);
1074 
1075         auto firstAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")));
1076 
1077         QCOMPARE(firstAlbum.isValid(), true);
1078         QCOMPARE(firstAlbum.title(), QStringLiteral("album1"));
1079         QCOMPARE(musicDbErrorSpy.count(), 0);
1080 
1081         auto firstAlbumInvalid = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1Invalid"), QStringLiteral("Invalid Artist"), QStringLiteral("/")));
1082 
1083         QCOMPARE(firstAlbumInvalid.isValid(), false);
1084         QCOMPARE(musicDbErrorSpy.count(), 0);
1085     }
1086 
1087     void addTwiceSameTracksWithDatabaseFile()
1088     {
1089         QTemporaryFile myTempDatabase;
1090         myTempDatabase.open();
1091 
1092         {
1093             DatabaseInterface musicDb;
1094 
1095             QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1096 
1097             musicDb.init(QStringLiteral("testDb1"), myTempDatabase.fileName());
1098 
1099             musicDb.insertTracksList(mNewTracks, mNewCovers);
1100 
1101             musicDbTrackAddedSpy.wait(300);
1102 
1103             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1104 
1105             auto firstAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")));
1106 
1107             QCOMPARE(firstAlbum.isValid(), true);
1108             QCOMPARE(firstAlbum.title(), QStringLiteral("album1"));
1109 
1110             auto firstAlbumInvalid = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1Invalid"), QStringLiteral("Invalid Artist"), QStringLiteral("/")));
1111 
1112             QCOMPARE(firstAlbumInvalid.isValid(), false);
1113         }
1114 
1115         {
1116             DatabaseInterface musicDb;
1117 
1118             QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1119 
1120             musicDb.init(QStringLiteral("testDb2"), myTempDatabase.fileName());
1121 
1122             musicDb.insertTracksList(mNewTracks, mNewCovers);
1123 
1124             musicDbTrackAddedSpy.wait(300);
1125 
1126             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1127 
1128             auto firstAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")));
1129 
1130             QCOMPARE(firstAlbum.isValid(), true);
1131             QCOMPARE(firstAlbum.title(), QStringLiteral("album1"));
1132 
1133             auto firstAlbumInvalid = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1Invalid"), QStringLiteral("Invalid Artist"), QStringLiteral("/")));
1134 
1135             QCOMPARE(firstAlbumInvalid.isValid(), false);
1136         }
1137     }
1138 
1139     void restoreModifiedTracksWidthDatabaseFile()
1140     {
1141         QTemporaryFile myTempDatabase;
1142         myTempDatabase.open();
1143 
1144         {
1145             DatabaseInterface musicDb;
1146 
1147             QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
1148             QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
1149             QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1150             QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
1151             QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
1152             QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
1153             QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
1154             QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
1155             QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
1156 
1157             QCOMPARE(musicDb.allAlbumsData().count(), 0);
1158             QCOMPARE(musicDb.allArtistsData().count(), 0);
1159             QCOMPARE(musicDb.allTracksData().count(), 0);
1160             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1161             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1162             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1163             QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
1164             QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
1165             QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
1166             QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
1167             QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
1168             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
1169 
1170             auto allNewTracks = mNewTracks;
1171             allNewTracks.push_back({true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
1172                                     QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
1173                                     6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
1174                                     QDateTime::fromMSecsSinceEpoch(23),
1175                                     {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
1176                                     QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false});
1177 
1178             musicDb.init(QStringLiteral("testDb1"), myTempDatabase.fileName());
1179 
1180             QCOMPARE(musicDb.allAlbumsData().count(), 0);
1181             QCOMPARE(musicDb.allArtistsData().count(), 0);
1182             QCOMPARE(musicDb.allTracksData().count(), 0);
1183             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1184             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1185             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1186             QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
1187             QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
1188             QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
1189             QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
1190             QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
1191             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
1192 
1193             qDebug() << "restoreModifiedTracksWidthDatabaseFile" << myTempDatabase.fileName();
1194 
1195             auto newCovers = mNewCovers;
1196             newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
1197 
1198             musicDb.insertTracksList(allNewTracks, newCovers);
1199 
1200             musicDbTrackAddedSpy.wait(300);
1201 
1202             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1203             QCOMPARE(musicDb.allArtistsData().count(), 7);
1204             QCOMPARE(musicDb.allTracksData().count(), 23);
1205             QCOMPARE(musicDbArtistAddedSpy.count(), 1);
1206             QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
1207             QCOMPARE(musicDbTrackAddedSpy.count(), 1);
1208             QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
1209             QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
1210             QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
1211             QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
1212             QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
1213             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
1214 
1215             auto firstAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")));
1216 
1217             QCOMPARE(firstAlbum.isValid(), true);
1218             QCOMPARE(firstAlbum.title(), QStringLiteral("album1"));
1219 
1220             auto firstAlbumInvalid = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1Invalid"), QStringLiteral("Invalid Artist"), QStringLiteral("/")));
1221 
1222             QCOMPARE(firstAlbumInvalid.isValid(), false);
1223 
1224             auto fourthAlbumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"));
1225             auto fourthAlbum = musicDb.albumDataFromDatabaseId(fourthAlbumId);
1226             auto fourthAlbumData = musicDb.albumData(fourthAlbumId);
1227 
1228             QCOMPARE(fourthAlbum.isValid(), true);
1229             QCOMPARE(fourthAlbum.title(), QStringLiteral("album3"));
1230 
1231             QCOMPARE(fourthAlbumData.count(), 4);
1232 
1233             const auto &oneTrack = fourthAlbumData.at(3);
1234 
1235             QCOMPARE(oneTrack.isValid(), true);
1236             QCOMPARE(oneTrack.rating(), 5);
1237         }
1238 
1239         {
1240             DatabaseInterface musicDb;
1241 
1242             QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
1243             QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
1244             QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1245             QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
1246             QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
1247             QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
1248             QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
1249             QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
1250             QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
1251 
1252             QCOMPARE(musicDb.allAlbumsData().count(), 0);
1253             QCOMPARE(musicDb.allArtistsData().count(), 0);
1254             QCOMPARE(musicDb.allTracksData().count(), 0);
1255             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1256             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1257             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1258             QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
1259             QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
1260             QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
1261             QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
1262             QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
1263             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
1264 
1265             auto allNewTracks = mNewTracks;
1266             allNewTracks.push_back({true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
1267                                     QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
1268                                     6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
1269                                     QDateTime::fromMSecsSinceEpoch(23),
1270                                     {QUrl::fromLocalFile(QStringLiteral("album3"))}, 3, true,
1271                                     QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false});
1272 
1273             musicDb.init(QStringLiteral("testDb2"), myTempDatabase.fileName());
1274 
1275             qDebug() << "restoreModifiedTracksWidthDatabaseFile" << myTempDatabase.fileName();
1276 
1277             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1278             QCOMPARE(musicDb.allArtistsData().count(), 7);
1279             QCOMPARE(musicDb.allTracksData().count(), 23);
1280             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1281             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1282             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1283             QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
1284             QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
1285             QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
1286             QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
1287             QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
1288             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
1289 
1290             auto newCovers = mNewCovers;
1291             newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
1292 
1293             musicDb.insertTracksList(allNewTracks, newCovers);
1294 
1295             musicDbTrackAddedSpy.wait(300);
1296 
1297             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1298             QCOMPARE(musicDb.allArtistsData().count(), 7);
1299             QCOMPARE(musicDb.allTracksData().count(), 23);
1300             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1301             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1302             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1303             QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
1304             QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
1305             QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
1306             QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
1307             QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
1308             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
1309 
1310             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1311 
1312             auto firstAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/")));
1313 
1314             QCOMPARE(firstAlbum.isValid(), true);
1315             QCOMPARE(firstAlbum.title(), QStringLiteral("album1"));
1316 
1317             auto firstAlbumInvalid = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1Invalid"), QStringLiteral("Invalid Artist"), QStringLiteral("/")));
1318 
1319             QCOMPARE(firstAlbumInvalid.isValid(), false);
1320 
1321             auto fourthAlbumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"));
1322             auto fourthAlbum = musicDb.albumDataFromDatabaseId(fourthAlbumId);
1323             auto fourthAlbumData = musicDb.albumData(fourthAlbumId);
1324 
1325             QCOMPARE(fourthAlbum.isValid(), true);
1326             QCOMPARE(fourthAlbum.title(), QStringLiteral("album3"));
1327 
1328             QCOMPARE(fourthAlbumData.count(), 4);
1329 
1330             const auto &oneTrack = fourthAlbumData.at(3);
1331 
1332             QCOMPARE(oneTrack.isValid(), true);
1333             QCOMPARE(oneTrack.title(), QStringLiteral("track6"));
1334             QCOMPARE(oneTrack.rating(), 3);
1335         }
1336     }
1337 
1338 
1339     void simpleAccessor()
1340     {
1341         DatabaseInterface musicDb;
1342 
1343         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1344 
1345         musicDb.init(QStringLiteral("testDb"));
1346 
1347         musicDb.insertTracksList(mNewTracks, mNewCovers);
1348         musicDb.insertTracksList(mNewTracks, mNewCovers);
1349         musicDb.insertTracksList(mNewTracks, mNewCovers);
1350         musicDb.insertTracksList(mNewTracks, mNewCovers);
1351 
1352         musicDbTrackAddedSpy.wait(300);
1353 
1354         QCOMPARE(musicDb.allAlbumsData().count(), 5);
1355 
1356         auto allAlbums = musicDb.allAlbumsData();
1357 
1358         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
1359         auto firstAlbumTitle = allAlbums[0].title();
1360         auto firstAlbumArtist = allAlbums[0].artist();
1361         auto firstAlbumImage = allAlbums[0].albumArtURI();
1362         auto firstAlbumTracksCount = firstAlbumData.count();
1363         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
1364 
1365         QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
1366         QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
1367         QCOMPARE(firstAlbumImage.isValid(), true);
1368         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1369         QCOMPARE(firstAlbumTracksCount, 4);
1370         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
1371 
1372         auto invalidTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 1);
1373         QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0));
1374 
1375         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
1376 
1377         auto firstTrack = musicDb.trackDataFromDatabaseId(trackId);
1378 
1379         auto firstTrackTitle = firstTrack.title();
1380         auto firstTrackArtist = firstTrack.artist();
1381         auto firstTrackAlbumArtist = firstTrack.albumArtist();
1382         auto firstTrackAlbum = firstTrack.album();
1383         auto firstTrackImage = firstTrack.albumCover();
1384         auto firstTrackDuration = firstTrack.duration();
1385         auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
1386         auto firstTrackTrackNumber = firstTrack.trackNumber();
1387         auto firstTrackDiscNumber = firstTrack.discNumber();
1388         const auto &firstTrackResource = firstTrack.resourceURI();
1389         auto firstTrackRating = firstTrack.rating();
1390         auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
1391 
1392         QCOMPARE(firstTrack.isValid(), true);
1393         QCOMPARE(firstTrackTitle, QStringLiteral("track1"));
1394         QCOMPARE(firstTrackArtist, QStringLiteral("artist1"));
1395         QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists"));
1396         QCOMPARE(firstTrackAlbum, QStringLiteral("album1"));
1397         QCOMPARE(firstTrackImage.isValid(), true);
1398         QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1399         QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1));
1400         QCOMPARE(firstTrackMilliSecondsDuration, 1);
1401         QCOMPARE(firstTrackTrackNumber, 1);
1402         QCOMPARE(firstTrackDiscNumber, 1);
1403         QCOMPARE(firstTrackResource.isValid(), true);
1404         QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1")));
1405         QCOMPARE(firstTrackRating, 1);
1406         QCOMPARE(firstIsSingleDiscAlbum, false);
1407 
1408         auto secondAlbumData = musicDb.albumData(allAlbums[1].databaseId());
1409         auto secondAlbumTitle = allAlbums[1].title();
1410         auto secondAlbumArtist = allAlbums[1].artist();
1411         auto secondAlbumImage = allAlbums[1].albumArtURI();
1412         auto secondAlbumTracksCount = secondAlbumData.count();
1413         auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum();
1414 
1415         QCOMPARE(secondAlbumTitle, QStringLiteral("album2"));
1416         QCOMPARE(secondAlbumArtist, QStringLiteral("artist1"));
1417         QCOMPARE(secondAlbumImage.isValid(), true);
1418         QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2")));
1419         QCOMPARE(secondAlbumTracksCount, 6);
1420         QCOMPARE(secondAlbumIsSingleDiscAlbum, true);
1421     }
1422 
1423     void simpleAccessorAndVariousArtistAlbum()
1424     {
1425         DatabaseInterface musicDb;
1426 
1427         musicDb.init(QStringLiteral("testDbVariousArtistAlbum"));
1428 
1429         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
1430         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
1431         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1432 
1433         musicDb.insertTracksList(mNewTracks, mNewCovers);
1434         musicDb.insertTracksList(mNewTracks, mNewCovers);
1435         musicDb.insertTracksList(mNewTracks, mNewCovers);
1436         musicDb.insertTracksList(mNewTracks, mNewCovers);
1437 
1438         musicDbTrackAddedSpy.wait(300);
1439 
1440         QCOMPARE(musicDb.allAlbumsData().count(), 5);
1441         QCOMPARE(musicDb.allArtistsData().count(), 7);
1442         QCOMPARE(musicDb.allTracksData().count(), 22);
1443         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
1444         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
1445         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
1446 
1447         auto allAlbums = musicDb.allAlbumsData();
1448 
1449         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
1450         auto firstAlbumTitle = allAlbums[0].title();
1451         auto firstAlbumArtist = allAlbums[0].artist();
1452         auto firstAlbumImage = allAlbums[0].albumArtURI();
1453         auto firstAlbumTracksCount = firstAlbumData.count();
1454         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
1455 
1456         QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
1457         QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
1458         QCOMPARE(firstAlbumImage.isValid(), true);
1459         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1460         QCOMPARE(firstAlbumTracksCount, 4);
1461         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
1462 
1463         auto invalidTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 1);
1464         QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0));
1465 
1466         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
1467         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
1468 
1469         auto firstTrackTitle = firstTrack.title();
1470         auto firstTrackArtist = firstTrack.artist();
1471         auto firstTrackAlbumArtist = firstTrack.albumArtist();
1472         auto firstTrackAlbum = firstTrack.album();
1473         auto firstTrackImage = firstTrack.albumCover();
1474         auto firstTrackDuration = firstTrack.duration();
1475         auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
1476         auto firstTrackTrackNumber = firstTrack.trackNumber();
1477         auto firstTrackDiscNumber = firstTrack.discNumber();
1478         const auto &firstTrackResource = firstTrack.resourceURI();
1479         auto firstTrackRating = firstTrack.rating();
1480         auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
1481 
1482         QCOMPARE(firstTrack.isValid(), true);
1483         QCOMPARE(firstTrackTitle, QStringLiteral("track1"));
1484         QCOMPARE(firstTrackArtist, QStringLiteral("artist1"));
1485         QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists"));
1486         QCOMPARE(firstTrackAlbum, QStringLiteral("album1"));
1487         QCOMPARE(firstTrackImage.isValid(), true);
1488         QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1489         QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1));
1490         QCOMPARE(firstTrackMilliSecondsDuration, 1);
1491         QCOMPARE(firstTrackTrackNumber, 1);
1492         QCOMPARE(firstTrackDiscNumber, 1);
1493         QCOMPARE(firstTrackResource.isValid(), true);
1494         QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1")));
1495         QCOMPARE(firstTrackRating, 1);
1496         QCOMPARE(firstIsSingleDiscAlbum, false);
1497 
1498         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
1499                                                                           QStringLiteral("album1"), 2, 2);
1500         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
1501 
1502         auto secondTrackTitle = secondTrack.title();
1503         auto secondTrackArtist = secondTrack.artist();
1504         auto secondTrackAlbumArtist = secondTrack.albumArtist();
1505         auto secondTrackAlbum = secondTrack.album();
1506         auto seconfTrackImage = secondTrack.albumCover();
1507         auto secondTrackDuration = secondTrack.duration();
1508         auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
1509         auto secondTrackTrackNumber = secondTrack.trackNumber();
1510         auto secondTrackDiscNumber = secondTrack.discNumber();
1511         const auto &secondTrackResource = secondTrack.resourceURI();
1512         auto secondTrackRating = secondTrack.rating();
1513         auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
1514 
1515         QCOMPARE(secondTrack.isValid(), true);
1516         QCOMPARE(secondTrackTitle, QStringLiteral("track2"));
1517         QCOMPARE(secondTrackArtist, QStringLiteral("artist2"));
1518         QCOMPARE(secondTrackAlbumArtist, QStringLiteral("Various Artists"));
1519         QCOMPARE(secondTrackAlbum, QStringLiteral("album1"));
1520         QCOMPARE(seconfTrackImage.isValid(), true);
1521         QCOMPARE(seconfTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1522         QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(2));
1523         QCOMPARE(secondTrackMilliSecondsDuration, 2);
1524         QCOMPARE(secondTrackTrackNumber, 2);
1525         QCOMPARE(secondTrackDiscNumber, 2);
1526         QCOMPARE(secondTrackResource.isValid(), true);
1527         QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$2")));
1528         QCOMPARE(secondTrackRating, 2);
1529         QCOMPARE(secondIsSingleDiscAlbum, false);
1530 
1531         auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"),
1532                                                                          QStringLiteral("album1"), 3, 3);
1533         auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId);
1534 
1535         auto thirdTrackTitle = thirdTrack.title();
1536         auto thirdTrackArtist = thirdTrack.artist();
1537         auto thirdTrackAlbumArtist = thirdTrack.albumArtist();
1538         auto thirdTrackAlbum = thirdTrack.album();
1539         auto thirdTrackImage = thirdTrack.albumCover();
1540         auto thirdTrackDuration = thirdTrack.duration();
1541         auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay();
1542         auto thirdTrackTrackNumber = thirdTrack.trackNumber();
1543         auto thirdTrackDiscNumber = thirdTrack.discNumber();
1544         const auto &thirdTrackResource = thirdTrack.resourceURI();
1545         auto thirdTrackRating = thirdTrack.rating();
1546         auto thirdIsSingleDiscAlbum = thirdTrack.isSingleDiscAlbum();
1547 
1548         QCOMPARE(thirdTrack.isValid(), true);
1549         QCOMPARE(thirdTrackTitle, QStringLiteral("track3"));
1550         QCOMPARE(thirdTrackArtist, QStringLiteral("artist3"));
1551         QCOMPARE(thirdTrackAlbumArtist, QStringLiteral("Various Artists"));
1552         QCOMPARE(thirdTrackAlbum, QStringLiteral("album1"));
1553         QCOMPARE(thirdTrackImage.isValid(), true);
1554         QCOMPARE(thirdTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1555         QCOMPARE(thirdTrackDuration, QTime::fromMSecsSinceStartOfDay(3));
1556         QCOMPARE(thirdTrackMilliSecondsDuration, 3);
1557         QCOMPARE(thirdTrackTrackNumber, 3);
1558         QCOMPARE(thirdTrackDiscNumber, 3);
1559         QCOMPARE(thirdTrackResource.isValid(), true);
1560         QCOMPARE(thirdTrackResource, QUrl::fromLocalFile(QStringLiteral("/$3")));
1561         QCOMPARE(thirdTrackRating, 3);
1562         QCOMPARE(thirdIsSingleDiscAlbum, false);
1563 
1564         auto fourthTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"),
1565                                                                           QStringLiteral("album1"), 4, 4);
1566         auto fourthTrack = musicDb.trackDataFromDatabaseId(fourthTrackId);
1567 
1568         auto fourthTrackTitle = fourthTrack.title();
1569         auto fourthTrackArtist = fourthTrack.artist();
1570         auto fourthTrackAlbumArtist = fourthTrack.albumArtist();
1571         auto fourthTrackAlbum = fourthTrack.album();
1572         auto fourthTrackImage = fourthTrack.albumCover();
1573         auto fourthTrackDuration = fourthTrack.duration();
1574         auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay();
1575         auto fourthTrackTrackNumber = fourthTrack.trackNumber();
1576         auto fourthTrackDiscNumber = fourthTrack.discNumber();
1577         const auto &fourthTrackResource = fourthTrack.resourceURI();
1578         auto fourthTrackRating = thirdTrack.rating();
1579         auto fourthIsSingleDiscAlbum = fourthTrack.isSingleDiscAlbum();
1580 
1581         QCOMPARE(fourthTrack.isValid(), true);
1582         QCOMPARE(fourthTrackTitle, QStringLiteral("track4"));
1583         QCOMPARE(fourthTrackArtist, QStringLiteral("artist4"));
1584         QCOMPARE(fourthTrackAlbumArtist, QStringLiteral("Various Artists"));
1585         QCOMPARE(fourthTrackAlbum, QStringLiteral("album1"));
1586         QCOMPARE(fourthTrackImage.isValid(), true);
1587         QCOMPARE(fourthTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1588         QCOMPARE(fourthTrackDuration, QTime::fromMSecsSinceStartOfDay(4));
1589         QCOMPARE(fourthTrackMilliSecondsDuration, 4);
1590         QCOMPARE(fourthTrackTrackNumber, 4);
1591         QCOMPARE(fourthTrackDiscNumber, 4);
1592         QCOMPARE(fourthTrackResource.isValid(), true);
1593         QCOMPARE(fourthTrackResource, QUrl::fromLocalFile(QStringLiteral("/$4")));
1594         QCOMPARE(fourthTrackRating, 3);
1595         QCOMPARE(fourthIsSingleDiscAlbum, false);
1596 
1597         auto secondAlbumData = musicDb.albumData(allAlbums[1].databaseId());
1598         auto secondAlbumTitle = allAlbums[1].title();
1599         auto secondAlbumArtist = allAlbums[1].artist();
1600         auto secondAlbumImage = allAlbums[1].albumArtURI();
1601         auto secondAlbumTracksCount = secondAlbumData.count();
1602         auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum();
1603 
1604         QCOMPARE(secondAlbumTitle, QStringLiteral("album2"));
1605         QCOMPARE(secondAlbumArtist, QStringLiteral("artist1"));
1606         QCOMPARE(secondAlbumImage.isValid(), true);
1607         QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2")));
1608         QCOMPARE(secondAlbumTracksCount, 6);
1609         QCOMPARE(secondAlbumIsSingleDiscAlbum, true);
1610     }
1611 
1612     void simpleAccessorAndVariousArtistAlbumWithFile()
1613     {
1614         QTemporaryFile myDatabaseFile;
1615         myDatabaseFile.open();
1616 
1617         {
1618             DatabaseInterface musicDb;
1619 
1620             QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
1621             QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
1622             QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1623 
1624             QCOMPARE(musicDb.allAlbumsData().count(), 0);
1625             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1626             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1627             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1628 
1629             musicDb.init(QStringLiteral("testDbVariousArtistAlbum1"), myDatabaseFile.fileName());
1630 
1631             QCOMPARE(musicDb.allAlbumsData().count(), 0);
1632             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1633             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1634             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1635 
1636             musicDb.insertTracksList(mNewTracks, mNewCovers);
1637 
1638             musicDbTrackAddedSpy.wait(300);
1639 
1640             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1641             QCOMPARE(musicDb.allArtistsData().count(), 7);
1642             QCOMPARE(musicDb.allTracksData().count(), 22);
1643             QCOMPARE(musicDbArtistAddedSpy.count(), 1);
1644             QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
1645             QCOMPARE(musicDbTrackAddedSpy.count(), 1);
1646 
1647             auto allAlbums = musicDb.allAlbumsData();
1648 
1649             auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
1650             auto firstAlbumTitle = allAlbums[0].title();
1651             auto firstAlbumArtist = allAlbums[0].artist();
1652             auto firstAlbumImage = allAlbums[0].albumArtURI();
1653             auto firstAlbumTracksCount = firstAlbumData.count();
1654             auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
1655 
1656             QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
1657             QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
1658             QCOMPARE(firstAlbumImage.isValid(), true);
1659             QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1660             QCOMPARE(firstAlbumTracksCount, 4);
1661             QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
1662 
1663             auto invalidTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 1);
1664             QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0));
1665 
1666             auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
1667             auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
1668 
1669             auto firstTrackTitle = firstTrack.title();
1670             auto firstTrackArtist = firstTrack.artist();
1671             auto firstTrackAlbumArtist = firstTrack.albumArtist();
1672             auto firstTrackAlbum = firstTrack.album();
1673             auto firstTrackImage = firstTrack.albumCover();
1674             auto firstTrackDuration = firstTrack.duration();
1675             auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
1676             auto firstTrackTrackNumber = firstTrack.trackNumber();
1677             auto firstTrackDiscNumber = firstTrack.discNumber();
1678             const auto &firstTrackResource = firstTrack.resourceURI();
1679             auto firstTrackRating = firstTrack.rating();
1680             auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
1681 
1682             QCOMPARE(firstTrack.isValid(), true);
1683             QCOMPARE(firstTrackTitle, QStringLiteral("track1"));
1684             QCOMPARE(firstTrackArtist, QStringLiteral("artist1"));
1685             QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists"));
1686             QCOMPARE(firstTrackAlbum, QStringLiteral("album1"));
1687             QCOMPARE(firstTrackImage.isValid(), true);
1688             QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1689             QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1));
1690             QCOMPARE(firstTrackMilliSecondsDuration, 1);
1691             QCOMPARE(firstTrackTrackNumber, 1);
1692             QCOMPARE(firstTrackDiscNumber, 1);
1693             QCOMPARE(firstTrackResource.isValid(), true);
1694             QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1")));
1695             QCOMPARE(firstTrackRating, 1);
1696             QCOMPARE(firstIsSingleDiscAlbum, false);
1697 
1698             auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
1699                                                                               QStringLiteral("album1"), 2, 2);
1700             auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
1701 
1702             auto secondTrackTitle = secondTrack.title();
1703             auto secondTrackArtist = secondTrack.artist();
1704             auto secondTrackAlbumArtist = secondTrack.albumArtist();
1705             auto secondTrackAlbum = secondTrack.album();
1706             auto seconfTrackImage = secondTrack.albumCover();
1707             auto secondTrackDuration = secondTrack.duration();
1708             auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
1709             auto secondTrackTrackNumber = secondTrack.trackNumber();
1710             auto secondTrackDiscNumber = secondTrack.discNumber();
1711             const auto &secondTrackResource = secondTrack.resourceURI();
1712             auto secondTrackRating = secondTrack.rating();
1713             auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
1714 
1715             QCOMPARE(secondTrack.isValid(), true);
1716             QCOMPARE(secondTrackTitle, QStringLiteral("track2"));
1717             QCOMPARE(secondTrackArtist, QStringLiteral("artist2"));
1718             QCOMPARE(secondTrackAlbumArtist, QStringLiteral("Various Artists"));
1719             QCOMPARE(secondTrackAlbum, QStringLiteral("album1"));
1720             QCOMPARE(seconfTrackImage.isValid(), true);
1721             QCOMPARE(seconfTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1722             QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(2));
1723             QCOMPARE(secondTrackMilliSecondsDuration, 2);
1724             QCOMPARE(secondTrackTrackNumber, 2);
1725             QCOMPARE(secondTrackDiscNumber, 2);
1726             QCOMPARE(secondTrackResource.isValid(), true);
1727             QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$2")));
1728             QCOMPARE(secondTrackRating, 2);
1729             QCOMPARE(secondIsSingleDiscAlbum, false);
1730 
1731             auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"),
1732                                                                              QStringLiteral("album1"), 3, 3);
1733             auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId);
1734 
1735             auto thirdTrackTitle = thirdTrack.title();
1736             auto thirdTrackArtist = thirdTrack.artist();
1737             auto thirdTrackAlbumArtist = thirdTrack.albumArtist();
1738             auto thirdTrackAlbum = thirdTrack.album();
1739             auto thirdTrackImage = thirdTrack.albumCover();
1740             auto thirdTrackDuration = thirdTrack.duration();
1741             auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay();
1742             auto thirdTrackTrackNumber = thirdTrack.trackNumber();
1743             auto thirdTrackDiscNumber = thirdTrack.discNumber();
1744             const auto &thirdTrackResource = thirdTrack.resourceURI();
1745             auto thirdTrackRating = thirdTrack.rating();
1746             auto thirdIsSingleDiscAlbum = thirdTrack.isSingleDiscAlbum();
1747 
1748             QCOMPARE(thirdTrack.isValid(), true);
1749             QCOMPARE(thirdTrackTitle, QStringLiteral("track3"));
1750             QCOMPARE(thirdTrackArtist, QStringLiteral("artist3"));
1751             QCOMPARE(thirdTrackAlbumArtist, QStringLiteral("Various Artists"));
1752             QCOMPARE(thirdTrackAlbum, QStringLiteral("album1"));
1753             QCOMPARE(thirdTrackImage.isValid(), true);
1754             QCOMPARE(thirdTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1755             QCOMPARE(thirdTrackDuration, QTime::fromMSecsSinceStartOfDay(3));
1756             QCOMPARE(thirdTrackMilliSecondsDuration, 3);
1757             QCOMPARE(thirdTrackTrackNumber, 3);
1758             QCOMPARE(thirdTrackDiscNumber, 3);
1759             QCOMPARE(thirdTrackResource.isValid(), true);
1760             QCOMPARE(thirdTrackResource, QUrl::fromLocalFile(QStringLiteral("/$3")));
1761             QCOMPARE(thirdTrackRating, 3);
1762             QCOMPARE(thirdIsSingleDiscAlbum, false);
1763 
1764             auto fourthTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"),
1765                                                                               QStringLiteral("album1"), 4, 4);
1766             auto fourthTrack = musicDb.trackDataFromDatabaseId(fourthTrackId);
1767 
1768             auto fourthTrackTitle = fourthTrack.title();
1769             auto fourthTrackArtist = fourthTrack.artist();
1770             auto fourthTrackAlbumArtist = fourthTrack.albumArtist();
1771             auto fourthTrackAlbum = fourthTrack.album();
1772             auto fourthTrackImage = fourthTrack.albumCover();
1773             auto fourthTrackDuration = fourthTrack.duration();
1774             auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay();
1775             auto fourthTrackTrackNumber = fourthTrack.trackNumber();
1776             auto fourthTrackDiscNumber = fourthTrack.discNumber();
1777             const auto &fourthTrackResource = fourthTrack.resourceURI();
1778             auto fourthTrackRating = thirdTrack.rating();
1779             auto fourthIsSingleDiscAlbum = fourthTrack.isSingleDiscAlbum();
1780 
1781             QCOMPARE(fourthTrack.isValid(), true);
1782             QCOMPARE(fourthTrackTitle, QStringLiteral("track4"));
1783             QCOMPARE(fourthTrackArtist, QStringLiteral("artist4"));
1784             QCOMPARE(fourthTrackAlbumArtist, QStringLiteral("Various Artists"));
1785             QCOMPARE(fourthTrackAlbum, QStringLiteral("album1"));
1786             QCOMPARE(fourthTrackImage.isValid(), true);
1787             QCOMPARE(fourthTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1788             QCOMPARE(fourthTrackDuration, QTime::fromMSecsSinceStartOfDay(4));
1789             QCOMPARE(fourthTrackMilliSecondsDuration, 4);
1790             QCOMPARE(fourthTrackTrackNumber, 4);
1791             QCOMPARE(fourthTrackDiscNumber, 4);
1792             QCOMPARE(fourthTrackResource.isValid(), true);
1793             QCOMPARE(fourthTrackResource, QUrl::fromLocalFile(QStringLiteral("/$4")));
1794             QCOMPARE(fourthTrackRating, 3);
1795             QCOMPARE(fourthIsSingleDiscAlbum, false);
1796 
1797             auto secondAlbumData = musicDb.albumData(allAlbums[1].databaseId());
1798             auto secondAlbumTitle = allAlbums[1].title();
1799             auto secondAlbumArtist = allAlbums[1].artist();
1800             auto secondAlbumImage = allAlbums[1].albumArtURI();
1801             auto secondAlbumTracksCount = secondAlbumData.count();
1802             auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum();
1803 
1804             QCOMPARE(secondAlbumTitle, QStringLiteral("album2"));
1805             QCOMPARE(secondAlbumArtist, QStringLiteral("artist1"));
1806             QCOMPARE(secondAlbumImage.isValid(), true);
1807             QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2")));
1808             QCOMPARE(secondAlbumTracksCount, 6);
1809             QCOMPARE(secondAlbumIsSingleDiscAlbum, true);
1810         }
1811 
1812         {
1813             DatabaseInterface musicDb;
1814 
1815             QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
1816             QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
1817             QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
1818 
1819             QCOMPARE(musicDb.allAlbumsData().count(), 0);
1820             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1821             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1822             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1823 
1824             musicDb.init(QStringLiteral("testDbVariousArtistAlbum2"), myDatabaseFile.fileName());
1825 
1826             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1827             QCOMPARE(musicDb.allArtistsData().count(), 7);
1828             QCOMPARE(musicDb.allTracksData().count(), 22);
1829             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1830             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1831             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1832 
1833             musicDb.insertTracksList(mNewTracks, mNewCovers);
1834 
1835             musicDbTrackAddedSpy.wait(300);
1836 
1837             QCOMPARE(musicDb.allAlbumsData().count(), 5);
1838             QCOMPARE(musicDb.allArtistsData().count(), 7);
1839             QCOMPARE(musicDb.allTracksData().count(), 22);
1840             QCOMPARE(musicDbArtistAddedSpy.count(), 0);
1841             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
1842             QCOMPARE(musicDbTrackAddedSpy.count(), 0);
1843 
1844             auto allAlbums = musicDb.allAlbumsData();
1845 
1846             auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
1847             auto firstAlbumTitle = allAlbums[0].title();
1848             auto firstAlbumArtist = allAlbums[0].artist();
1849             auto firstAlbumImage = allAlbums[0].albumArtURI();
1850             auto firstAlbumTracksCount = firstAlbumData.count();
1851             auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
1852 
1853             QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
1854             QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
1855             QCOMPARE(firstAlbumImage.isValid(), true);
1856             QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1857             QCOMPARE(firstAlbumTracksCount, 4);
1858             QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
1859 
1860             auto invalidTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
1861                                                                                QStringLiteral("album1"), 2, 1);
1862             QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0));
1863 
1864             auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
1865                                                                              QStringLiteral("album1"), 1, 1);
1866             auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
1867 
1868             auto firstTrackTitle = firstTrack.title();
1869             auto firstTrackArtist = firstTrack.artist();
1870             auto firstTrackAlbumArtist = firstTrack.albumArtist();
1871             auto firstTrackAlbum = firstTrack.album();
1872             auto firstTrackImage = firstTrack.albumCover();
1873             auto firstTrackDuration = firstTrack.duration();
1874             auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
1875             auto firstTrackTrackNumber = firstTrack.trackNumber();
1876             auto firstTrackDiscNumber = firstTrack.discNumber();
1877             const auto &firstTrackResource = firstTrack.resourceURI();
1878             auto firstTrackRating = firstTrack.rating();
1879             auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
1880 
1881             QCOMPARE(firstTrack.isValid(), true);
1882             QCOMPARE(firstTrackTitle, QStringLiteral("track1"));
1883             QCOMPARE(firstTrackArtist, QStringLiteral("artist1"));
1884             QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists"));
1885             QCOMPARE(firstTrackAlbum, QStringLiteral("album1"));
1886             QCOMPARE(firstTrackImage.isValid(), true);
1887             QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1888             QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1));
1889             QCOMPARE(firstTrackMilliSecondsDuration, 1);
1890             QCOMPARE(firstTrackTrackNumber, 1);
1891             QCOMPARE(firstTrackDiscNumber, 1);
1892             QCOMPARE(firstTrackResource.isValid(), true);
1893             QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1")));
1894             QCOMPARE(firstTrackRating, 1);
1895             QCOMPARE(firstIsSingleDiscAlbum, false);
1896 
1897             auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
1898                                                                               QStringLiteral("album1"), 2, 2);
1899             auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
1900 
1901             auto secondTrackTitle = secondTrack.title();
1902             auto secondTrackArtist = secondTrack.artist();
1903             auto secondTrackAlbumArtist = secondTrack.albumArtist();
1904             auto secondTrackAlbum = secondTrack.album();
1905             auto seconfTrackImage = secondTrack.albumCover();
1906             auto secondTrackDuration = secondTrack.duration();
1907             auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
1908             auto secondTrackTrackNumber = secondTrack.trackNumber();
1909             auto secondTrackDiscNumber = secondTrack.discNumber();
1910             const auto &secondTrackResource = secondTrack.resourceURI();
1911             auto secondTrackRating = secondTrack.rating();
1912             auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
1913 
1914             QCOMPARE(secondTrack.isValid(), true);
1915             QCOMPARE(secondTrackTitle, QStringLiteral("track2"));
1916             QCOMPARE(secondTrackArtist, QStringLiteral("artist2"));
1917             QCOMPARE(secondTrackAlbumArtist, QStringLiteral("Various Artists"));
1918             QCOMPARE(secondTrackAlbum, QStringLiteral("album1"));
1919             QCOMPARE(seconfTrackImage.isValid(), true);
1920             QCOMPARE(seconfTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1921             QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(2));
1922             QCOMPARE(secondTrackMilliSecondsDuration, 2);
1923             QCOMPARE(secondTrackTrackNumber, 2);
1924             QCOMPARE(secondTrackDiscNumber, 2);
1925             QCOMPARE(secondTrackResource.isValid(), true);
1926             QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$2")));
1927             QCOMPARE(secondTrackRating, 2);
1928             QCOMPARE(secondIsSingleDiscAlbum, false);
1929 
1930             auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"),
1931                                                                              QStringLiteral("album1"), 3, 3);
1932             auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId);
1933 
1934             auto thirdTrackTitle = thirdTrack.title();
1935             auto thirdTrackArtist = thirdTrack.artist();
1936             auto thirdTrackAlbumArtist = thirdTrack.albumArtist();
1937             auto thirdTrackAlbum = thirdTrack.album();
1938             auto thirdTrackImage = thirdTrack.albumCover();
1939             auto thirdTrackDuration = thirdTrack.duration();
1940             auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay();
1941             auto thirdTrackTrackNumber = thirdTrack.trackNumber();
1942             auto thirdTrackDiscNumber = thirdTrack.discNumber();
1943             const auto &thirdTrackResource = thirdTrack.resourceURI();
1944             auto thirdTrackRating = thirdTrack.rating();
1945             auto thirdIsSingleDiscAlbum = thirdTrack.isSingleDiscAlbum();
1946 
1947             QCOMPARE(thirdTrack.isValid(), true);
1948             QCOMPARE(thirdTrackTitle, QStringLiteral("track3"));
1949             QCOMPARE(thirdTrackArtist, QStringLiteral("artist3"));
1950             QCOMPARE(thirdTrackAlbumArtist, QStringLiteral("Various Artists"));
1951             QCOMPARE(thirdTrackAlbum, QStringLiteral("album1"));
1952             QCOMPARE(thirdTrackImage.isValid(), true);
1953             QCOMPARE(thirdTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1954             QCOMPARE(thirdTrackDuration, QTime::fromMSecsSinceStartOfDay(3));
1955             QCOMPARE(thirdTrackMilliSecondsDuration, 3);
1956             QCOMPARE(thirdTrackTrackNumber, 3);
1957             QCOMPARE(thirdTrackDiscNumber, 3);
1958             QCOMPARE(thirdTrackResource.isValid(), true);
1959             QCOMPARE(thirdTrackResource, QUrl::fromLocalFile(QStringLiteral("/$3")));
1960             QCOMPARE(thirdTrackRating, 3);
1961             QCOMPARE(thirdIsSingleDiscAlbum, false);
1962 
1963             auto fourthTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"),
1964                                                                               QStringLiteral("album1"), 4, 4);
1965             auto fourthTrack = musicDb.trackDataFromDatabaseId(fourthTrackId);
1966 
1967             auto fourthTrackTitle = fourthTrack.title();
1968             auto fourthTrackArtist = fourthTrack.artist();
1969             auto fourthTrackAlbumArtist = fourthTrack.albumArtist();
1970             auto fourthTrackAlbum = fourthTrack.album();
1971             auto fourthTrackImage = fourthTrack.albumCover();
1972             auto fourthTrackDuration = fourthTrack.duration();
1973             auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay();
1974             auto fourthTrackTrackNumber = fourthTrack.trackNumber();
1975             auto fourthTrackDiscNumber = fourthTrack.discNumber();
1976             const auto &fourthTrackResource = fourthTrack.resourceURI();
1977             auto fourthTrackRating = thirdTrack.rating();
1978             auto fourthIsSingleDiscAlbum = fourthTrack.isSingleDiscAlbum();
1979 
1980             QCOMPARE(fourthTrack.isValid(), true);
1981             QCOMPARE(fourthTrackTitle, QStringLiteral("track4"));
1982             QCOMPARE(fourthTrackArtist, QStringLiteral("artist4"));
1983             QCOMPARE(fourthTrackAlbumArtist, QStringLiteral("Various Artists"));
1984             QCOMPARE(fourthTrackAlbum, QStringLiteral("album1"));
1985             QCOMPARE(fourthTrackImage.isValid(), true);
1986             QCOMPARE(fourthTrackImage, QUrl::fromLocalFile(QStringLiteral("album1")));
1987             QCOMPARE(fourthTrackDuration, QTime::fromMSecsSinceStartOfDay(4));
1988             QCOMPARE(fourthTrackMilliSecondsDuration, 4);
1989             QCOMPARE(fourthTrackTrackNumber, 4);
1990             QCOMPARE(fourthTrackDiscNumber, 4);
1991             QCOMPARE(fourthTrackResource.isValid(), true);
1992             QCOMPARE(fourthTrackResource, QUrl::fromLocalFile(QStringLiteral("/$4")));
1993             QCOMPARE(fourthTrackRating, 3);
1994             QCOMPARE(fourthIsSingleDiscAlbum, false);
1995 
1996             auto secondAlbumData = musicDb.albumData(allAlbums[1].databaseId());
1997             auto secondAlbumTitle = allAlbums[1].title();
1998             auto secondAlbumArtist = allAlbums[1].artist();
1999             auto secondAlbumImage = allAlbums[1].albumArtURI();
2000             auto secondAlbumTracksCount = secondAlbumData.count();
2001             auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum();
2002 
2003             QCOMPARE(secondAlbumTitle, QStringLiteral("album2"));
2004             QCOMPARE(secondAlbumArtist, QStringLiteral("artist1"));
2005             QCOMPARE(secondAlbumImage.isValid(), true);
2006             QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2")));
2007             QCOMPARE(secondAlbumTracksCount, 6);
2008             QCOMPARE(secondAlbumIsSingleDiscAlbum, true);
2009 
2010             auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
2011                     QStringLiteral("artist8"), QStringLiteral("album3"), QStringLiteral("artist2"),
2012                     6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
2013                     QDateTime::fromMSecsSinceEpoch(23),
2014             {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
2015                     QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
2016             auto newTracks = DataTypes::ListTrackDataType();
2017             newTracks.push_back(newTrack);
2018 
2019             auto newFiles2 = QList<QUrl>();
2020             for (const auto &oneTrack : newTracks) {
2021                 newFiles2.push_back(oneTrack.resourceURI());
2022             }
2023 
2024             auto newCovers = mNewCovers;
2025             newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("image$19"));
2026 
2027             musicDb.insertTracksList(newTracks, newCovers);
2028 
2029             musicDbTrackAddedSpy.wait(300);
2030 
2031             QCOMPARE(musicDb.allAlbumsData().count(), 5);
2032             QCOMPARE(musicDb.allArtistsData().count(), 8);
2033             QCOMPARE(musicDb.allTracksData().count(), 23);
2034             QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2035             QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2036             QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2037         }
2038     }
2039 
2040     void testTracksFromAuthor() {
2041         DatabaseInterface musicDb;
2042 
2043         musicDb.init(QStringLiteral("testDbVariousArtistAlbum"));
2044 
2045         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2046         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2047         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2048 
2049         musicDb.insertTracksList(mNewTracks, mNewCovers);
2050 
2051         musicDbTrackAddedSpy.wait(300);
2052 
2053         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2054         QCOMPARE(musicDb.allArtistsData().count(), 7);
2055         QCOMPARE(musicDb.allTracksData().count(), 22);
2056         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2057         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2058         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2059 
2060         auto allTracks = musicDb.tracksDataFromAuthor(QStringLiteral("artist1"));
2061 
2062         QCOMPARE(allTracks.size(), 6);
2063         QCOMPARE(allTracks[0].albumArtist(), QStringLiteral("Various Artists"));
2064         QCOMPARE(allTracks[1].albumArtist(), QStringLiteral("artist1"));
2065         QCOMPARE(allTracks[2].albumArtist(), QStringLiteral("artist1"));
2066         QCOMPARE(allTracks[3].albumArtist(), QStringLiteral("artist1"));
2067         QCOMPARE(allTracks[4].albumArtist(), QStringLiteral("artist1"));
2068         QCOMPARE(allTracks[5].albumArtist(), QStringLiteral("artist1"));
2069     }
2070 
2071     void removeOneTrack()
2072     {
2073         QTemporaryFile databaseFile;
2074         databaseFile.open();
2075 
2076         qDebug() << "removeOneTrack" << databaseFile.fileName();
2077 
2078         DatabaseInterface musicDb;
2079 
2080         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
2081 
2082         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2083         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2084         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2085         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
2086         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
2087         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
2088         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
2089         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
2090         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
2091 
2092         QCOMPARE(musicDb.allAlbumsData().count(), 0);
2093         QCOMPARE(musicDb.allArtistsData().count(), 0);
2094         QCOMPARE(musicDb.allTracksData().count(), 0);
2095         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
2096         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2097         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
2098         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2099         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2100         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2101         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2102         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2103         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2104 
2105         musicDb.insertTracksList(mNewTracks, mNewCovers);
2106 
2107         musicDbTrackAddedSpy.wait(300);
2108 
2109         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2110         QCOMPARE(musicDb.allArtistsData().count(), 7);
2111         QCOMPARE(musicDb.allTracksData().count(), 22);
2112         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2113         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2114         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2115         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2116         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2117         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2118         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2119         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2120         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2121 
2122         auto allAlbums = musicDb.allAlbumsData();
2123 
2124         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
2125         auto firstAlbumTitle = allAlbums[0].title();
2126         auto firstAlbumArtist = allAlbums[0].artist();
2127         auto firstAlbumImage = allAlbums[0].albumArtURI();
2128         auto firstAlbumTracksCount = firstAlbumData.count();
2129         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
2130 
2131         QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
2132         QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
2133         QCOMPARE(firstAlbumImage.isValid(), true);
2134         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
2135         QCOMPARE(firstAlbumTracksCount, 4);
2136         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
2137 
2138         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2139                                                                     QStringLiteral("album1"), 1, 1);
2140 
2141         QVERIFY2(trackId != 0, "trackId should be different from 0");
2142 
2143         auto firstTrack = musicDb.trackDataFromDatabaseId(trackId);
2144 
2145         QCOMPARE(firstTrack.isValid(), true);
2146 
2147         musicDb.removeTracksList({firstTrack.resourceURI()});
2148 
2149         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2150         QCOMPARE(musicDb.allArtistsData().count(), 7);
2151         QCOMPARE(musicDb.allTracksData().count(), 21);
2152         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2153         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2154         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2155         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2156         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2157         QCOMPARE(musicDbTrackRemovedSpy.count(), 1);
2158         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
2159         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2160         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2161 
2162         auto allAlbumsV2 = musicDb.allAlbumsData();
2163         const auto &firstAlbum = allAlbumsV2[0];
2164 
2165         QCOMPARE(musicDb.allAlbumsData().isEmpty(), false);
2166         QCOMPARE(firstAlbum.isValid(), true);
2167 
2168         auto firstAlbumDataV2 = musicDb.albumData(firstAlbum.databaseId());
2169         auto firstAlbumTitleV2 = firstAlbum.title();
2170         auto firstAlbumArtistV2 = firstAlbum.artist();
2171         auto firstAlbumImageV2 = firstAlbum.albumArtURI();
2172         auto firstAlbumTracksCountV2 = firstAlbumDataV2.count();
2173         auto firstAlbumIsSingleDiscAlbumV2 = firstAlbum.isSingleDiscAlbum();
2174 
2175         QCOMPARE(firstAlbumTitleV2, QStringLiteral("album1"));
2176         QCOMPARE(firstAlbumArtistV2, QStringLiteral("Various Artists"));
2177         QCOMPARE(firstAlbumImageV2.isValid(), true);
2178         QCOMPARE(firstAlbumImageV2, QUrl::fromLocalFile(QStringLiteral("album1")));
2179         QCOMPARE(firstAlbumTracksCountV2, 3);
2180         QCOMPARE(firstAlbumIsSingleDiscAlbumV2, false);
2181 
2182         auto removedTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2183                                                                            QStringLiteral("album1"), 1, 1);
2184         QCOMPARE(removedTrackId, qulonglong(0));
2185     }
2186 
2187     void removeOneTrackAndModifyIt()
2188     {
2189         QTemporaryFile databaseFile;
2190         databaseFile.open();
2191 
2192         qDebug() << "removeOneTrackAndModifyIt" << databaseFile.fileName();
2193 
2194         DatabaseInterface musicDb;
2195 
2196         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
2197 
2198         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2199         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2200         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2201         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
2202         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
2203         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
2204         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
2205         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
2206         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
2207 
2208         QCOMPARE(musicDb.allAlbumsData().count(), 0);
2209         QCOMPARE(musicDb.allArtistsData().count(), 0);
2210         QCOMPARE(musicDb.allTracksData().count(), 0);
2211         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
2212         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2213         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
2214         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2215         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2216         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2217         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2218         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2219         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2220 
2221         musicDb.insertTracksList(mNewTracks, mNewCovers);
2222 
2223         musicDbTrackAddedSpy.wait(300);
2224 
2225         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2226         QCOMPARE(musicDb.allArtistsData().count(), 7);
2227         QCOMPARE(musicDb.allTracksData().count(), 22);
2228         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2229         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2230         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2231         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2232         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2233         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2234         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2235         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2236         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2237 
2238         auto allAlbums = musicDb.allAlbumsData();
2239 
2240         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
2241         auto firstAlbumTitle = allAlbums[0].title();
2242         auto firstAlbumArtist = allAlbums[0].artist();
2243         auto firstAlbumImage = allAlbums[0].albumArtURI();
2244         auto firstAlbumTracksCount = firstAlbumData.count();
2245         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
2246 
2247         QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
2248         QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
2249         QCOMPARE(firstAlbumImage.isValid(), true);
2250         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
2251         QCOMPARE(firstAlbumTracksCount, 4);
2252         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
2253 
2254         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2255                                                                     QStringLiteral("album1"), 1, 1);
2256 
2257         QCOMPARE(trackId != 0, true);
2258 
2259         auto firstTrack = musicDb.trackDataFromDatabaseId(trackId);
2260 
2261         QCOMPARE(firstTrack.isValid(), true);
2262 
2263         musicDb.removeTracksList({firstTrack.resourceURI()});
2264 
2265         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2266         QCOMPARE(musicDb.allArtistsData().count(), 7);
2267         QCOMPARE(musicDb.allTracksData().count(), 21);
2268         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2269         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2270         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2271         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2272         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2273         QCOMPARE(musicDbTrackRemovedSpy.count(), 1);
2274         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
2275         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2276         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2277 
2278         auto allAlbumsV2 = musicDb.allAlbumsData();
2279         const auto &firstAlbum = allAlbumsV2[0];
2280 
2281         QCOMPARE(musicDb.allAlbumsData().isEmpty(), false);
2282         QCOMPARE(firstAlbum.isValid(), true);
2283 
2284         auto firstAlbumDataV2 = musicDb.albumData(firstAlbum.databaseId());
2285         auto firstAlbumTitleV2 = firstAlbum.title();
2286         auto firstAlbumArtistV2 = firstAlbum.artist();
2287         auto firstAlbumImageV2 = firstAlbum.albumArtURI();
2288         auto firstAlbumTracksCountV2 = firstAlbumDataV2.count();
2289         auto firstAlbumIsSingleDiscAlbumV2 = firstAlbum.isSingleDiscAlbum();
2290 
2291         QCOMPARE(firstAlbumTitleV2, QStringLiteral("album1"));
2292         QCOMPARE(firstAlbumArtistV2, QStringLiteral("Various Artists"));
2293         QCOMPARE(firstAlbumImageV2.isValid(), true);
2294         QCOMPARE(firstAlbumImageV2, QUrl::fromLocalFile(QStringLiteral("album1")));
2295         QCOMPARE(firstAlbumTracksCountV2, 3);
2296         QCOMPARE(firstAlbumIsSingleDiscAlbumV2, false);
2297 
2298         auto removedTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2299                                                                            QStringLiteral("album1"), 1, 1);
2300         QCOMPARE(removedTrackId, qulonglong(0));
2301 
2302         firstTrack[DataTypes::DatabaseIdRole] = 0;
2303 
2304         musicDb.insertTracksList({firstTrack}, mNewCovers);
2305 
2306         musicDbTrackAddedSpy.wait(300);
2307 
2308         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2309         QCOMPARE(musicDb.allArtistsData().count(), 7);
2310         QCOMPARE(musicDb.allTracksData().count(), 22);
2311         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2312         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2313         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
2314         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2315         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2316         QCOMPARE(musicDbTrackRemovedSpy.count(), 1);
2317         QCOMPARE(musicDbAlbumModifiedSpy.count(), 2);
2318         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2319         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2320 
2321         auto allAlbums3 = musicDb.allAlbumsData();
2322 
2323         auto firstAlbumData3 = musicDb.albumData(allAlbums3[0].databaseId());
2324         auto firstAlbumTitle3 = allAlbums3[0].title();
2325         auto firstAlbumArtist3 = allAlbums3[0].artist();
2326         auto firstAlbumImage3 = allAlbums3[0].albumArtURI();
2327         auto firstAlbumTracksCount3 = firstAlbumData3.count();
2328         auto firstAlbumIsSingleDiscAlbum3 = allAlbums3[0].isSingleDiscAlbum();
2329 
2330         QCOMPARE(firstAlbumTitle3, QStringLiteral("album1"));
2331         QCOMPARE(firstAlbumArtist3, QStringLiteral("Various Artists"));
2332         QCOMPARE(firstAlbumImage3.isValid(), true);
2333         QCOMPARE(firstAlbumImage3, QUrl::fromLocalFile(QStringLiteral("album1")));
2334         QCOMPARE(firstAlbumTracksCount3, 4);
2335         QCOMPARE(firstAlbumIsSingleDiscAlbum3, false);
2336 
2337         auto trackId3 = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2338                                                                      QStringLiteral("album1"), 1, 1);
2339 
2340         QCOMPARE(trackId3 != 0, true);
2341     }
2342 
2343     void removeOneAlbum()
2344     {
2345         QTemporaryFile databaseFile;
2346         databaseFile.open();
2347 
2348         qDebug() << "removeOneAlbum" << databaseFile.fileName();
2349 
2350         DatabaseInterface musicDb;
2351 
2352         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
2353 
2354         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2355         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2356         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2357         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
2358         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
2359         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
2360         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
2361         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
2362         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
2363 
2364         QCOMPARE(musicDb.allAlbumsData().count(), 0);
2365         QCOMPARE(musicDb.allArtistsData().count(), 0);
2366         QCOMPARE(musicDb.allTracksData().count(), 0);
2367         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
2368         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2369         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
2370         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2371         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2372         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2373         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2374         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2375         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2376 
2377         musicDb.insertTracksList(mNewTracks, mNewCovers);
2378 
2379         musicDbTrackAddedSpy.wait(300);
2380 
2381         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2382         QCOMPARE(musicDb.allArtistsData().count(), 7);
2383         QCOMPARE(musicDb.allTracksData().count(), 22);
2384         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2385         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2386         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2387         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2388         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2389         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2390         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2391         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2392         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2393 
2394         auto allAlbums = musicDb.allAlbumsData();
2395 
2396         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
2397         auto firstAlbumTitle = allAlbums[0].title();
2398         auto firstAlbumArtist = allAlbums[0].artist();
2399         auto firstAlbumImage = allAlbums[0].albumArtURI();
2400         auto firstAlbumTracksCount = firstAlbumData.count();
2401         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
2402 
2403         QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
2404         QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
2405         QCOMPARE(firstAlbumImage.isValid(), true);
2406         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
2407         QCOMPARE(firstAlbumTracksCount, 4);
2408         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
2409 
2410         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2411                                                                          QStringLiteral("album2"), 1, 1);
2412         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
2413         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"),
2414                                                                           QStringLiteral("album2"), 2, 1);
2415         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
2416         auto thirdTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"),
2417                                                                          QStringLiteral("album2"), 3, 1);
2418         auto thirdTrack = musicDb.trackDataFromDatabaseId(thirdTrackId);
2419         auto fourthTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"),
2420                                                                           QStringLiteral("album2"), 4, 1);
2421         auto fourthTrack = musicDb.trackDataFromDatabaseId(fourthTrackId);
2422         auto fithTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"),
2423                                                                         QStringLiteral("album2"), 5, 1);
2424         auto fithTrack = musicDb.trackDataFromDatabaseId(fithTrackId);
2425         auto sixthTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"),
2426                                                                          QStringLiteral("album2"), 6, 1);
2427         auto sixthTrack = musicDb.trackDataFromDatabaseId(sixthTrackId);
2428 
2429         musicDb.removeTracksList({firstTrack.resourceURI(), secondTrack.resourceURI(), thirdTrack.resourceURI(),
2430                                   fourthTrack.resourceURI(), fithTrack.resourceURI(), sixthTrack.resourceURI()});
2431 
2432         QCOMPARE(musicDb.allAlbumsData().count(), 4);
2433         QCOMPARE(musicDb.allArtistsData().count(), 6);
2434         QCOMPARE(musicDb.allTracksData().count(), 16);
2435         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2436         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2437         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2438         QCOMPARE(musicDbArtistRemovedSpy.count(), 1);
2439         QCOMPARE(musicDbAlbumRemovedSpy.count(), 1);
2440         QCOMPARE(musicDbTrackRemovedSpy.count(), 6);
2441         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2442         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2443         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2444 
2445         auto removedAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/")));
2446 
2447         QCOMPARE(removedAlbum.isValid(), false);
2448     }
2449 
2450     void removeOneArtist()
2451     {
2452         DatabaseInterface musicDb;
2453 
2454         musicDb.init(QStringLiteral("testDb"));
2455 
2456         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2457         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2458         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2459         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
2460         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
2461         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
2462         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
2463         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
2464         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
2465 
2466         QCOMPARE(musicDb.allAlbumsData().count(), 0);
2467         QCOMPARE(musicDb.allArtistsData().count(), 0);
2468         QCOMPARE(musicDb.allTracksData().count(), 0);
2469         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
2470         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2471         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
2472         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2473         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2474         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2475         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2476         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2477         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2478 
2479         musicDb.insertTracksList(mNewTracks, mNewCovers);
2480 
2481         musicDbTrackAddedSpy.wait(300);
2482 
2483         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2484         QCOMPARE(musicDb.allArtistsData().count(), 7);
2485         QCOMPARE(musicDb.allTracksData().count(), 22);
2486         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2487         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2488         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2489         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2490         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2491         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2492         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2493         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2494         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2495 
2496         auto allAlbums = musicDb.allAlbumsData();
2497 
2498         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
2499         auto firstAlbumTitle = allAlbums[0].title();
2500         auto firstAlbumArtist = allAlbums[0].artist();
2501         auto firstAlbumImage = allAlbums[0].albumArtURI();
2502         auto firstAlbumTracksCount = firstAlbumData.count();
2503         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
2504 
2505         QCOMPARE(firstAlbumTitle, QStringLiteral("album1"));
2506         QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists"));
2507         QCOMPARE(firstAlbumImage.isValid(), true);
2508         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1")));
2509         QCOMPARE(firstAlbumTracksCount, 4);
2510         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
2511 
2512         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"),
2513                                                                     QStringLiteral("album1"), 3, 3);
2514         auto track = musicDb.trackDataFromDatabaseId(trackId);
2515 
2516         musicDb.removeTracksList({track.resourceURI()});
2517 
2518         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2519         QCOMPARE(musicDb.allArtistsData().count(), 6);
2520         QCOMPARE(musicDb.allTracksData().count(), 21);
2521         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2522         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2523         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2524         QCOMPARE(musicDbArtistRemovedSpy.count(), 1);
2525         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2526         QCOMPARE(musicDbTrackRemovedSpy.count(), 1);
2527         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
2528         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2529         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2530     }
2531 
2532     void addOneTrack()
2533     {
2534         DatabaseInterface musicDb;
2535 
2536         musicDb.init(QStringLiteral("testDb"));
2537 
2538         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2539         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2540         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2541         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
2542         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
2543         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
2544         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
2545         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
2546         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
2547 
2548         QCOMPARE(musicDb.allAlbumsData().count(), 0);
2549         QCOMPARE(musicDb.allArtistsData().count(), 0);
2550         QCOMPARE(musicDb.allTracksData().count(), 0);
2551         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
2552         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2553         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
2554         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2555         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2556         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2557         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2558         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2559         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2560 
2561         musicDb.insertTracksList(mNewTracks, mNewCovers);
2562 
2563         musicDbTrackAddedSpy.wait(300);
2564 
2565         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2566         QCOMPARE(musicDb.allArtistsData().count(), 7);
2567         QCOMPARE(musicDb.allTracksData().count(), 22);
2568         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2569         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2570         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2571         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2572         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2573         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2574         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2575         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2576         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2577 
2578         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
2579                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
2580                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
2581                 QDateTime::fromMSecsSinceEpoch(23),
2582                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
2583                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
2584         auto newTracks = DataTypes::ListTrackDataType();
2585         newTracks.push_back(newTrack);
2586 
2587         auto newCovers = mNewCovers;
2588         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
2589 
2590         musicDb.insertTracksList(newTracks, newCovers);
2591 
2592         musicDbTrackAddedSpy.wait(300);
2593 
2594         QCOMPARE(musicDb.allAlbumsData().count(), 5);
2595         QCOMPARE(musicDb.allArtistsData().count(), 7);
2596         QCOMPARE(musicDb.allTracksData().count(), 23);
2597         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2598         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2599         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
2600         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2601         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2602         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2603         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
2604         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2605         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2606     }
2607 
2608     void addTwoTracksSameAlbumSameTitle()
2609     {
2610         QTemporaryFile databaseFile;
2611         databaseFile.open();
2612 
2613         qDebug() << "addTwoTracksSameAlbumSameTitle" << databaseFile.fileName();
2614 
2615         DatabaseInterface musicDb;
2616 
2617         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
2618 
2619         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2620         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2621         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2622         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
2623         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
2624         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
2625         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
2626         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
2627         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
2628 
2629         QCOMPARE(musicDb.allAlbumsData().count(), 0);
2630         QCOMPARE(musicDb.allArtistsData().count(), 0);
2631         QCOMPARE(musicDb.allTracksData().count(), 0);
2632         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
2633         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2634         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
2635         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2636         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2637         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2638         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2639         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2640         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2641 
2642         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
2643                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
2644                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
2645                 QDateTime::fromMSecsSinceEpoch(23),
2646         {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
2647                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
2648         auto newTracks = DataTypes::ListTrackDataType();
2649         newTracks.push_back(newTrack);
2650 
2651         auto newCovers = mNewCovers;
2652         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
2653 
2654         musicDb.insertTracksList(newTracks, newCovers);
2655 
2656         musicDbTrackAddedSpy.wait(300);
2657 
2658         QCOMPARE(musicDb.allAlbumsData().count(), 1);
2659         QCOMPARE(musicDb.allArtistsData().count(), 1);
2660         QCOMPARE(musicDb.allTracksData().count(), 1);
2661         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2662         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2663         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2664         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2665         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2666         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2667         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2668         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2669         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2670 
2671         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
2672                                                                          QStringLiteral("album3"), 6, 1);
2673         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
2674 
2675         auto firstTrackTitle = firstTrack.title();
2676         auto firstTrackArtist = firstTrack.artist();
2677         auto firstTrackAlbumArtist = firstTrack.albumArtist();
2678         auto firstTrackAlbum = firstTrack.album();
2679         auto firstTrackImage = firstTrack.albumCover();
2680         auto firstTrackDuration = firstTrack.duration();
2681         auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
2682         auto firstTrackTrackNumber = firstTrack.trackNumber();
2683         auto firstTrackDiscNumber = firstTrack.discNumber();
2684         const auto &firstTrackResource = firstTrack.resourceURI();
2685         auto firstTrackRating = firstTrack.rating();
2686         auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
2687 
2688         QCOMPARE(firstTrack.isValid(), true);
2689         QCOMPARE(firstTrackTitle, QStringLiteral("track6"));
2690         QCOMPARE(firstTrackArtist, QStringLiteral("artist2"));
2691         QCOMPARE(firstTrackAlbumArtist, QStringLiteral("artist2"));
2692         QCOMPARE(firstTrackAlbum, QStringLiteral("album3"));
2693         QCOMPARE(firstTrackImage.isValid(), true);
2694         QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
2695         QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
2696         QCOMPARE(firstTrackMilliSecondsDuration, 23);
2697         QCOMPARE(firstTrackTrackNumber, 6);
2698         QCOMPARE(firstTrackDiscNumber, 1);
2699         QCOMPARE(firstTrackResource.isValid(), true);
2700         QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$23")));
2701         QCOMPARE(firstTrackRating, 5);
2702         QCOMPARE(firstIsSingleDiscAlbum, true);
2703 
2704         auto allAlbums = musicDb.allAlbumsData();
2705 
2706         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
2707         auto firstAlbumTitle = allAlbums[0].title();
2708         auto firstAlbumArtist = allAlbums[0].artist();
2709         auto firstAlbumImage = allAlbums[0].albumArtURI();
2710         auto firstAlbumTracksCount = firstAlbumData.count();
2711         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
2712 
2713         QCOMPARE(firstAlbumTitle, QStringLiteral("album3"));
2714         QCOMPARE(firstAlbumArtist, QStringLiteral("artist2"));
2715         QCOMPARE(firstAlbumImage.isValid(), true);
2716         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album3")));
2717         QCOMPARE(firstAlbumTracksCount, 1);
2718         QCOMPARE(firstAlbumIsSingleDiscAlbum, true);
2719 
2720         auto newTrack2 = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
2721                 QStringLiteral("artist9"), QStringLiteral("album3"), QStringLiteral("artist2"), 6, 1,
2722                 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
2723                 QDateTime::fromMSecsSinceEpoch(23),
2724                 QUrl::fromLocalFile(QStringLiteral("image$19")), 5, true,
2725                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
2726         auto newTracks2 = DataTypes::ListTrackDataType();
2727         newTracks2.push_back(newTrack2);
2728 
2729         auto newCovers2 = mNewCovers;
2730         newCovers2[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("image$19"));
2731 
2732         musicDb.insertTracksList(newTracks2, newCovers2);
2733 
2734         musicDbTrackAddedSpy.wait(50);
2735 
2736         QCOMPARE(musicDb.allAlbumsData().count(), 1);
2737         QCOMPARE(musicDb.allArtistsData().count(), 2);
2738         QCOMPARE(musicDb.allTracksData().count(), 1);
2739         QCOMPARE(musicDbArtistAddedSpy.count(), 2);
2740         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2741         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2742         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2743         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2744         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2745         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
2746         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
2747         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2748 
2749         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist9"),
2750                                                                           QStringLiteral("album3"), 6, 1);
2751         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
2752 
2753         auto secondTrackTitle = secondTrack.title();
2754         auto secondTrackArtist = secondTrack.artist();
2755         auto secondTrackAlbumArtist = secondTrack.albumArtist();
2756         auto secondTrackAlbum = secondTrack.album();
2757         auto secondTrackImage = secondTrack.albumCover();
2758         auto secondTrackDuration = secondTrack.duration();
2759         auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
2760         auto secondTrackTrackNumber = secondTrack.trackNumber();
2761         auto secondTrackDiscNumber = secondTrack.discNumber();
2762         const auto &secondTrackResource = secondTrack.resourceURI();
2763         auto secondTrackRating = secondTrack.rating();
2764         auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
2765 
2766         QCOMPARE(secondTrack.isValid(), true);
2767         QCOMPARE(secondTrackTitle, QStringLiteral("track6"));
2768         QCOMPARE(secondTrackArtist, QStringLiteral("artist9"));
2769         QCOMPARE(secondTrackAlbumArtist, QStringLiteral("artist2"));
2770         QCOMPARE(secondTrackAlbum, QStringLiteral("album3"));
2771         QCOMPARE(secondTrackImage.isValid(), true);
2772         QCOMPARE(secondTrackImage, QUrl::fromLocalFile(QStringLiteral("image$19")));
2773         QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
2774         QCOMPARE(secondTrackMilliSecondsDuration, 23);
2775         QCOMPARE(secondTrackTrackNumber, 6);
2776         QCOMPARE(secondTrackDiscNumber, 1);
2777         QCOMPARE(secondTrackResource.isValid(), true);
2778         QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$23")));
2779         QCOMPARE(secondTrackRating, 5);
2780         QCOMPARE(secondIsSingleDiscAlbum, true);
2781 
2782         auto allAlbums2 = musicDb.allAlbumsData();
2783 
2784         auto firstAlbumData2 = musicDb.albumData(allAlbums2[0].databaseId());
2785         auto firstAlbumTitle2 = allAlbums2[0].title();
2786         auto firstAlbumArtist2 = allAlbums2[0].artist();
2787         auto firstAlbumImage2 = allAlbums2[0].albumArtURI();
2788         auto firstAlbumTracksCount2 = firstAlbumData2.count();
2789         auto firstAlbumIsSingleDiscAlbum2 = allAlbums2[0].isSingleDiscAlbum();
2790 
2791         QCOMPARE(firstAlbumTitle2, QStringLiteral("album3"));
2792         QCOMPARE(firstAlbumArtist2, QStringLiteral("artist2"));
2793         QCOMPARE(firstAlbumImage2.isValid(), true);
2794         QCOMPARE(firstAlbumImage2, QUrl::fromLocalFile(QStringLiteral("image$19")));
2795         QCOMPARE(firstAlbumTracksCount2, 1);
2796         QCOMPARE(firstAlbumIsSingleDiscAlbum2, true);
2797     }
2798 
2799     void addTwoTracksSameFileWithAlbumSameName()
2800     {
2801         QTemporaryFile databaseFile;
2802         databaseFile.open();
2803 
2804         qDebug() << "addTwoTracksSameFileWithAlbumSameName" << databaseFile.fileName();
2805 
2806         DatabaseInterface musicDb;
2807 
2808         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
2809 
2810         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
2811         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
2812         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
2813         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
2814         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
2815         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
2816         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
2817         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
2818         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
2819 
2820         QCOMPARE(musicDb.allAlbumsData().count(), 0);
2821         QCOMPARE(musicDb.allArtistsData().count(), 0);
2822         QCOMPARE(musicDb.allTracksData().count(), 0);
2823         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
2824         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
2825         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
2826         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2827         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2828         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2829         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2830         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2831         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2832 
2833         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
2834                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
2835                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
2836                 QDateTime::fromMSecsSinceEpoch(23),
2837         {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
2838                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
2839         auto newTracks = DataTypes::ListTrackDataType();
2840         newTracks.push_back(newTrack);
2841 
2842         auto newCovers = mNewCovers;
2843         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
2844 
2845         musicDb.insertTracksList(newTracks, newCovers);
2846 
2847         musicDbTrackAddedSpy.wait(300);
2848 
2849         QCOMPARE(musicDb.allAlbumsData().count(), 1);
2850         QCOMPARE(musicDb.allArtistsData().count(), 1);
2851         QCOMPARE(musicDb.allTracksData().count(), 1);
2852         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
2853         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
2854         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2855         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2856         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
2857         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2858         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2859         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
2860         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2861 
2862         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
2863                                                                          QStringLiteral("album3"), 6, 1);
2864         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
2865 
2866         auto firstTrackTitle = firstTrack.title();
2867         auto firstTrackArtist = firstTrack.artist();
2868         auto firstTrackAlbumArtist = firstTrack.albumArtist();
2869         auto firstTrackAlbum = firstTrack.album();
2870         auto firstTrackImage = firstTrack.albumCover();
2871         auto firstTrackDuration = firstTrack.duration();
2872         auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
2873         auto firstTrackTrackNumber = firstTrack.trackNumber();
2874         auto firstTrackDiscNumber = firstTrack.discNumber();
2875         const auto &firstTrackResource = firstTrack.resourceURI();
2876         auto firstTrackRating = firstTrack.rating();
2877         auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
2878 
2879         QCOMPARE(firstTrack.isValid(), true);
2880         QCOMPARE(firstTrackTitle, QStringLiteral("track6"));
2881         QCOMPARE(firstTrackArtist, QStringLiteral("artist2"));
2882         QCOMPARE(firstTrackAlbumArtist, QStringLiteral("artist2"));
2883         QCOMPARE(firstTrackAlbum, QStringLiteral("album3"));
2884         QCOMPARE(firstTrackImage.isValid(), true);
2885         QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
2886         QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
2887         QCOMPARE(firstTrackMilliSecondsDuration, 23);
2888         QCOMPARE(firstTrackTrackNumber, 6);
2889         QCOMPARE(firstTrackDiscNumber, 1);
2890         QCOMPARE(firstTrackResource.isValid(), true);
2891         QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$23")));
2892         QCOMPARE(firstTrackRating, 5);
2893         QCOMPARE(firstIsSingleDiscAlbum, true);
2894 
2895         auto allAlbums = musicDb.allAlbumsData();
2896 
2897         QCOMPARE(allAlbums.size(), 1);
2898 
2899         auto firstAlbumTitle = allAlbums[0].title();
2900         auto firstAlbumArtist = allAlbums[0].artist();
2901         auto firstAlbumImage = allAlbums[0].albumArtURI();
2902         auto firstAlbumTracksCount = musicDb.albumData(allAlbums[0].databaseId()).count();
2903         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
2904 
2905         QCOMPARE(firstAlbumTitle, QStringLiteral("album3"));
2906         QCOMPARE(firstAlbumArtist, QStringLiteral("artist2"));
2907         QCOMPARE(firstAlbumImage.isValid(), true);
2908         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album3")));
2909         QCOMPARE(firstAlbumTracksCount, 1);
2910         QCOMPARE(firstAlbumIsSingleDiscAlbum, true);
2911 
2912         auto newTrack2 = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
2913                 QStringLiteral("artist9"), QStringLiteral("album3"), QStringLiteral("artist9"), 6, 1,
2914                 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
2915                 QDateTime::fromMSecsSinceEpoch(23),
2916                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
2917                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
2918         auto newTracks2 = DataTypes::ListTrackDataType();
2919         newTracks2.push_back(newTrack2);
2920 
2921         auto newCovers2 = mNewCovers;
2922         newCovers2[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
2923 
2924         musicDb.insertTracksList(newTracks2, newCovers2);
2925 
2926         musicDbTrackAddedSpy.wait(300);
2927 
2928         QCOMPARE(musicDb.allAlbumsData().count(), 1);
2929         QCOMPARE(musicDb.allArtistsData().count(), 2);
2930         QCOMPARE(musicDb.allTracksData().count(), 1);
2931         QCOMPARE(musicDbArtistAddedSpy.count(), 2);
2932         QCOMPARE(musicDbAlbumAddedSpy.count(), 2);
2933         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
2934         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
2935         QCOMPARE(musicDbAlbumRemovedSpy.count(), 1);
2936         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
2937         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
2938         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
2939         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
2940 
2941         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist9"),
2942                                                                           QStringLiteral("album3"), 6, 1);
2943         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
2944 
2945         auto secondTrackTitle = secondTrack.title();
2946         auto secondTrackArtist = secondTrack.artist();
2947         auto secondTrackAlbumArtist = secondTrack.albumArtist();
2948         auto secondTrackAlbum = secondTrack.album();
2949         auto secondTrackImage = secondTrack.albumCover();
2950         auto secondTrackDuration = secondTrack.duration();
2951         auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
2952         auto secondTrackTrackNumber = secondTrack.trackNumber();
2953         auto secondTrackDiscNumber = secondTrack.discNumber();
2954         const auto &secondTrackResource = secondTrack.resourceURI();
2955         auto secondTrackRating = secondTrack.rating();
2956         auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
2957 
2958         QCOMPARE(secondTrack.isValid(), true);
2959         QCOMPARE(secondTrackTitle, QStringLiteral("track6"));
2960         QCOMPARE(secondTrackArtist, QStringLiteral("artist9"));
2961         QCOMPARE(secondTrackAlbumArtist, QStringLiteral("artist9"));
2962         QCOMPARE(secondTrackAlbum, QStringLiteral("album3"));
2963         QCOMPARE(secondTrackImage.isValid(), true);
2964         QCOMPARE(secondTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
2965         QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
2966         QCOMPARE(secondTrackMilliSecondsDuration, 23);
2967         QCOMPARE(secondTrackTrackNumber, 6);
2968         QCOMPARE(secondTrackDiscNumber, 1);
2969         QCOMPARE(secondTrackResource.isValid(), true);
2970         QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$23")));
2971         QCOMPARE(secondTrackRating, 5);
2972         QCOMPARE(secondIsSingleDiscAlbum, true);
2973 
2974         auto allAlbums2 = musicDb.allAlbumsData();
2975 
2976         auto secondAlbumTitle = allAlbums2[0].title();
2977         auto secondAlbumArtist = allAlbums2[0].artist();
2978         auto secondAlbumImage = allAlbums2[0].albumArtURI();
2979         auto secondAlbumTracksCount = musicDb.albumData(allAlbums2[0].databaseId()).count();
2980         auto secondAlbumIsSingleDiscAlbum = allAlbums2[0].isSingleDiscAlbum();
2981 
2982         QCOMPARE(secondAlbumTitle, QStringLiteral("album3"));
2983         QCOMPARE(secondAlbumArtist, QStringLiteral("artist9"));
2984         QCOMPARE(secondAlbumImage.isValid(), true);
2985         QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album3")));
2986         QCOMPARE(secondAlbumTracksCount, 1);
2987         QCOMPARE(secondAlbumIsSingleDiscAlbum, true);
2988     }
2989 
2990     void addTwoTracksWithAlbumSameName()
2991     {
2992         QTemporaryFile databaseFile;
2993         databaseFile.open();
2994 
2995         qDebug() << "addTwoTracksWithAlbumSameName" << databaseFile.fileName();
2996 
2997         DatabaseInterface musicDb;
2998 
2999         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
3000 
3001         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3002         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3003         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3004         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3005         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3006         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3007         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3008         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3009         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3010 
3011         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3012         QCOMPARE(musicDb.allArtistsData().count(), 0);
3013         QCOMPARE(musicDb.allTracksData().count(), 0);
3014         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3015         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3016         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3017         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3018         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3019         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3020         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3021         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3022         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3023 
3024         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
3025                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
3026                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3027                 QDateTime::fromMSecsSinceEpoch(23),
3028         {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
3029                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
3030         auto newTracks = DataTypes::ListTrackDataType();
3031         newTracks.push_back(newTrack);
3032 
3033         auto newCovers = mNewCovers;
3034         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
3035 
3036         musicDb.insertTracksList(newTracks, newCovers);
3037 
3038         musicDbTrackAddedSpy.wait(300);
3039 
3040         QCOMPARE(musicDb.allAlbumsData().count(), 1);
3041         QCOMPARE(musicDb.allArtistsData().count(), 1);
3042         QCOMPARE(musicDb.allTracksData().count(), 1);
3043         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3044         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3045         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3046         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3047         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3048         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3049         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3050         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3051         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3052 
3053         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
3054                                                                          QStringLiteral("album3"), 6, 1);
3055         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
3056 
3057         auto firstTrackTitle = firstTrack.title();
3058         auto firstTrackArtist = firstTrack.artist();
3059         auto firstTrackAlbumArtist = firstTrack.albumArtist();
3060         auto firstTrackAlbum = firstTrack.album();
3061         auto firstTrackImage = firstTrack.albumCover();
3062         auto firstTrackDuration = firstTrack.duration();
3063         auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
3064         auto firstTrackTrackNumber = firstTrack.trackNumber();
3065         auto firstTrackDiscNumber = firstTrack.discNumber();
3066         const auto &firstTrackResource = firstTrack.resourceURI();
3067         auto firstTrackRating = firstTrack.rating();
3068         auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
3069 
3070         QCOMPARE(firstTrack.isValid(), true);
3071         QCOMPARE(firstTrackTitle, QStringLiteral("track6"));
3072         QCOMPARE(firstTrackArtist, QStringLiteral("artist2"));
3073         QCOMPARE(firstTrackAlbumArtist, QStringLiteral("artist2"));
3074         QCOMPARE(firstTrackAlbum, QStringLiteral("album3"));
3075         QCOMPARE(firstTrackImage.isValid(), true);
3076         QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
3077         QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
3078         QCOMPARE(firstTrackMilliSecondsDuration, 23);
3079         QCOMPARE(firstTrackTrackNumber, 6);
3080         QCOMPARE(firstTrackDiscNumber, 1);
3081         QCOMPARE(firstTrackResource.isValid(), true);
3082         QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$23")));
3083         QCOMPARE(firstTrackRating, 5);
3084         QCOMPARE(firstIsSingleDiscAlbum, true);
3085 
3086         auto allAlbums = musicDb.allAlbumsData();
3087 
3088         QCOMPARE(allAlbums.size(), 1);
3089 
3090         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
3091         auto firstAlbumTitle = allAlbums[0].title();
3092         auto firstAlbumArtist = allAlbums[0].artist();
3093         auto firstAlbumImage = allAlbums[0].albumArtURI();
3094         auto firstAlbumTracksCount = firstAlbumData.count();
3095         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
3096 
3097         QCOMPARE(firstAlbumTitle, QStringLiteral("album3"));
3098         QCOMPARE(firstAlbumArtist, QStringLiteral("artist2"));
3099         QCOMPARE(firstAlbumImage.isValid(), true);
3100         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album3")));
3101         QCOMPARE(firstAlbumTracksCount, 1);
3102         QCOMPARE(firstAlbumIsSingleDiscAlbum, true);
3103 
3104         auto newTrack2 = DataTypes::TrackDataType{true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track6"),
3105                 QStringLiteral("artist9"), QStringLiteral("album3"), QStringLiteral("artist9"), 6, 1, QTime::fromMSecsSinceStartOfDay(20),
3106         {QUrl::fromLocalFile(QStringLiteral("/$20"))},
3107                 QDateTime::fromMSecsSinceEpoch(20),
3108         {QUrl::fromLocalFile(QStringLiteral("file://image$20"))}, 5, true,
3109                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
3110         auto newTracks2 = DataTypes::ListTrackDataType();
3111         newTracks2.push_back(newTrack2);
3112 
3113         auto newCovers2 = mNewCovers;
3114         newCovers2[QStringLiteral("file:///$20")] = QUrl::fromLocalFile(QStringLiteral("album3"));
3115 
3116         musicDb.insertTracksList(newTracks2, newCovers2);
3117 
3118         musicDbTrackAddedSpy.wait(50);
3119 
3120         QCOMPARE(musicDb.allAlbumsData().count(), 2);
3121         QCOMPARE(musicDb.allArtistsData().count(), 2);
3122         QCOMPARE(musicDb.allTracksData().count(), 2);
3123         QCOMPARE(musicDbArtistAddedSpy.count(), 2);
3124         QCOMPARE(musicDbAlbumAddedSpy.count(), 2);
3125         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
3126         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3127         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3128         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3129         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3130         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3131         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3132 
3133         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist9"),
3134                                                                           QStringLiteral("album3"), 6, 1);
3135         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
3136 
3137         auto secondTrackTitle = secondTrack.title();
3138         auto secondTrackArtist = secondTrack.artist();
3139         auto secondTrackAlbumArtist = secondTrack.albumArtist();
3140         auto secondTrackAlbum = secondTrack.album();
3141         auto secondTrackImage = secondTrack.albumCover();
3142         auto secondTrackDuration = secondTrack.duration();
3143         auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
3144         auto secondTrackTrackNumber = secondTrack.trackNumber();
3145         auto secondTrackDiscNumber = secondTrack.discNumber();
3146         const auto &secondTrackResource = secondTrack.resourceURI();
3147         auto secondTrackRating = secondTrack.rating();
3148         auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
3149 
3150         QCOMPARE(secondTrack.isValid(), true);
3151         QCOMPARE(secondTrackTitle, QStringLiteral("track6"));
3152         QCOMPARE(secondTrackArtist, QStringLiteral("artist9"));
3153         QCOMPARE(secondTrackAlbumArtist, QStringLiteral("artist9"));
3154         QCOMPARE(secondTrackAlbum, QStringLiteral("album3"));
3155         QCOMPARE(secondTrackImage.isValid(), true);
3156         QCOMPARE(secondTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
3157         QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(20));
3158         QCOMPARE(secondTrackMilliSecondsDuration, 20);
3159         QCOMPARE(secondTrackTrackNumber, 6);
3160         QCOMPARE(secondTrackDiscNumber, 1);
3161         QCOMPARE(secondTrackResource.isValid(), true);
3162         QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$20")));
3163         QCOMPARE(secondTrackRating, 5);
3164         QCOMPARE(secondIsSingleDiscAlbum, true);
3165 
3166         auto allAlbums2 = musicDb.allAlbumsData();
3167 
3168         auto firstAlbumData2 = musicDb.albumData(allAlbums2[0].databaseId());
3169         auto firstAlbumTitle2 = allAlbums2[0].title();
3170         auto firstAlbumArtist2 = allAlbums2[0].artist();
3171         auto firstAlbumImage2 = allAlbums2[0].albumArtURI();
3172         auto firstAlbumTracksCount2 = firstAlbumData2.count();
3173         auto firstAlbumIsSingleDiscAlbum2 = allAlbums2[0].isSingleDiscAlbum();
3174 
3175         QCOMPARE(firstAlbumTitle2, QStringLiteral("album3"));
3176         QCOMPARE(firstAlbumArtist2, QStringLiteral("artist2"));
3177         QCOMPARE(firstAlbumImage2.isValid(), true);
3178         QCOMPARE(firstAlbumImage2, QUrl::fromLocalFile(QStringLiteral("album3")));
3179         QCOMPARE(firstAlbumTracksCount2, 1);
3180         QCOMPARE(firstAlbumIsSingleDiscAlbum2, true);
3181 
3182         auto secondAlbumData = musicDb.albumData(allAlbums2[1].databaseId());
3183         auto secondAlbumTitle = allAlbums2[1].title();
3184         auto secondAlbumArtist = allAlbums2[1].artist();
3185         auto secondAlbumImage = allAlbums2[1].albumArtURI();
3186         auto secondAlbumTracksCount = secondAlbumData.count();
3187         auto secondAlbumIsSingleDiscAlbum = allAlbums2[1].isSingleDiscAlbum();
3188 
3189         QCOMPARE(secondAlbumTitle, QStringLiteral("album3"));
3190         QCOMPARE(secondAlbumArtist, QStringLiteral("artist9"));
3191         QCOMPARE(secondAlbumImage.isValid(), true);
3192         QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album3")));
3193         QCOMPARE(secondAlbumTracksCount, 1);
3194         QCOMPARE(secondAlbumIsSingleDiscAlbum, true);
3195     }
3196 
3197     void addTwoTracksInAlbumWithoutCover()
3198     {
3199         DatabaseInterface musicDb;
3200 
3201         musicDb.init(QStringLiteral("testDb"));
3202 
3203         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3204         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3205         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3206         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3207         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3208         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3209         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3210         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3211         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3212 
3213         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3214         QCOMPARE(musicDb.allArtistsData().count(), 0);
3215         QCOMPARE(musicDb.allTracksData().count(), 0);
3216         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3217         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3218         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3219         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3220         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3221         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3222         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3223         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3224         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3225 
3226         musicDb.insertTracksList(mNewTracks, mNewCovers);
3227 
3228         musicDbTrackAddedSpy.wait(300);
3229 
3230         QCOMPARE(musicDb.allAlbumsData().count(), 5);
3231         QCOMPARE(musicDb.allArtistsData().count(), 7);
3232         QCOMPARE(musicDb.allTracksData().count(), 22);
3233         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3234         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3235         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3236         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3237         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3238         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3239         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3240         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3241         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3242 
3243         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
3244                 QStringLiteral("artist2"), QStringLiteral("album7"), QStringLiteral("artist2"),
3245                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3246                 QDateTime::fromMSecsSinceEpoch(23),
3247                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
3248                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
3249         auto newTracks = DataTypes::ListTrackDataType();
3250         newTracks.push_back(newTrack);
3251 
3252         auto newCovers = mNewCovers;
3253         newCovers[QStringLiteral("file:///$23")] = QUrl();
3254 
3255         musicDb.insertTracksList(newTracks, newCovers);
3256 
3257         musicDbTrackAddedSpy.wait(300);
3258 
3259         QCOMPARE(musicDb.allAlbumsData().count(), 6);
3260         QCOMPARE(musicDb.allArtistsData().count(), 7);
3261         QCOMPARE(musicDb.allTracksData().count(), 23);
3262         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3263         QCOMPARE(musicDbAlbumAddedSpy.count(), 2);
3264         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
3265         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3266         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3267         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3268         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3269         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3270         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3271 
3272         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
3273                                                                     QStringLiteral("album7"), 6, 1);
3274         const auto &firstTrack = musicDb.trackDataFromDatabaseId(trackId);
3275 
3276         QCOMPARE(firstTrack.isValid(), true);
3277         QCOMPARE(firstTrack.albumCover(), QUrl());
3278 
3279         auto newTrack2 = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track7"),
3280                 QStringLiteral("artist2"), QStringLiteral("album7"), QStringLiteral("artist2"), 7, 1,
3281                 QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3282                 QDateTime::fromMSecsSinceEpoch(23),
3283         {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
3284                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
3285         auto newTracks2 = DataTypes::ListTrackDataType();
3286         newTracks2.push_back(newTrack2);
3287 
3288         auto newCovers2 = mNewCovers;
3289         newCovers2[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album7"));
3290 
3291         musicDb.insertTracksList(newTracks2, newCovers2);
3292 
3293         musicDbTrackAddedSpy.wait(300);
3294 
3295         QCOMPARE(musicDb.allAlbumsData().count(), 6);
3296         QCOMPARE(musicDb.allArtistsData().count(), 7);
3297         QCOMPARE(musicDb.allTracksData().count(), 23);
3298         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3299         QCOMPARE(musicDbAlbumAddedSpy.count(), 2);
3300         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
3301         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3302         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3303         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3304         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
3305         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
3306         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3307 
3308         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist2"),
3309                                                                           QStringLiteral("album7"), 7, 1);
3310         const auto &secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
3311 
3312         QCOMPARE(secondTrack.isValid(), true);
3313         QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album7")));
3314     }
3315 
3316     void modifyOneTrack()
3317     {
3318         QTemporaryFile databaseFile;
3319         databaseFile.open();
3320 
3321         qDebug() << "modifyOneTrack" << databaseFile.fileName();
3322 
3323         DatabaseInterface musicDb;
3324 
3325         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
3326 
3327         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3328         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3329         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3330         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3331         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3332         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3333         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3334         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3335         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3336 
3337         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3338         QCOMPARE(musicDb.allArtistsData().count(), 0);
3339         QCOMPARE(musicDb.allTracksData().count(), 0);
3340         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3341         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3342         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3343         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3344         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3345         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3346         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3347         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3348         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3349 
3350         musicDb.insertTracksList(mNewTracks, mNewCovers);
3351 
3352         musicDbTrackAddedSpy.wait(300);
3353 
3354         QCOMPARE(musicDb.allAlbumsData().count(), 5);
3355         QCOMPARE(musicDb.allArtistsData().count(), 7);
3356         QCOMPARE(musicDb.allTracksData().count(), 22);
3357         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3358         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3359         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3360         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3361         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3362         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3363         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3364         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3365         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3366 
3367         auto modifiedTrack = DataTypes::TrackDataType{true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"),
3368                 QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 5, 3,
3369                 QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$3"))},
3370                 QDateTime::fromMSecsSinceEpoch(23),
3371         {QUrl::fromLocalFile(QStringLiteral("file://image$3"))}, 5, true,
3372                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
3373 
3374         musicDb.insertTracksList({modifiedTrack}, mNewCovers);
3375 
3376         musicDbTrackAddedSpy.wait(300);
3377 
3378         QCOMPARE(musicDb.allAlbumsData().count(), 5);
3379         QCOMPARE(musicDb.allArtistsData().count(), 7);
3380         QCOMPARE(musicDb.allTracksData().count(), 22);
3381         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3382         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3383         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3384         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3385         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3386         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3387         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
3388         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
3389         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3390 
3391         auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"),
3392                                                                     QStringLiteral("album1"), 5, 3);
3393         QCOMPARE(trackId != 0, true);
3394         auto track = musicDb.trackDataFromDatabaseId(trackId);
3395 
3396         QCOMPARE(track.isValid(), true);
3397         QCOMPARE(track.trackNumber(), 5);
3398     }
3399 
3400     void addOneAlbum()
3401     {
3402         DatabaseInterface musicDb;
3403 
3404         musicDb.init(QStringLiteral("testDb"));
3405 
3406         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3407         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3408         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3409         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3410         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3411         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3412         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3413         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3414         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3415 
3416         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3417         QCOMPARE(musicDb.allArtistsData().count(), 0);
3418         QCOMPARE(musicDb.allTracksData().count(), 0);
3419         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3420         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3421         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3422         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3423         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3424         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3425         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3426         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3427         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3428 
3429         musicDb.insertTracksList(mNewTracks, mNewCovers);
3430 
3431         musicDbTrackAddedSpy.wait(300);
3432 
3433         QCOMPARE(musicDb.allAlbumsData().count(), 5);
3434         QCOMPARE(musicDb.allArtistsData().count(), 7);
3435         QCOMPARE(musicDb.allTracksData().count(), 22);
3436         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3437         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3438         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3439         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3440         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3441         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3442         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3443         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3444         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3445 
3446         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
3447                 QStringLiteral("artist2"), QStringLiteral("album7"), QStringLiteral("artist2"),
3448                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3449                 QDateTime::fromMSecsSinceEpoch(23),
3450         {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
3451                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
3452         auto newTracks = DataTypes::ListTrackDataType();
3453         newTracks.push_back(newTrack);
3454 
3455         auto newCover = QUrl::fromLocalFile(QStringLiteral("file://image$19"));
3456         auto newCovers = mNewCovers;
3457         newCovers[QStringLiteral("file:///$23")] = newCover;
3458 
3459         musicDb.insertTracksList(newTracks, newCovers);
3460 
3461         musicDbTrackAddedSpy.wait(300);
3462 
3463         QCOMPARE(musicDb.allAlbumsData().count(), 6);
3464         QCOMPARE(musicDb.allArtistsData().count(), 7);
3465         QCOMPARE(musicDb.allTracksData().count(), 23);
3466         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3467         QCOMPARE(musicDbAlbumAddedSpy.count(), 2);
3468         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
3469         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3470         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3471         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3472         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3473         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3474         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3475 
3476         const auto &newAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album7"), QStringLiteral("artist2"), QStringLiteral("/")));
3477         QCOMPARE(newAlbum.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("file://image$19")));
3478     }
3479 
3480     void addOneArtist()
3481     {
3482         DatabaseInterface musicDb;
3483 
3484         musicDb.init(QStringLiteral("testDb"));
3485 
3486         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3487         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3488         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3489         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3490         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3491         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3492         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3493         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3494         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3495 
3496         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3497         QCOMPARE(musicDb.allArtistsData().count(), 0);
3498         QCOMPARE(musicDb.allTracksData().count(), 0);
3499         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3500         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3501         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3502         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3503         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3504         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3505         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3506         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3507         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3508 
3509         musicDb.insertTracksList(mNewTracks, mNewCovers);
3510 
3511         musicDbTrackAddedSpy.wait(300);
3512 
3513         QCOMPARE(musicDb.allAlbumsData().count(), 5);
3514         QCOMPARE(musicDb.allArtistsData().count(), 7);
3515         QCOMPARE(musicDb.allTracksData().count(), 22);
3516         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3517         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3518         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3519         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3520         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3521         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3522         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3523         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3524         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3525 
3526         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
3527                 QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("Various Artists"),
3528                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3529                 QDateTime::fromMSecsSinceEpoch(23),
3530                 QUrl::fromLocalFile(QStringLiteral("album1")), 5, true,
3531                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
3532         auto newTracks = DataTypes::ListTrackDataType();
3533         newTracks.push_back(newTrack);
3534 
3535         auto newFiles2 = QList<QUrl>();
3536         for (const auto &oneTrack : newTracks) {
3537             newFiles2.push_back(oneTrack.resourceURI());
3538         }
3539 
3540         auto newCovers = mNewCovers;
3541         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album1"));
3542 
3543         musicDb.insertTracksList(newTracks, newCovers);
3544 
3545         musicDbTrackAddedSpy.wait(300);
3546 
3547         QCOMPARE(musicDb.allAlbumsData().count(), 5);
3548         QCOMPARE(musicDb.allArtistsData().count(), 8);
3549         QCOMPARE(musicDb.allTracksData().count(), 23);
3550         QCOMPARE(musicDbArtistAddedSpy.count(), 2);
3551         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3552         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
3553         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3554         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3555         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3556         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
3557         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3558         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3559     }
3560 
3561     void reloadDatabaseWithAllTracks()
3562     {
3563         QTemporaryFile databaseFile;
3564         databaseFile.open();
3565 
3566         qDebug() << "reloadDatabaseWithAllTracks" << databaseFile.fileName();
3567 
3568         {
3569             DatabaseInterface musicDb;
3570 
3571             QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3572             QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3573 
3574             musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
3575 
3576             musicDb.insertTracksList(mNewTracks, mNewCovers);
3577 
3578             musicDbTrackAddedSpy.wait(300);
3579 
3580             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3581         }
3582 
3583         DatabaseInterface musicDb2;
3584 
3585         QSignalSpy musicDbArtistAddedSpy2(&musicDb2, &DatabaseInterface::artistsAdded);
3586         QSignalSpy musicDbAlbumAddedSpy2(&musicDb2, &DatabaseInterface::albumsAdded);
3587         QSignalSpy musicDbTrackAddedSpy2(&musicDb2, &DatabaseInterface::tracksAdded);
3588         QSignalSpy musicDbArtistRemovedSpy2(&musicDb2, &DatabaseInterface::artistRemoved);
3589         QSignalSpy musicDbAlbumRemovedSpy2(&musicDb2, &DatabaseInterface::albumRemoved);
3590         QSignalSpy musicDbTrackRemovedSpy2(&musicDb2, &DatabaseInterface::trackRemoved);
3591         QSignalSpy musicDbAlbumModifiedSpy2(&musicDb2, &DatabaseInterface::albumModified);
3592         QSignalSpy musicDbTrackModifiedSpy2(&musicDb2, &DatabaseInterface::trackModified);
3593         QSignalSpy musicDbDatabaseErrorSpy2(&musicDb2, &DatabaseInterface::databaseError);
3594 
3595         QCOMPARE(musicDb2.allAlbumsData().count(), 0);
3596         QCOMPARE(musicDb2.allArtistsData().count(), 0);
3597         QCOMPARE(musicDb2.allTracksData().count(), 0);
3598         QCOMPARE(musicDbArtistAddedSpy2.count(), 0);
3599         QCOMPARE(musicDbAlbumAddedSpy2.count(), 0);
3600         QCOMPARE(musicDbTrackAddedSpy2.count(), 0);
3601         QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
3602         QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
3603         QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
3604         QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
3605         QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
3606         QCOMPARE(musicDbDatabaseErrorSpy2.count(), 0);
3607 
3608         musicDb2.init(QStringLiteral("testDb2"), databaseFile.fileName());
3609 
3610         musicDbTrackAddedSpy2.wait(300);
3611 
3612         QCOMPARE(musicDb2.allAlbumsData().count(), 5);
3613         QCOMPARE(musicDb2.allArtistsData().count(), 7);
3614         QCOMPARE(musicDb2.allTracksData().count(), 22);
3615         QCOMPARE(musicDbArtistAddedSpy2.count(), 0);
3616         QCOMPARE(musicDbAlbumAddedSpy2.count(), 0);
3617         QCOMPARE(musicDbTrackAddedSpy2.count(), 0);
3618         QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
3619         QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
3620         QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
3621         QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
3622         QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
3623         QCOMPARE(musicDbDatabaseErrorSpy2.count(), 0);
3624 
3625         musicDb2.insertTracksList(mNewTracks, mNewCovers);
3626 
3627         musicDbTrackAddedSpy2.wait(300);
3628 
3629         QCOMPARE(musicDb2.allAlbumsData().count(), 5);
3630         QCOMPARE(musicDb2.allArtistsData().count(), 7);
3631         QCOMPARE(musicDb2.allTracksData().count(), 22);
3632         QCOMPARE(musicDbArtistAddedSpy2.count(), 0);
3633         QCOMPARE(musicDbAlbumAddedSpy2.count(), 0);
3634         QCOMPARE(musicDbTrackAddedSpy2.count(), 0);
3635         QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
3636         QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
3637         QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
3638         QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
3639         QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
3640         QCOMPARE(musicDbDatabaseErrorSpy2.count(), 0);
3641     }
3642 
3643 
3644     void testAddAlbumsSameName()
3645     {
3646         QTemporaryFile databaseFile;
3647         databaseFile.open();
3648 
3649         qDebug() << "testAddAlbumsSameName" << databaseFile.fileName();
3650 
3651         DatabaseInterface musicDb;
3652 
3653         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
3654 
3655         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3656         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3657         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3658         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3659         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3660         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3661         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3662         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3663         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3664 
3665         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3666         QCOMPARE(musicDb.allArtistsData().count(), 0);
3667         QCOMPARE(musicDb.allTracksData().count(), 0);
3668         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3669         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3670         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3671         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3672         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3673         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3674         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3675         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3676         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3677 
3678         DataTypes::ListTrackDataType newTracks = {
3679             {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track1"),
3680              QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("artist6"),
3681              1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$20"))},
3682              QDateTime::fromMSecsSinceEpoch(20),
3683              {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 1, false,
3684              QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
3685             {true, QStringLiteral("$21"), QStringLiteral("0"), QStringLiteral("track2"),
3686              QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("artist6"),
3687              2, 1, QTime::fromMSecsSinceStartOfDay(2), {QUrl::fromLocalFile(QStringLiteral("/$21"))},
3688              QDateTime::fromMSecsSinceEpoch(21),
3689              {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 2, false,
3690              QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
3691             {true, QStringLiteral("$22"), QStringLiteral("0"), QStringLiteral("track3"),
3692              QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("artist6"),
3693              3, 1, QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$22"))},
3694              QDateTime::fromMSecsSinceEpoch(22),
3695              {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 3, false,
3696              QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
3697             {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track4"),
3698              QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("artist6"),
3699              4, 1, QTime::fromMSecsSinceStartOfDay(4), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3700              QDateTime::fromMSecsSinceEpoch(23),
3701              {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 4, false,
3702              QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
3703             {true, QStringLiteral("$24"), QStringLiteral("0"), QStringLiteral("track5"),
3704              QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("artist6"),
3705              5, 1, QTime::fromMSecsSinceStartOfDay(4), {QUrl::fromLocalFile(QStringLiteral("/$24"))},
3706              QDateTime::fromMSecsSinceEpoch(24),
3707              {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 5, false,
3708              QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
3709             {true, QStringLiteral("$25"), QStringLiteral("0"), QStringLiteral("track6"),
3710              QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("artist6"),
3711              6, 1, QTime::fromMSecsSinceStartOfDay(5), {QUrl::fromLocalFile(QStringLiteral("/$25"))},
3712              QDateTime::fromMSecsSinceEpoch(25),
3713              {QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 6, true,
3714              QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
3715             {true, QStringLiteral("$2"), QStringLiteral("0"), QStringLiteral("track2"),
3716              QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"),
3717              2, 2, QTime::fromMSecsSinceStartOfDay(2), {QUrl::fromLocalFile(QStringLiteral("/$26"))},
3718              QDateTime::fromMSecsSinceEpoch(26),
3719              {QUrl::fromLocalFile(QStringLiteral("file://image$2"))}, 2, false,
3720              QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
3721         };
3722 
3723         musicDb.insertTracksList(newTracks, mNewCovers);
3724 
3725         musicDbTrackAddedSpy.wait(100);
3726 
3727         QCOMPARE(musicDb.allAlbumsData().count(), 2);
3728         QCOMPARE(musicDb.allArtistsData().count(), 3);
3729         QCOMPARE(musicDb.allTracksData().count(), 7);
3730         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3731         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3732         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3733         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3734         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3735         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3736         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3737         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3738         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3739 
3740         auto firstAlbum = musicDb.albumDataFromDatabaseId(musicDb.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Invalid Artist"), QStringLiteral("/")));
3741     }
3742 
3743     void addTwoIdenticalTracksWithPartialAlbumArtist()
3744     {
3745         QTemporaryFile databaseFile;
3746         databaseFile.open();
3747 
3748         qDebug() << "addTwoTracksWithoutAlbumArtist" << databaseFile.fileName();
3749 
3750         DatabaseInterface musicDb;
3751 
3752         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
3753 
3754         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3755         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3756         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3757         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3758         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3759         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3760         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3761         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3762         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3763 
3764         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3765         QCOMPARE(musicDb.allArtistsData().count(), 0);
3766         QCOMPARE(musicDb.allTracksData().count(), 0);
3767         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3768         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3769         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3770         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3771         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3772         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3773         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3774         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3775         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3776 
3777         auto newTracks = DataTypes::ListTrackDataType();
3778 
3779         newTracks = {{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
3780                       QStringLiteral("artist2"), QStringLiteral("album3"), {},
3781                       6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3782                       QDateTime::fromMSecsSinceEpoch(23),
3783                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
3784                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), true},};
3785 
3786         auto newCovers = mNewCovers;
3787         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
3788 
3789         musicDb.insertTracksList(newTracks, newCovers);
3790 
3791         musicDbTrackAddedSpy.wait(300);
3792 
3793         QCOMPARE(musicDb.allAlbumsData().count(), 1);
3794         QCOMPARE(musicDb.allArtistsData().count(), 1);
3795         QCOMPARE(musicDb.allTracksData().count(), 1);
3796         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3797         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3798         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3799         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3800         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3801         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3802         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3803         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3804         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3805 
3806         auto firstTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
3807                                                                                                        QStringLiteral("album3"), 6, 1));
3808 
3809         QCOMPARE(firstTrack.isValid(), true);
3810         QCOMPARE(firstTrack.title(), QStringLiteral("track6"));
3811         QCOMPARE(firstTrack.artist(), QStringLiteral("artist2"));
3812         QCOMPARE(firstTrack.album(), QStringLiteral("album3"));
3813         QVERIFY(!firstTrack.albumArtist().isEmpty());
3814         QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
3815         QCOMPARE(firstTrack.trackNumber(), 6);
3816         QCOMPARE(firstTrack.discNumber(), 1);
3817         QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(23));
3818         QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$23")));
3819         QCOMPARE(firstTrack.rating(), 5);
3820         QCOMPARE(firstTrack.genre(), QStringLiteral("genre1"));
3821         QCOMPARE(firstTrack.composer(), QStringLiteral("composer1"));
3822         QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1"));
3823         QCOMPARE(firstTrack.hasEmbeddedCover(), true);
3824 
3825         auto newTracks2 = DataTypes::ListTrackDataType();
3826 
3827         newTracks2 = {{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
3828                        QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
3829                        6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
3830                        QDateTime::fromMSecsSinceEpoch(23),
3831                        {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
3832                        QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},};
3833 
3834         auto newCovers2 = mNewCovers;
3835         newCovers2[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
3836 
3837         musicDb.insertTracksList(newTracks2, newCovers2);
3838 
3839         musicDbTrackAddedSpy.wait(300);
3840 
3841         QCOMPARE(musicDb.allAlbumsData().count(), 1);
3842         QCOMPARE(musicDb.allArtistsData().count(), 1);
3843         QCOMPARE(musicDb.allTracksData().count(), 1);
3844         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3845         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3846         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3847         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3848         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3849         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3850         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3851         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3852         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3853     }
3854 
3855     void addTwoTracksWithPartialAlbumArtist2()
3856     {
3857         QTemporaryFile databaseFile;
3858         databaseFile.open();
3859 
3860         qDebug() << "addTwoTracksWithPartialAlbumArtist" << databaseFile.fileName();
3861 
3862         DatabaseInterface musicDb;
3863 
3864         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
3865 
3866         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
3867         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
3868         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
3869         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
3870         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
3871         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
3872         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
3873         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
3874         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
3875 
3876         QCOMPARE(musicDb.allAlbumsData().count(), 0);
3877         QCOMPARE(musicDb.allArtistsData().count(), 0);
3878         QCOMPARE(musicDb.allTracksData().count(), 0);
3879         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
3880         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
3881         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
3882         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3883         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3884         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3885         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3886         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3887         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3888 
3889         auto newTracks = DataTypes::ListTrackDataType();
3890 
3891         newTracks = {{true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"),
3892                       QStringLiteral("artist3"), QStringLiteral("album3"), {QStringLiteral("artist4")}, 7, 1,
3893                       QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/$20"))},
3894                       QDateTime::fromMSecsSinceEpoch(20),
3895                       {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
3896                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
3897 
3898         auto newCovers = mNewCovers;
3899         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
3900         newCovers[QStringLiteral("file:///$20")] = QUrl::fromLocalFile(QStringLiteral("album3"));
3901 
3902         musicDb.insertTracksList(newTracks, newCovers);
3903 
3904         musicDbTrackAddedSpy.wait(300);
3905 
3906         QCOMPARE(musicDb.allAlbumsData().count(), 1);
3907         QCOMPARE(musicDb.allArtistsData().count(), 2);
3908         QCOMPARE(musicDb.allTracksData().count(), 1);
3909         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3910         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3911         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
3912         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3913         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3914         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3915         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
3916         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3917         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3918 
3919         auto newTracks2 = DataTypes::ListTrackDataType();
3920 
3921         newTracks2 = {{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"),
3922                        QStringLiteral("artist4"), QStringLiteral("album3"), {}, 6, 1,
3923                        QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))},
3924                        QDateTime::fromMSecsSinceEpoch(19),
3925                        {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
3926                        QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), true}};
3927 
3928         musicDb.insertTracksList(newTracks2, newCovers);
3929 
3930         musicDbTrackAddedSpy.wait(300);
3931 
3932         QCOMPARE(musicDb.allAlbumsData().count(), 1);
3933         QCOMPARE(musicDb.allArtistsData().count(), 2);
3934         QCOMPARE(musicDb.allTracksData().count(), 2);
3935         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
3936         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
3937         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
3938         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
3939         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
3940         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
3941         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
3942         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
3943         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
3944 
3945         auto firstTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist4"),
3946                                                                                                        QStringLiteral("album3"), 6, 1));
3947 
3948         QCOMPARE(firstTrack.isValid(), true);
3949         QCOMPARE(firstTrack.title(), QStringLiteral("track6"));
3950         QCOMPARE(firstTrack.artist(), QStringLiteral("artist4"));
3951         QCOMPARE(firstTrack.album(), QStringLiteral("album3"));
3952         QVERIFY(!firstTrack.albumArtist().isEmpty());
3953         QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
3954         QCOMPARE(firstTrack.trackNumber(), 6);
3955         QCOMPARE(firstTrack.discNumber(), 1);
3956         QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(19));
3957         QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19")));
3958         QCOMPARE(firstTrack.rating(), 5);
3959         QCOMPARE(firstTrack.genre(), QStringLiteral("genre1"));
3960         QCOMPARE(firstTrack.composer(), QStringLiteral("composer1"));
3961         QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1"));
3962         QCOMPARE(firstTrack.hasEmbeddedCover(), true);
3963 
3964         auto secondTrack = musicDb.trackDataFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist3"),
3965                                                                                                         QStringLiteral("album3"), 7, 1));
3966 
3967         QCOMPARE(secondTrack.isValid(), true);
3968         QCOMPARE(secondTrack.title(), QStringLiteral("track7"));
3969         QCOMPARE(secondTrack.artist(), QStringLiteral("artist3"));
3970         QCOMPARE(secondTrack.album(), QStringLiteral("album3"));
3971         QCOMPARE(secondTrack.albumArtist(), QStringLiteral("artist4"));
3972         QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3")));
3973         QCOMPARE(secondTrack.trackNumber(), 7);
3974         QCOMPARE(secondTrack.discNumber(), 1);
3975         QCOMPARE(secondTrack.duration(), QTime::fromMSecsSinceStartOfDay(20));
3976         QCOMPARE(secondTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$20")));
3977         QCOMPARE(secondTrack.rating(), 5);
3978         QCOMPARE(secondTrack.genre(), QStringLiteral("genre1"));
3979         QCOMPARE(secondTrack.composer(), QStringLiteral("composer1"));
3980         QCOMPARE(secondTrack.lyricist(), QStringLiteral("lyricist1"));
3981         QCOMPARE(secondTrack.hasEmbeddedCover(), false);
3982 
3983         auto albumId = musicDb.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist4"), QStringLiteral("/"));
3984         auto album = musicDb.albumDataFromDatabaseId(albumId);
3985         auto albumData = musicDb.albumData(albumId);
3986 
3987         QCOMPARE(album.isValid(), true);
3988         QCOMPARE(albumData.count(), 2);
3989         QCOMPARE(album.title(), QStringLiteral("album3"));
3990         QCOMPARE(album.artist(), QStringLiteral("artist4"));
3991         QCOMPARE(album.isValidArtist(), true);
3992         QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3")));
3993         QCOMPARE(album.isSingleDiscAlbum(), true);
3994     }
3995 
3996     void addTowAlbumsWithDifferentPathsAndSameName()
3997     {
3998         QTemporaryFile databaseFile;
3999         databaseFile.open();
4000 
4001         qDebug() << "addTowAlbumsWithDifferentPathsAndSameName" << databaseFile.fileName();
4002 
4003         DatabaseInterface musicDb;
4004 
4005         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
4006 
4007         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4008         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4009         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4010         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4011         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4012         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4013         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4014         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4015         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4016 
4017         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4018         QCOMPARE(musicDb.allArtistsData().count(), 0);
4019         QCOMPARE(musicDb.allTracksData().count(), 0);
4020         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4021         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4022         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4023         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4024         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4025         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4026         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4027         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4028         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4029 
4030         auto newTracks = DataTypes::ListTrackDataType();
4031 
4032         newTracks = {{true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"),
4033                       QStringLiteral("artist1"), QStringLiteral("album7"), {}, 7, 1,
4034                       QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/album7/$20"))},
4035                       QDateTime::fromMSecsSinceEpoch(20),
4036                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4037                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
4038                      {true, QStringLiteral("$21"), QStringLiteral("0"), QStringLiteral("track8"),
4039                       QStringLiteral("artist2"), QStringLiteral("album7"), {}, 8, 1,
4040                       QTime::fromMSecsSinceStartOfDay(21), {QUrl::fromLocalFile(QStringLiteral("/album7/$21"))},
4041                       QDateTime::fromMSecsSinceEpoch(21),
4042                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4043                       QStringLiteral("genre2"), QStringLiteral("composer2"), QStringLiteral("lyricist2"), false},
4044                      {true, QStringLiteral("$22"), QStringLiteral("0"), QStringLiteral("track9"),
4045                       QStringLiteral("artist3"), QStringLiteral("album7"), {}, 9, 1,
4046                       QTime::fromMSecsSinceStartOfDay(22), {QUrl::fromLocalFile(QStringLiteral("/album8/$22"))},
4047                       QDateTime::fromMSecsSinceEpoch(22),
4048                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4049                       QStringLiteral("genre3"), QStringLiteral("composer3"), QStringLiteral("lyricist3"), false},
4050                      {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track10"),
4051                       QStringLiteral("artist4"), QStringLiteral("album7"), {}, 10, 1,
4052                       QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/album8/$23"))},
4053                       QDateTime::fromMSecsSinceEpoch(23),
4054                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4055                       QStringLiteral("genre4"), QStringLiteral("composer4"), QStringLiteral("lyricist4"), false},};
4056 
4057         auto newCovers = mNewCovers;
4058         newCovers[QStringLiteral("file:///album7/$20")] = QUrl::fromLocalFile(QStringLiteral("album7"));
4059         newCovers[QStringLiteral("file:///album7/$21")] = QUrl::fromLocalFile(QStringLiteral("album7"));
4060         newCovers[QStringLiteral("file:///album8/$22")] = QUrl::fromLocalFile(QStringLiteral("album8"));
4061         newCovers[QStringLiteral("file:///album8/$23")] = QUrl::fromLocalFile(QStringLiteral("album8"));
4062 
4063         musicDb.insertTracksList(newTracks, newCovers);
4064 
4065         musicDbTrackAddedSpy.wait(300);
4066 
4067         QCOMPARE(musicDb.allAlbumsData().count(), 2);
4068         QCOMPARE(musicDb.allArtistsData().count(), 4);
4069         QCOMPARE(musicDb.allTracksData().count(), 4);
4070         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4071         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4072         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4073         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4074         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4075         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4076         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4077         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4078         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4079 
4080         QCOMPARE(musicDb.allAlbumsData().size(), 2);
4081         QCOMPARE(musicDb.allArtistsData().size(), 4);
4082         QCOMPARE(musicDb.allTracksData().size(), 4);
4083 
4084         auto allAlbums = musicDb.allAlbumsData();
4085         auto firstAlbum = allAlbums[0];
4086         auto firstAlbumData = musicDb.albumData(firstAlbum.databaseId());
4087         QCOMPARE(firstAlbumData.count(), 2);
4088         auto secondAlbum = allAlbums[1];
4089         auto secondAlbumData = musicDb.albumData(secondAlbum.databaseId());
4090         QCOMPARE(secondAlbumData.count(), 2);
4091     }
4092 
4093     void addTwoAlbumsWithDifferentPathsAndSameTracks()
4094     {
4095         QTemporaryFile databaseFile;
4096         databaseFile.open();
4097 
4098         qDebug() << "addTowAlbumsWithDifferentPathsAndSameName" << databaseFile.fileName();
4099 
4100         DatabaseInterface musicDb;
4101 
4102         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
4103 
4104         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4105         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4106         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4107         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4108         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4109         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4110         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4111         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4112         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4113 
4114         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4115         QCOMPARE(musicDb.allArtistsData().count(), 0);
4116         QCOMPARE(musicDb.allTracksData().count(), 0);
4117         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4118         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4119         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4120         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4121         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4122         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4123         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4124         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4125         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4126 
4127         auto newTracks = DataTypes::ListTrackDataType();
4128 
4129         newTracks = {{true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"),
4130                       QStringLiteral("artist1"), QStringLiteral("album7"), {}, 7, 1,
4131                       QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/album7/$20"))},
4132                       QDateTime::fromMSecsSinceEpoch(20),
4133                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4134                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
4135                      {true, QStringLiteral("$21"), QStringLiteral("0"), QStringLiteral("track8"),
4136                       QStringLiteral("artist2"), QStringLiteral("album7"), {}, 8, 1,
4137                       QTime::fromMSecsSinceStartOfDay(21), {QUrl::fromLocalFile(QStringLiteral("/album7/$21"))},
4138                       QDateTime::fromMSecsSinceEpoch(21),
4139                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4140                       QStringLiteral("genre2"), QStringLiteral("composer2"), QStringLiteral("lyricist2"), false},
4141                      {true, QStringLiteral("$22"), QStringLiteral("0"), QStringLiteral("track9"),
4142                       QStringLiteral("artist3"), QStringLiteral("album7"), {}, 9, 1,
4143                       QTime::fromMSecsSinceStartOfDay(22), {QUrl::fromLocalFile(QStringLiteral("/album7/$22"))},
4144                       QDateTime::fromMSecsSinceEpoch(22),
4145                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4146                       QStringLiteral("genre3"), QStringLiteral("composer3"), QStringLiteral("lyricist3"), false},
4147                      {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"),
4148                       QStringLiteral("artist1"), QStringLiteral("album7"), {}, 7, 1,
4149                       QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/album8/$20"))},
4150                       QDateTime::fromMSecsSinceEpoch(20),
4151                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4152                       QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
4153                      {true, QStringLiteral("$21"), QStringLiteral("0"), QStringLiteral("track8"),
4154                       QStringLiteral("artist2"), QStringLiteral("album7"), {}, 8, 1,
4155                       QTime::fromMSecsSinceStartOfDay(21), {QUrl::fromLocalFile(QStringLiteral("/album8/$21"))},
4156                       QDateTime::fromMSecsSinceEpoch(21),
4157                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4158                       QStringLiteral("genre2"), QStringLiteral("composer2"), QStringLiteral("lyricist2"), false},
4159                      {true, QStringLiteral("$22"), QStringLiteral("0"), QStringLiteral("track9"),
4160                       QStringLiteral("artist3"), QStringLiteral("album7"), {}, 9, 1,
4161                       QTime::fromMSecsSinceStartOfDay(22), {QUrl::fromLocalFile(QStringLiteral("/album8/$22"))},
4162                       QDateTime::fromMSecsSinceEpoch(22),
4163                       {QUrl::fromLocalFile(QStringLiteral("album7"))}, 5, true,
4164                       QStringLiteral("genre3"), QStringLiteral("composer3"), QStringLiteral("lyricist3"), false},};
4165 
4166         auto newCovers = mNewCovers;
4167         newCovers[QStringLiteral("file:///album7/$20")] = QUrl::fromLocalFile(QStringLiteral("album7"));
4168         newCovers[QStringLiteral("file:///album7/$21")] = QUrl::fromLocalFile(QStringLiteral("album7"));
4169         newCovers[QStringLiteral("file:///album7/$22")] = QUrl::fromLocalFile(QStringLiteral("album7"));
4170         newCovers[QStringLiteral("file:///album8/$20")] = QUrl::fromLocalFile(QStringLiteral("album8"));
4171         newCovers[QStringLiteral("file:///album8/$21")] = QUrl::fromLocalFile(QStringLiteral("album8"));
4172         newCovers[QStringLiteral("file:///album8/$22")] = QUrl::fromLocalFile(QStringLiteral("album8"));
4173 
4174         musicDb.insertTracksList(newTracks, newCovers);
4175 
4176         musicDbTrackAddedSpy.wait(300);
4177 
4178         QCOMPARE(musicDb.allAlbumsData().count(), 2);
4179         QCOMPARE(musicDb.allArtistsData().count(), 3);
4180         QCOMPARE(musicDb.allTracksData().count(), 6);
4181         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4182         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4183         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4184         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4185         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4186         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4187         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4188         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4189         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4190 
4191         auto allAlbums = musicDb.allAlbumsData();
4192         auto firstAlbum = allAlbums[0];
4193         auto firstAlbumData = musicDb.albumData(firstAlbum.databaseId());
4194         QCOMPARE(firstAlbumData.count(), 3);
4195         auto secondAlbum = allAlbums[1];
4196         auto secondAlbumData = musicDb.albumData(secondAlbum.databaseId());
4197         QCOMPARE(secondAlbumData.count(), 3);
4198     }
4199 
4200     void addTwoTracksFromSameAlbumButDifferentDiscs()
4201     {
4202         QTemporaryFile databaseFile;
4203         databaseFile.open();
4204 
4205         qDebug() << "addTwoTracksFromSameAlbumButDifferentDiscs" << databaseFile.fileName();
4206 
4207         DatabaseInterface musicDb;
4208 
4209         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
4210 
4211         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4212         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4213         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4214         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4215         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4216         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4217         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4218         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4219         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4220 
4221         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4222         QCOMPARE(musicDb.allArtistsData().count(), 0);
4223         QCOMPARE(musicDb.allTracksData().count(), 0);
4224         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4225         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4226         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4227         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4228         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4229         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4230         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4231         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4232         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4233 
4234         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
4235                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
4236                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))},
4237                 QDateTime::fromMSecsSinceEpoch(23),
4238         {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5, true,
4239                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
4240         auto newTracks = DataTypes::ListTrackDataType();
4241         newTracks.push_back(newTrack);
4242 
4243         auto newCovers = mNewCovers;
4244         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
4245 
4246         musicDb.insertTracksList(newTracks, newCovers);
4247 
4248         musicDbTrackAddedSpy.wait(300);
4249 
4250         QCOMPARE(musicDb.allAlbumsData().count(), 1);
4251         QCOMPARE(musicDb.allArtistsData().count(), 1);
4252         QCOMPARE(musicDb.allTracksData().count(), 1);
4253         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4254         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4255         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4256         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4257         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4258         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4259         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4260         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4261         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4262 
4263         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
4264                                                                          QStringLiteral("album3"), 6, 1);
4265         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
4266 
4267         auto firstTrackTitle = firstTrack.title();
4268         auto firstTrackArtist = firstTrack.artist();
4269         auto firstTrackAlbumArtist = firstTrack.albumArtist();
4270         auto firstTrackAlbum = firstTrack.album();
4271         auto firstTrackImage = firstTrack.albumCover();
4272         auto firstTrackDuration = firstTrack.duration();
4273         auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
4274         auto firstTrackTrackNumber = firstTrack.trackNumber();
4275         auto firstTrackDiscNumber = firstTrack.discNumber();
4276         const auto &firstTrackResource = firstTrack.resourceURI();
4277         auto firstTrackRating = firstTrack.rating();
4278         auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
4279 
4280         QCOMPARE(firstTrack.isValid(), true);
4281         QCOMPARE(firstTrackTitle, QStringLiteral("track6"));
4282         QCOMPARE(firstTrackArtist, QStringLiteral("artist2"));
4283         QCOMPARE(firstTrackAlbumArtist, QStringLiteral("artist2"));
4284         QCOMPARE(firstTrackAlbum, QStringLiteral("album3"));
4285         QCOMPARE(firstTrackImage.isValid(), true);
4286         QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
4287         QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
4288         QCOMPARE(firstTrackMilliSecondsDuration, 23);
4289         QCOMPARE(firstTrackTrackNumber, 6);
4290         QCOMPARE(firstTrackDiscNumber, 1);
4291         QCOMPARE(firstTrackResource.isValid(), true);
4292         QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$23")));
4293         QCOMPARE(firstTrackRating, 5);
4294         QCOMPARE(firstIsSingleDiscAlbum, true);
4295 
4296         auto allAlbums = musicDb.allAlbumsData();
4297 
4298         QCOMPARE(allAlbums.size(), 1);
4299 
4300         auto firstAlbumData = musicDb.albumData(allAlbums[0].databaseId());
4301         auto firstAlbumTitle = allAlbums[0].title();
4302         auto firstAlbumArtist = allAlbums[0].artist();
4303         auto firstAlbumImage = allAlbums[0].albumArtURI();
4304         auto firstAlbumTracksCount = firstAlbumData.count();
4305         auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum();
4306 
4307         QCOMPARE(firstAlbumTitle, QStringLiteral("album3"));
4308         QCOMPARE(firstAlbumArtist, QStringLiteral("artist2"));
4309         QCOMPARE(firstAlbumImage.isValid(), true);
4310         QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album3")));
4311         QCOMPARE(firstAlbumTracksCount, 1);
4312         QCOMPARE(firstAlbumIsSingleDiscAlbum, true);
4313 
4314         auto newTrack2 = DataTypes::TrackDataType{true, QStringLiteral("$25"), QStringLiteral("0"), QStringLiteral("track8"),
4315                 QStringLiteral("artist9"), QStringLiteral("album3"), QStringLiteral("artist2"), 8, 2, QTime::fromMSecsSinceStartOfDay(25),
4316         {QUrl::fromLocalFile(QStringLiteral("/$25"))},
4317                 QDateTime::fromMSecsSinceEpoch(25),
4318         {QUrl::fromLocalFile(QStringLiteral("file://image$25"))}, 5, true,
4319                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
4320         auto newTracks2 = DataTypes::ListTrackDataType();
4321         newTracks2.push_back(newTrack2);
4322 
4323         auto newCovers2 = mNewCovers;
4324         newCovers2[QStringLiteral("file:///$25")] = QUrl::fromLocalFile(QStringLiteral("album3"));
4325 
4326         musicDb.insertTracksList(newTracks2, newCovers2);
4327 
4328         musicDbTrackAddedSpy.wait(50);
4329 
4330         QCOMPARE(musicDb.allAlbumsData().count(), 1);
4331         QCOMPARE(musicDb.allArtistsData().count(), 2);
4332         QCOMPARE(musicDb.allTracksData().count(), 2);
4333         QCOMPARE(musicDbArtistAddedSpy.count(), 2);
4334         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4335         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
4336         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4337         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4338         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4339         QCOMPARE(musicDbAlbumModifiedSpy.count(), 1);
4340         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4341         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4342 
4343         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track8"), QStringLiteral("artist9"),
4344                                                                           QStringLiteral("album3"), 8, 2);
4345         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
4346 
4347         auto secondTrackTitle = secondTrack.title();
4348         auto secondTrackArtist = secondTrack.artist();
4349         auto secondTrackAlbumArtist = secondTrack.albumArtist();
4350         auto secondTrackAlbum = secondTrack.album();
4351         auto secondTrackImage = secondTrack.albumCover();
4352         auto secondTrackDuration = secondTrack.duration();
4353         auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
4354         auto secondTrackTrackNumber = secondTrack.trackNumber();
4355         auto secondTrackDiscNumber = secondTrack.discNumber();
4356         const auto &secondTrackResource = secondTrack.resourceURI();
4357         auto secondTrackRating = secondTrack.rating();
4358         auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
4359 
4360         QCOMPARE(secondTrack.isValid(), true);
4361         QCOMPARE(secondTrackTitle, QStringLiteral("track8"));
4362         QCOMPARE(secondTrackArtist, QStringLiteral("artist9"));
4363         QCOMPARE(secondTrackAlbumArtist, QStringLiteral("artist2"));
4364         QCOMPARE(secondTrackAlbum, QStringLiteral("album3"));
4365         QCOMPARE(secondTrackImage.isValid(), true);
4366         QCOMPARE(secondTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
4367         QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(25));
4368         QCOMPARE(secondTrackMilliSecondsDuration, 25);
4369         QCOMPARE(secondTrackTrackNumber, 8);
4370         QCOMPARE(secondTrackDiscNumber, 2);
4371         QCOMPARE(secondTrackResource.isValid(), true);
4372         QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$25")));
4373         QCOMPARE(secondTrackRating, 5);
4374         QCOMPARE(secondIsSingleDiscAlbum, false);
4375 
4376         auto allAlbums2 = musicDb.allAlbumsData();
4377 
4378         auto firstAlbumData2 = musicDb.albumData(allAlbums2[0].databaseId());
4379         auto firstAlbumTitle2 = allAlbums2[0].title();
4380         auto firstAlbumArtist2 = allAlbums2[0].artist();
4381         auto firstAlbumImage2 = allAlbums2[0].albumArtURI();
4382         auto firstAlbumTracksCount2 = firstAlbumData2.count();
4383         auto firstAlbumIsSingleDiscAlbum2 = allAlbums2[0].isSingleDiscAlbum();
4384 
4385         QCOMPARE(firstAlbumTitle2, QStringLiteral("album3"));
4386         QCOMPARE(firstAlbumArtist2, QStringLiteral("artist2"));
4387         QCOMPARE(firstAlbumImage2.isValid(), true);
4388         QCOMPARE(firstAlbumImage2, QUrl::fromLocalFile(QStringLiteral("album3")));
4389         QCOMPARE(firstAlbumTracksCount2, 2);
4390         QCOMPARE(firstAlbumIsSingleDiscAlbum2, false);
4391     }
4392 
4393     void addTwoIdenticalInvalidTracks()
4394     {
4395         DatabaseInterface musicDb;
4396 
4397         musicDb.init(QStringLiteral("testDb"));
4398 
4399         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4400         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4401         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4402         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4403         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4404         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4405         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4406         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4407         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4408 
4409         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4410         QCOMPARE(musicDb.allArtistsData().count(), 0);
4411         QCOMPARE(musicDb.allTracksData().count(), 0);
4412         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4413         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4414         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4415         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4416         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4417         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4418         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4419         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4420         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4421 
4422         musicDb.insertTracksList(mNewTracks, mNewCovers);
4423 
4424         musicDbTrackAddedSpy.wait(300);
4425 
4426         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4427         QCOMPARE(musicDb.allArtistsData().count(), 7);
4428         QCOMPARE(musicDb.allTracksData().count(), 22);
4429         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4430         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4431         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4432         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4433         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4434         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4435         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4436         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4437         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4438 
4439         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), {},
4440         {}, {}, {}, {}, {}, {}, {QUrl::fromLocalFile(QStringLiteral("file:///$23"))},
4441                 QDateTime::fromMSecsSinceEpoch(23), {}, {}, {}, {}, {}, {}, false};
4442         auto newTracks = DataTypes::ListTrackDataType();
4443         newTracks.push_back(newTrack);
4444         newTracks.push_back(newTrack);
4445 
4446         auto newCovers = mNewCovers;
4447         newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
4448 
4449         musicDb.insertTracksList(newTracks, newCovers);
4450 
4451         musicDbTrackAddedSpy.wait(300);
4452 
4453         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4454         QCOMPARE(musicDb.allArtistsData().count(), 7);
4455         QCOMPARE(musicDb.allTracksData().count(), 23);
4456         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4457         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4458         QCOMPARE(musicDbTrackAddedSpy.count(), 2);
4459         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4460         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4461         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4462         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4463         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4464         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4465     }
4466 
4467 
4468     void checkRestoredTracks()
4469     {
4470         DatabaseInterface musicDb;
4471 
4472         musicDb.init(QStringLiteral("testDb"));
4473 
4474         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4475         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4476         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4477         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4478         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4479         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4480         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4481         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4482         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4483         QSignalSpy musicDbRestoredTracksSpy(&musicDb, &DatabaseInterface::restoredTracks);
4484 
4485         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4486         QCOMPARE(musicDb.allArtistsData().count(), 0);
4487         QCOMPARE(musicDb.allTracksData().count(), 0);
4488         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4489         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4490         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4491         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4492         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4493         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4494         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4495         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4496         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4497         QCOMPARE(musicDbRestoredTracksSpy.count(), 0);
4498 
4499         musicDb.insertTracksList(mNewTracks, mNewCovers);
4500 
4501         musicDbTrackAddedSpy.wait(300);
4502 
4503         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4504         QCOMPARE(musicDb.allArtistsData().count(), 7);
4505         QCOMPARE(musicDb.allTracksData().count(), 22);
4506         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4507         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4508         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4509         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4510         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4511         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4512         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4513         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4514         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4515         QCOMPARE(musicDbRestoredTracksSpy.count(), 0);
4516 
4517         musicDb.askRestoredTracks();
4518 
4519         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4520         QCOMPARE(musicDb.allArtistsData().count(), 7);
4521         QCOMPARE(musicDb.allTracksData().count(), 22);
4522         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4523         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4524         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4525         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4526         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4527         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4528         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4529         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4530         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4531         QCOMPARE(musicDbRestoredTracksSpy.count(), 1);
4532 
4533         const auto &firstSignal = musicDbRestoredTracksSpy.at(0);
4534         QCOMPARE(firstSignal.count(), 1);
4535 
4536         const auto &restoredTracks = firstSignal.at(0).value<QHash<QUrl,QDateTime>>();
4537         QCOMPARE(restoredTracks.count(), 23);
4538     }
4539 
4540     void addOneTrackWithParticularPath()
4541     {
4542         DatabaseInterface musicDb;
4543 
4544         musicDb.init(QStringLiteral("testDb"));
4545 
4546         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4547         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4548         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4549         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4550         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4551         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4552         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4553         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4554         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4555 
4556         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4557         QCOMPARE(musicDb.allArtistsData().count(), 0);
4558         QCOMPARE(musicDb.allTracksData().count(), 0);
4559         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4560         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4561         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4562         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4563         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4564         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4565         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4566         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4567         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4568 
4569         auto newTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
4570                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
4571                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test{{test}}/$23"))},
4572                 QDateTime::fromMSecsSinceEpoch(23),
4573                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
4574                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
4575         auto newTracks = DataTypes::ListTrackDataType();
4576         newTracks.push_back(newTrack);
4577 
4578         auto newCovers = mNewCovers;
4579         newCovers[QStringLiteral("/test{{test}}/$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
4580 
4581         musicDb.insertTracksList(newTracks, newCovers);
4582 
4583         musicDbTrackAddedSpy.wait(300);
4584 
4585         QCOMPARE(musicDb.allAlbumsData().count(), 1);
4586         QCOMPARE(musicDb.allArtistsData().count(), 1);
4587         QCOMPARE(musicDb.allTracksData().count(), 1);
4588         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4589         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4590         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4591         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4592         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4593         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4594         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4595         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4596         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4597     }
4598 
4599     void readRecentlyPlayedTracksData()
4600     {
4601         DatabaseInterface musicDb;
4602 
4603         musicDb.init(QStringLiteral("testDb"));
4604 
4605         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4606         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4607         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4608         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4609         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4610         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4611         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4612         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4613         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4614 
4615         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4616         QCOMPARE(musicDb.allArtistsData().count(), 0);
4617         QCOMPARE(musicDb.allTracksData().count(), 0);
4618         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4619         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4620         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4621         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4622         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4623         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4624         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4625         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4626         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4627 
4628         musicDb.insertTracksList(mNewTracks, mNewCovers);
4629 
4630         musicDbTrackAddedSpy.wait(300);
4631 
4632         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4633         QCOMPARE(musicDb.allArtistsData().count(), 7);
4634         QCOMPARE(musicDb.allTracksData().count(), 22);
4635         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4636         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4637         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4638         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4639         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4640         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4641         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4642         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4643         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4644 
4645         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$9")), QDateTime::fromSecsSinceEpoch(1534689));
4646         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$17")), QDateTime::fromSecsSinceEpoch(1534692));
4647         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$16")), QDateTime::fromSecsSinceEpoch(1534759));
4648         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$8")), QDateTime::fromSecsSinceEpoch(1534869));
4649         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$2")), QDateTime::fromSecsSinceEpoch(1535189));
4650         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$11")), QDateTime::fromSecsSinceEpoch(1535389));
4651         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$18")), QDateTime::fromSecsSinceEpoch(1535689));
4652         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$7")), QDateTime::fromSecsSinceEpoch(1536189));
4653         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$5")), QDateTime::fromSecsSinceEpoch(1536689));
4654         musicDb.trackHasStartedPlaying(QUrl::fromLocalFile(QStringLiteral("/$13")), QDateTime::fromSecsSinceEpoch(1537689));
4655 
4656         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$9")), QDateTime::fromSecsSinceEpoch(1534689));
4657         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$17")), QDateTime::fromSecsSinceEpoch(1534692));
4658         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$16")), QDateTime::fromSecsSinceEpoch(1534759));
4659         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$8")), QDateTime::fromSecsSinceEpoch(1534869));
4660         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$2")), QDateTime::fromSecsSinceEpoch(1535189));
4661         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$11")), QDateTime::fromSecsSinceEpoch(1535389));
4662         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$18")), QDateTime::fromSecsSinceEpoch(1535689));
4663         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$7")), QDateTime::fromSecsSinceEpoch(1536189));
4664         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$5")), QDateTime::fromSecsSinceEpoch(1536689));
4665         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$13")), QDateTime::fromSecsSinceEpoch(1537689));
4666 
4667         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4668         QCOMPARE(musicDb.allArtistsData().count(), 7);
4669         QCOMPARE(musicDb.allTracksData().count(), 22);
4670         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4671         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4672         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4673         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4674         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4675         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4676         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4677         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4678         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4679 
4680         auto recentlyPlayedTracksData = musicDb.recentlyPlayedTracksData(10);
4681 
4682         QCOMPARE(recentlyPlayedTracksData.count(), 10);
4683         QCOMPARE(recentlyPlayedTracksData[0].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$13")));
4684         QCOMPARE(recentlyPlayedTracksData[1].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$5")));
4685         QCOMPARE(recentlyPlayedTracksData[2].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$7")));
4686         QCOMPARE(recentlyPlayedTracksData[3].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$18")));
4687         QCOMPARE(recentlyPlayedTracksData[4].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$11")));
4688         QCOMPARE(recentlyPlayedTracksData[5].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$2")));
4689         QCOMPARE(recentlyPlayedTracksData[6].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$8")));
4690         QCOMPARE(recentlyPlayedTracksData[7].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$16")));
4691         QCOMPARE(recentlyPlayedTracksData[8].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$17")));
4692         QCOMPARE(recentlyPlayedTracksData[9].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$9")));
4693     }
4694 
4695     void readFrequentlyPlayedTracksData()
4696     {
4697         DatabaseInterface musicDb;
4698 
4699         musicDb.init(QStringLiteral("testDb"));
4700 
4701         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4702         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4703         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4704         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4705         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4706         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4707         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4708         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4709         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4710 
4711         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4712         QCOMPARE(musicDb.allArtistsData().count(), 0);
4713         QCOMPARE(musicDb.allTracksData().count(), 0);
4714         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4715         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4716         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4717         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4718         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4719         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4720         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4721         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4722         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4723 
4724         musicDb.insertTracksList(mNewTracks, mNewCovers);
4725 
4726         musicDbTrackAddedSpy.wait(300);
4727 
4728         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4729         QCOMPARE(musicDb.allArtistsData().count(), 7);
4730         QCOMPARE(musicDb.allTracksData().count(), 22);
4731         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4732         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4733         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4734         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4735         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4736         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4737         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4738         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4739         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4740 
4741         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$9")), QDateTime::fromSecsSinceEpoch(1553279650));
4742         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$17")), QDateTime::fromSecsSinceEpoch(1553288650));
4743         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$16")), QDateTime::fromSecsSinceEpoch(1553287650));
4744         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$8")), QDateTime::fromSecsSinceEpoch(1553286650));
4745         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$2")), QDateTime::fromSecsSinceEpoch(1553285650));
4746         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$11")), QDateTime::fromSecsSinceEpoch(1553284650));
4747         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$18")), QDateTime::fromSecsSinceEpoch(1553283650));
4748         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$7")), QDateTime::fromSecsSinceEpoch(1553282650));
4749         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$5")), QDateTime::fromSecsSinceEpoch(1553281650));
4750         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$13")), QDateTime::fromSecsSinceEpoch(1553280650));
4751         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$9")), QDateTime::fromSecsSinceEpoch(1553289660));
4752         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$2")), QDateTime::fromSecsSinceEpoch(1553289680));
4753         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$18")), QDateTime::fromSecsSinceEpoch(1553289700));
4754         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$17")), QDateTime::fromSecsSinceEpoch(1553289720));
4755         musicDb.trackHasFinishedPlaying(QUrl::fromLocalFile(QStringLiteral("/$7")), QDateTime::fromSecsSinceEpoch(1553289740));
4756 
4757         auto frequentlyPlayedTracksData = musicDb.frequentlyPlayedTracksData(5);
4758 
4759         QCOMPARE(frequentlyPlayedTracksData.count(), 5);
4760         QCOMPARE(frequentlyPlayedTracksData[0].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$2")));
4761         QCOMPARE(frequentlyPlayedTracksData[1].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$7")));
4762         QCOMPARE(frequentlyPlayedTracksData[2].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$9")));
4763         QCOMPARE(frequentlyPlayedTracksData[3].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$17")));
4764         QCOMPARE(frequentlyPlayedTracksData[4].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$18")));
4765     }
4766 
4767     void readAllGenresData()
4768     {
4769         DatabaseInterface musicDb;
4770 
4771         musicDb.init(QStringLiteral("testDb"));
4772 
4773         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4774         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4775         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4776         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4777         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4778         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4779         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4780         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4781         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4782 
4783         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4784         QCOMPARE(musicDb.allArtistsData().count(), 0);
4785         QCOMPARE(musicDb.allTracksData().count(), 0);
4786         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4787         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4788         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4789         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4790         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4791         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4792         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4793         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4794         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4795 
4796         musicDb.insertTracksList(mNewTracks, mNewCovers);
4797 
4798         musicDbTrackAddedSpy.wait(300);
4799 
4800         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4801         QCOMPARE(musicDb.allArtistsData().count(), 7);
4802         QCOMPARE(musicDb.allTracksData().count(), 22);
4803         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4804         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4805         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4806         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4807         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4808         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4809         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4810         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4811         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4812 
4813         auto allGenresData = musicDb.allGenresData();
4814 
4815         QCOMPARE(allGenresData.count(), 4);
4816         QCOMPARE(allGenresData[0].title(), QStringLiteral("genre1"));
4817         QCOMPARE(allGenresData[1].title(), QStringLiteral("genre2"));
4818         QCOMPARE(allGenresData[2].title(), QStringLiteral("genre3"));
4819         QCOMPARE(allGenresData[3].title(), QStringLiteral("genre4"));
4820     }
4821 
4822     void clearDataTest()
4823     {
4824         DatabaseInterface musicDb;
4825 
4826         musicDb.init(QStringLiteral("testDb"));
4827 
4828         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4829         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4830         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4831         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4832         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4833         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4834         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4835         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4836         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4837         QSignalSpy musicDbCleanedDatabaseSpy(&musicDb, &DatabaseInterface::cleanedDatabase);
4838 
4839         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4840         QCOMPARE(musicDb.allArtistsData().count(), 0);
4841         QCOMPARE(musicDb.allTracksData().count(), 0);
4842         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4843         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4844         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4845         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4846         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4847         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4848         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4849         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4850         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4851         QCOMPARE(musicDbCleanedDatabaseSpy.count(), 0);
4852 
4853         musicDb.insertTracksList(mNewTracks, mNewCovers);
4854 
4855         musicDbTrackAddedSpy.wait(300);
4856 
4857         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4858         QCOMPARE(musicDb.allArtistsData().count(), 7);
4859         QCOMPARE(musicDb.allTracksData().count(), 22);
4860         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4861         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4862         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4863         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4864         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4865         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4866         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4867         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4868         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4869         QCOMPARE(musicDbCleanedDatabaseSpy.count(), 0);
4870 
4871         musicDb.clearData();
4872 
4873         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4874         QCOMPARE(musicDb.allArtistsData().count(), 0);
4875         QCOMPARE(musicDb.allTracksData().count(), 0);
4876         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4877         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4878         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4879         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4880         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4881         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4882         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4883         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4884         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4885         QCOMPARE(musicDbCleanedDatabaseSpy.count(), 1);
4886     }
4887 
4888     void upgradeFromStableVersion()
4889     {
4890         auto dbTestFile = QString{QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/elisaDatabase.v0.3.db")};
4891         auto dbOriginFile = QString{QStringLiteral(LOCAL_FILE_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/elisaDatabase.v0.3.db")};
4892         QVERIFY(QDir().mkpath(QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH)));
4893         QFile::remove(dbTestFile);
4894         QFile::copy(dbOriginFile, dbTestFile);
4895 
4896         DatabaseInterface musicDb;
4897 
4898         musicDb.init(QStringLiteral("testDb"), dbTestFile);
4899 
4900         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4901         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4902         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4903         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4904         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4905         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4906         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4907         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4908         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4909 
4910         QCOMPARE(musicDb.allAlbumsData().count(), 5);
4911         QCOMPARE(musicDb.allArtistsData().count(), 7);
4912         QCOMPARE(musicDb.allTracksData().count(), 22);
4913         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4914         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4915         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4916         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4917         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4918         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4919         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4920         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4921         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4922     }
4923 
4924     void addMultipleDifferentTracksWithSameTitle()
4925     {
4926         QTemporaryFile databaseFile;
4927         databaseFile.open();
4928 
4929         qDebug() << "addMultipleDifferentTracksWithSameTitle" << databaseFile.fileName();
4930 
4931         DatabaseInterface musicDb;
4932 
4933         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
4934 
4935         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
4936         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
4937         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
4938         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
4939         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
4940         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
4941         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
4942         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
4943         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
4944 
4945         QCOMPARE(musicDb.allAlbumsData().count(), 0);
4946         QCOMPARE(musicDb.allArtistsData().count(), 0);
4947         QCOMPARE(musicDb.allTracksData().count(), 0);
4948         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
4949         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
4950         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
4951         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4952         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4953         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4954         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4955         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4956         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4957 
4958         auto newTracks = DataTypes::ListTrackDataType{
4959         {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
4960                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
4961                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
4962                 QDateTime::fromMSecsSinceEpoch(23),
4963                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
4964                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
4965         {true, QStringLiteral("$24"), QStringLiteral("0"), QStringLiteral("track6"),
4966                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
4967                 7, 1, QTime::fromMSecsSinceStartOfDay(24), {QUrl::fromLocalFile(QStringLiteral("/test/$24"))},
4968                 QDateTime::fromMSecsSinceEpoch(24),
4969                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
4970                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
4971         {true, QStringLiteral("$25"), QStringLiteral("0"), QStringLiteral("track6"),
4972                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
4973                 8, 1, QTime::fromMSecsSinceStartOfDay(25), {QUrl::fromLocalFile(QStringLiteral("/test/$25"))},
4974                 QDateTime::fromMSecsSinceEpoch(25),
4975                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
4976                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
4977 
4978         auto newCovers = mNewCovers;
4979         newCovers[QStringLiteral("/test/$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
4980         newCovers[QStringLiteral("/test/$24")] = QUrl::fromLocalFile(QStringLiteral("album3"));
4981         newCovers[QStringLiteral("/test/$25")] = QUrl::fromLocalFile(QStringLiteral("album3"));
4982 
4983         musicDb.insertTracksList(newTracks, newCovers);
4984 
4985         musicDbTrackAddedSpy.wait(300);
4986 
4987         QCOMPARE(musicDb.allAlbumsData().count(), 1);
4988         QCOMPARE(musicDb.allArtistsData().count(), 1);
4989         QCOMPARE(musicDb.allTracksData().count(), 3);
4990         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
4991         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
4992         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
4993         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
4994         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
4995         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
4996         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
4997         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
4998         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
4999     }
5000 
5001     void enqueueTracksWithMissingMetadata()
5002     {
5003         QTemporaryFile databaseFile;
5004         databaseFile.open();
5005 
5006         qDebug() << "enqueueTracksWithMissingMetadata" << databaseFile.fileName();
5007 
5008         DatabaseInterface musicDb;
5009 
5010         musicDb.init(QStringLiteral("enqueueTracksWithMissingMetadata"), databaseFile.fileName());
5011 
5012         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
5013         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
5014         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5015         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
5016         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
5017         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
5018         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
5019         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5020         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5021 
5022         QCOMPARE(musicDb.allAlbumsData().count(), 0);
5023         QCOMPARE(musicDb.allArtistsData().count(), 0);
5024         QCOMPARE(musicDb.allTracksData().count(), 0);
5025         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
5026         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
5027         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
5028         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5029         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5030         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5031         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5032         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5033         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5034 
5035         auto fullTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
5036                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
5037                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
5038                 QDateTime::fromMSecsSinceEpoch(23),
5039                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5040                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false};
5041 
5042         fullTrack[DataTypes::BitRateRole] = 154;
5043         fullTrack[DataTypes::ChannelsRole] = 2;
5044         fullTrack[DataTypes::SampleRateRole] = 48000;
5045 
5046         auto newTrack = DataTypes::TrackDataType{};
5047 
5048         newTrack[DataTypes::IdRole] = QStringLiteral("$29");
5049         newTrack[DataTypes::ParentIdRole] = QStringLiteral("0");
5050         newTrack[DataTypes::TitleRole] = QStringLiteral("track19");
5051         newTrack[DataTypes::ArtistRole] = QStringLiteral("artist2");
5052         newTrack[DataTypes::DurationRole] = QTime::fromMSecsSinceStartOfDay(29);
5053         newTrack[DataTypes::ResourceRole] = QUrl::fromLocalFile(QStringLiteral("/$29"));
5054         newTrack[DataTypes::FileModificationTime] = QDateTime::fromMSecsSinceEpoch(29);
5055         newTrack[DataTypes::ImageUrlRole] = QUrl::fromLocalFile(QStringLiteral("/withoutAlbum"));
5056         newTrack[DataTypes::RatingRole] = 9;
5057         newTrack[DataTypes::IsSingleDiscAlbumRole] = true;
5058         newTrack[DataTypes::GenreRole] = QStringLiteral("genre1");
5059         newTrack[DataTypes::ComposerRole] = QStringLiteral("composer1");
5060         newTrack[DataTypes::LyricistRole] = QStringLiteral("lyricist1");
5061         newTrack[DataTypes::HasEmbeddedCover] = false;
5062         newTrack[DataTypes::ElementTypeRole] = ElisaUtils::Track;
5063 
5064         auto temp = {fullTrack, newTrack};
5065         musicDb.insertTracksList(temp, mNewCovers);
5066 
5067         QCOMPARE(musicDb.allAlbumsData().count(), 1);
5068         QCOMPARE(musicDb.allArtistsData().count(), 1);
5069         QCOMPARE(musicDb.allTracksData().count(), 2);
5070         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
5071         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
5072         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
5073         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5074         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5075         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5076         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5077         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5078         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5079 
5080         auto firstTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"),
5081                                                                          QStringLiteral("album3"), 6, 1);
5082         auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
5083 
5084         auto firstTrackTitle = firstTrack.title();
5085         auto firstTrackArtist = firstTrack.artist();
5086         auto firstTrackAlbumArtist = firstTrack.albumArtist();
5087         auto firstTrackAlbum = firstTrack.album();
5088         auto firstTrackImage = firstTrack.albumCover();
5089         auto firstTrackDuration = firstTrack.duration();
5090         auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay();
5091         auto firstTrackTrackNumber = firstTrack.trackNumber();
5092         auto firstTrackDiscNumber = firstTrack.discNumber();
5093         const auto &firstTrackResource = firstTrack.resourceURI();
5094         auto firstTrackRating = firstTrack.rating();
5095         auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
5096 
5097         QCOMPARE(firstTrack.isValid(), true);
5098         QCOMPARE(firstTrackTitle, QStringLiteral("track6"));
5099         QCOMPARE(firstTrackArtist, QStringLiteral("artist2"));
5100         QCOMPARE(firstTrackAlbumArtist, QStringLiteral("artist2"));
5101         QCOMPARE(firstTrackAlbum, QStringLiteral("album3"));
5102         QCOMPARE(firstTrackImage.isValid(), true);
5103         QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album3")));
5104         QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
5105         QCOMPARE(firstTrackMilliSecondsDuration, 23);
5106         QCOMPARE(firstTrackTrackNumber, 6);
5107         QCOMPARE(firstTrackDiscNumber, 1);
5108         QCOMPARE(firstTrackResource.isValid(), true);
5109         QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5110         QCOMPARE(firstTrackRating, 5);
5111         QCOMPARE(firstIsSingleDiscAlbum, true);
5112 
5113         auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track19"), QStringLiteral("artist2"), {}, {}, {});
5114         auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
5115 
5116         auto secondTrackTitle = secondTrack.title();
5117         auto secondTrackArtist = secondTrack.artist();
5118         auto secondTrackAlbumArtist = secondTrack.albumArtist();
5119         auto secondTrackAlbum = secondTrack.album();
5120         auto secondTrackImage = secondTrack.albumCover();
5121         auto secondTrackDuration = secondTrack.duration();
5122         auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay();
5123         auto secondTrackTrackNumber = secondTrack.trackNumber();
5124         auto secondTrackDiscNumber = secondTrack.discNumber();
5125         auto secondTrackChannels = secondTrack.channels();
5126         auto secondTrackBitRate = secondTrack.bitRate();
5127         auto secondTrackSampleRate = secondTrack.sampleRate();
5128         const auto &secondTrackResource = secondTrack.resourceURI();
5129         auto secondTrackRating = secondTrack.rating();
5130         auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
5131 
5132         QCOMPARE(secondTrack.isValid(), true);
5133         QCOMPARE(secondTrackTitle, QStringLiteral("track19"));
5134         QCOMPARE(secondTrackArtist, QStringLiteral("artist2"));
5135         QCOMPARE(secondTrackAlbumArtist, QString());
5136         QCOMPARE(secondTrackAlbum, QString());
5137         QCOMPARE(secondTrackImage.isValid(), false);
5138         QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(29));
5139         QCOMPARE(secondTrackMilliSecondsDuration, 29);
5140         QCOMPARE(secondTrackTrackNumber, 0);
5141         QCOMPARE(secondTrackDiscNumber, 0);
5142         QCOMPARE(secondTrackChannels, 0);
5143         QCOMPARE(secondTrackBitRate, 0);
5144         QCOMPARE(secondTrackSampleRate, 0);
5145         QCOMPARE(secondTrackResource.isValid(), true);
5146         QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$29")));
5147         QCOMPARE(secondTrackRating, 9);
5148         QCOMPARE(secondIsSingleDiscAlbum, true);
5149     }
5150 
5151     void testCompilationWithoutAlbumArtist()
5152     {
5153         QTemporaryFile databaseFile;
5154         databaseFile.open();
5155 
5156         qDebug() << "testCompilationWithoutAlbumArtist" << databaseFile.fileName();
5157 
5158         DatabaseInterface musicDb;
5159 
5160         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
5161 
5162         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
5163         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
5164         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5165         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
5166         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
5167         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
5168         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
5169         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5170         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5171 
5172         QCOMPARE(musicDb.allAlbumsData().count(), 0);
5173         QCOMPARE(musicDb.allArtistsData().count(), 0);
5174         QCOMPARE(musicDb.allTracksData().count(), 0);
5175         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
5176         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
5177         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
5178         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5179         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5180         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5181         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5182         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5183         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5184 
5185         auto newTracks = DataTypes::ListTrackDataType{
5186         {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
5187                 QStringLiteral("artist2"), QStringLiteral("album3"), {},
5188                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
5189                 QDateTime::fromMSecsSinceEpoch(23),
5190                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5191                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
5192         {true, QStringLiteral("$24"), QStringLiteral("0"), QStringLiteral("track7"),
5193                 QStringLiteral("artist3"), QStringLiteral("album3"), {},
5194                 7, 1, QTime::fromMSecsSinceStartOfDay(24), {QUrl::fromLocalFile(QStringLiteral("/test/$24"))},
5195                 QDateTime::fromMSecsSinceEpoch(24),
5196                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5197                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false},
5198         {true, QStringLiteral("$25"), QStringLiteral("0"), QStringLiteral("track8"),
5199                 QStringLiteral("artist4"), QStringLiteral("album3"), {},
5200                 8, 1, QTime::fromMSecsSinceStartOfDay(25), {QUrl::fromLocalFile(QStringLiteral("/test/$25"))},
5201                 QDateTime::fromMSecsSinceEpoch(25),
5202                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5203                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
5204 
5205         auto newCovers = mNewCovers;
5206         newCovers[QStringLiteral("/test/$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5207         newCovers[QStringLiteral("/test/$24")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5208         newCovers[QStringLiteral("/test/$25")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5209 
5210         musicDb.insertTracksList(newTracks, newCovers);
5211 
5212         musicDbTrackAddedSpy.wait(300);
5213 
5214         QCOMPARE(musicDb.allAlbumsData().count(), 1);
5215         QCOMPARE(musicDb.allArtistsData().count(), 3);
5216         QCOMPARE(musicDb.allTracksData().count(), 3);
5217         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
5218         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
5219         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
5220         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5221         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5222         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5223         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5224         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5225         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5226 
5227         const auto newAlbumSignal = musicDbAlbumAddedSpy.at(0);
5228         QCOMPARE(newAlbumSignal.size(), 1);
5229         const auto newAlbums = newAlbumSignal.at(0).value<DataTypes::ListAlbumDataType>();
5230         QCOMPARE(newAlbums.size(), 1);
5231         const auto newAlbum = newAlbums.at(0);
5232         QCOMPARE(newAlbum.title(), QStringLiteral("album3"));
5233         QCOMPARE(newAlbum.artist(), QStringLiteral("Various Artists"));
5234         QCOMPARE(newAlbum[DataTypes::ColumnsRoles::SecondaryTextRole], QStringLiteral("Various Artists"));
5235 
5236         const auto oneAlbum = musicDb.allAlbumsData().at(0);
5237         QCOMPARE(oneAlbum.title(), QStringLiteral("album3"));
5238         QCOMPARE(oneAlbum.artist(), QStringLiteral("Various Artists"));
5239         QCOMPARE(oneAlbum[DataTypes::ColumnsRoles::SecondaryTextRole], QStringLiteral("Various Artists"));
5240     }
5241 
5242     void testAlbumFromGenreAndArtistWithoutAlbumArtist()
5243     {
5244         QTemporaryFile databaseFile;
5245         databaseFile.open();
5246 
5247         qDebug() << "testAlbumFromGenreAndArtistWithoutAlbumArtist" << databaseFile.fileName();
5248 
5249         DatabaseInterface musicDb;
5250 
5251         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
5252 
5253         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
5254         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
5255         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5256         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
5257         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
5258         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
5259         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
5260         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5261         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5262 
5263         QCOMPARE(musicDb.allAlbumsData().count(), 0);
5264         QCOMPARE(musicDb.allArtistsData().count(), 0);
5265         QCOMPARE(musicDb.allTracksData().count(), 0);
5266         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
5267         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
5268         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
5269         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5270         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5271         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5272         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5273         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5274         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5275 
5276         auto newTracks = DataTypes::ListTrackDataType{
5277         {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
5278                 QStringLiteral("artist2"), QStringLiteral("album3"), {},
5279                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
5280                 QDateTime::fromMSecsSinceEpoch(23),
5281                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5282                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
5283 
5284         auto newCovers = mNewCovers;
5285         newCovers[QStringLiteral("/test/$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5286         newCovers[QStringLiteral("/test/$24")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5287         newCovers[QStringLiteral("/test/$25")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5288 
5289         musicDb.insertTracksList(newTracks, newCovers);
5290 
5291         musicDbTrackAddedSpy.wait(300);
5292 
5293         QCOMPARE(musicDb.allAlbumsData().count(), 1);
5294         QCOMPARE(musicDb.allArtistsData().count(), 1);
5295         QCOMPARE(musicDb.allTracksData().count(), 1);
5296         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
5297         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
5298         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
5299         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5300         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5301         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5302         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5303         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5304         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5305 
5306         auto albumFromGenreAndArtist = musicDb.allAlbumsDataByGenreAndArtist(QStringLiteral("genre1"), QStringLiteral("artist2"));
5307 
5308         QCOMPARE(albumFromGenreAndArtist.size(), 1);
5309     }
5310 
5311     void testTracksWithoutMetadata()
5312     {
5313         QTemporaryFile databaseFile;
5314         databaseFile.open();
5315 
5316         qDebug() << "testTracksWithoutMetadata" << databaseFile.fileName();
5317 
5318         DatabaseInterface musicDb;
5319 
5320         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
5321 
5322         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
5323         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
5324         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5325         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
5326         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
5327         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
5328         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
5329         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5330         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5331 
5332         QCOMPARE(musicDb.allAlbumsData().count(), 0);
5333         QCOMPARE(musicDb.allArtistsData().count(), 0);
5334         QCOMPARE(musicDb.allTracksData().count(), 0);
5335         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
5336         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
5337         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
5338         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5339         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5340         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5341         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5342         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5343         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5344 
5345         auto newTracks = DataTypes::ListTrackDataType {
5346         {true, {}, {}, {}, {}, {}, {}, 0, 0, {}, {QUrl::fromLocalFile(QStringLiteral("/test/$23"))}, QDateTime::fromMSecsSinceEpoch(23), {}, 0, true, {}, {}, {}, false},
5347         {true, {}, {}, {}, {}, {}, {}, 0, 0, {}, {QUrl::fromLocalFile(QStringLiteral("/test/$24"))}, QDateTime::fromMSecsSinceEpoch(24), {}, 0, true, {}, {}, {}, false},
5348         {true, {}, {}, {}, {}, {}, {}, 0, 0, {}, {QUrl::fromLocalFile(QStringLiteral("/test/$25"))}, QDateTime::fromMSecsSinceEpoch(25), {}, 0, true, {}, {}, {}, false}};
5349 
5350         auto newCovers = mNewCovers;
5351 
5352         musicDb.insertTracksList(newTracks, newCovers);
5353 
5354         musicDbTrackAddedSpy.wait(300);
5355 
5356         QCOMPARE(musicDb.allAlbumsData().count(), 0);
5357         QCOMPARE(musicDb.allArtistsData().count(), 0);
5358         QCOMPARE(musicDb.allTracksData().count(), 3);
5359         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
5360         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
5361         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
5362         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5363         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5364         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5365         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5366         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5367         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5368 
5369         auto allTracks = musicDb.allTracksData();
5370         QVERIFY(allTracks[0].title().isEmpty());
5371         QCOMPARE(allTracks[0].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5372         QCOMPARE(allTracks[0].fileModificationTime(), QDateTime::fromMSecsSinceEpoch(23));
5373         QVERIFY(allTracks[1].title().isEmpty());
5374         QCOMPARE(allTracks[1].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/test/$24")));
5375         QCOMPARE(allTracks[1].fileModificationTime(), QDateTime::fromMSecsSinceEpoch(24));
5376         QVERIFY(allTracks[2].title().isEmpty());
5377         QCOMPARE(allTracks[2].resourceURI(), QUrl::fromLocalFile(QStringLiteral("/test/$25")));
5378         QCOMPARE(allTracks[2].fileModificationTime(), QDateTime::fromMSecsSinceEpoch(25));
5379     }
5380 
5381     void removeTrackNumber()
5382     {
5383         QTemporaryFile databaseFile;
5384         databaseFile.open();
5385 
5386         qDebug() << "removeTrackNumber" << databaseFile.fileName();
5387 
5388         DatabaseInterface musicDb;
5389 
5390         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5391         QSignalSpy musicDbErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5392         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5393 
5394         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
5395 
5396         musicDb.insertTracksList(mNewTracks, mNewCovers);
5397 
5398         musicDbTrackAddedSpy.wait(300);
5399 
5400         QCOMPARE(musicDb.allAlbumsData().count(), 5);
5401         QCOMPARE(musicDbErrorSpy.count(), 0);
5402         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5403 
5404         auto newTracks = DataTypes::ListTrackDataType{
5405         {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
5406                 QStringLiteral("artist2"), QStringLiteral("album3"), {},
5407                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
5408                 QDateTime::fromMSecsSinceEpoch(23),
5409                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5410                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
5411 
5412         auto newCovers = mNewCovers;
5413         newCovers[QStringLiteral("/test/$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5414         newCovers[QStringLiteral("/test/$24")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5415         newCovers[QStringLiteral("/test/$25")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5416 
5417         musicDb.insertTracksList(newTracks, newCovers);
5418 
5419         QCOMPARE(musicDb.allAlbumsData().count(), 6);
5420         QCOMPARE(musicDbErrorSpy.count(), 0);
5421         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5422 
5423         auto trackIdFirstVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5424         auto firstTrackDataVersion = musicDb.trackDataFromDatabaseId(trackIdFirstVersion);
5425 
5426         auto newTrackData = firstTrackDataVersion;
5427         newTrackData.remove(DataTypes::TrackNumberRole);
5428 
5429         musicDb.insertTracksList({newTrackData}, newCovers);
5430 
5431         QCOMPARE(musicDb.allAlbumsData().count(), 6);
5432         QCOMPARE(musicDbErrorSpy.count(), 0);
5433         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
5434 
5435         auto trackIdSecondVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5436         QCOMPARE(trackIdFirstVersion, trackIdSecondVersion);
5437 
5438         auto secondTrackDataVersion = musicDb.trackDataFromDatabaseId(trackIdSecondVersion);
5439 
5440         auto modifiedTrack = musicDbTrackModifiedSpy.at(0).at(0).value<DataTypes::TrackDataType>();
5441 
5442         auto trackIdIterator = secondTrackDataVersion.find(DataTypes::TrackNumberRole);
5443         QCOMPARE(trackIdIterator, secondTrackDataVersion.end());
5444 
5445         QCOMPARE(secondTrackDataVersion, modifiedTrack);
5446     }
5447 
5448     void removeDiscNumber()
5449     {
5450         QTemporaryFile databaseFile;
5451         databaseFile.open();
5452 
5453         qDebug() << "removeTrackNumber" << databaseFile.fileName();
5454 
5455         DatabaseInterface musicDb;
5456 
5457         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5458         QSignalSpy musicDbErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5459         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5460 
5461         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
5462 
5463         musicDb.insertTracksList(mNewTracks, mNewCovers);
5464 
5465         musicDbTrackAddedSpy.wait(300);
5466 
5467         QCOMPARE(musicDb.allAlbumsData().count(), 5);
5468         QCOMPARE(musicDbErrorSpy.count(), 0);
5469         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5470 
5471         auto newTracks = DataTypes::ListTrackDataType{
5472         {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
5473                 QStringLiteral("artist2"), QStringLiteral("album3"), {},
5474                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
5475                 QDateTime::fromMSecsSinceEpoch(23),
5476                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5477                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
5478 
5479         auto newCovers = mNewCovers;
5480         newCovers[QStringLiteral("/test/$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5481         newCovers[QStringLiteral("/test/$24")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5482         newCovers[QStringLiteral("/test/$25")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5483 
5484         musicDb.insertTracksList(newTracks, newCovers);
5485 
5486         QCOMPARE(musicDb.allAlbumsData().count(), 6);
5487         QCOMPARE(musicDbErrorSpy.count(), 0);
5488         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5489 
5490         auto trackIdFirstVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5491         auto firstTrackDataVersion = musicDb.trackDataFromDatabaseId(trackIdFirstVersion);
5492 
5493         auto newTrackData = firstTrackDataVersion;
5494         newTrackData.remove(DataTypes::DiscNumberRole);
5495 
5496         musicDb.insertTracksList({newTrackData}, newCovers);
5497 
5498         QCOMPARE(musicDb.allAlbumsData().count(), 6);
5499         QCOMPARE(musicDbErrorSpy.count(), 0);
5500         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
5501 
5502         auto trackIdSecondVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5503         QCOMPARE(trackIdFirstVersion, trackIdSecondVersion);
5504 
5505         auto secondTrackDataVersion = musicDb.trackDataFromDatabaseId(trackIdSecondVersion);
5506 
5507         auto modifiedTrack = musicDbTrackModifiedSpy.at(0).at(0).value<DataTypes::TrackDataType>();
5508 
5509         auto trackIdIterator = secondTrackDataVersion.find(DataTypes::DiscNumberRole);
5510         QCOMPARE(trackIdIterator, secondTrackDataVersion.end());
5511 
5512         QCOMPARE(secondTrackDataVersion, modifiedTrack);
5513 
5514         qDebug() << trackIdFirstVersion << secondTrackDataVersion;
5515     }
5516 
5517     void removeYear()
5518     {
5519         QTemporaryFile databaseFile;
5520         databaseFile.open();
5521 
5522         qDebug() << "removeYear" << databaseFile.fileName();
5523 
5524         DatabaseInterface musicDb;
5525 
5526         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5527         QSignalSpy musicDbErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5528         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5529 
5530         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
5531 
5532         musicDb.insertTracksList(mNewTracks, mNewCovers);
5533 
5534         musicDbTrackAddedSpy.wait(300);
5535 
5536         QCOMPARE(musicDb.allAlbumsData().count(), 5);
5537         QCOMPARE(musicDbErrorSpy.count(), 0);
5538         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5539 
5540         auto newTracks = DataTypes::ListTrackDataType{
5541         {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
5542                 QStringLiteral("artist2"), QStringLiteral("album3"), {},
5543                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
5544                 QDateTime::fromMSecsSinceEpoch(23),
5545                 QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
5546                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), false}};
5547 
5548         newTracks.last()[DataTypes::YearRole] = 2020;
5549 
5550         auto newCovers = mNewCovers;
5551         newCovers[QStringLiteral("/test/$23")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5552         newCovers[QStringLiteral("/test/$24")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5553         newCovers[QStringLiteral("/test/$25")] = QUrl::fromLocalFile(QStringLiteral("album3"));
5554 
5555         musicDb.insertTracksList(newTracks, newCovers);
5556 
5557         QCOMPARE(musicDb.allAlbumsData().count(), 6);
5558         QCOMPARE(musicDbErrorSpy.count(), 0);
5559         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5560 
5561         auto trackIdFirstVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5562         auto firstTrackDataVersion = musicDb.trackDataFromDatabaseId(trackIdFirstVersion);
5563 
5564         auto newTrackData = firstTrackDataVersion;
5565         newTrackData.remove(DataTypes::YearRole);
5566 
5567         musicDb.insertTracksList({newTrackData}, newCovers);
5568 
5569         QCOMPARE(musicDb.allAlbumsData().count(), 6);
5570         QCOMPARE(musicDbErrorSpy.count(), 0);
5571         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
5572 
5573         auto trackIdSecondVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5574         QCOMPARE(trackIdFirstVersion, trackIdSecondVersion);
5575 
5576         auto secondTrackDataVersion = musicDb.trackDataFromDatabaseId(trackIdSecondVersion);
5577 
5578         auto modifiedTrack = musicDbTrackModifiedSpy.at(0).at(0).value<DataTypes::TrackDataType>();
5579 
5580         auto trackIdIterator = secondTrackDataVersion.find(DataTypes::YearRole);
5581         QCOMPARE(trackIdIterator, secondTrackDataVersion.end());
5582 
5583         QCOMPARE(secondTrackDataVersion, modifiedTrack);
5584     }
5585 
5586     void modifyOneTrackWithEmbeddedCover()
5587     {
5588         QTemporaryFile databaseFile;
5589         databaseFile.open();
5590 
5591         qDebug() << "modifyOneTrack" << databaseFile.fileName();
5592 
5593         DatabaseInterface musicDb;
5594 
5595         musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
5596 
5597         QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded);
5598         QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded);
5599         QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::tracksAdded);
5600         QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved);
5601         QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved);
5602         QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved);
5603         QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified);
5604         QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified);
5605         QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5606 
5607         QCOMPARE(musicDb.allAlbumsData().count(), 0);
5608         QCOMPARE(musicDb.allArtistsData().count(), 0);
5609         QCOMPARE(musicDb.allTracksData().count(), 0);
5610         QCOMPARE(musicDbArtistAddedSpy.count(), 0);
5611         QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
5612         QCOMPARE(musicDbTrackAddedSpy.count(), 0);
5613         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5614         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5615         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5616         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5617         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5618         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5619 
5620         auto fullTrack = DataTypes::TrackDataType{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"),
5621                 QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"),
5622                 6, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
5623                 QDateTime::fromMSecsSinceEpoch(23), {}, 5, true,
5624                 QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1"), true};
5625 
5626         fullTrack[DataTypes::BitRateRole] = 154;
5627         fullTrack[DataTypes::ChannelsRole] = 2;
5628         fullTrack[DataTypes::SampleRateRole] = 48000;
5629 
5630         musicDb.insertTracksList({fullTrack}, {});
5631 
5632         musicDbTrackAddedSpy.wait(300);
5633 
5634         QCOMPARE(musicDb.allAlbumsData().count(), 1);
5635         QCOMPARE(musicDb.allArtistsData().count(), 1);
5636         QCOMPARE(musicDb.allTracksData().count(), 1);
5637         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
5638         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
5639         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
5640         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5641         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5642         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5643         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5644         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
5645         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5646 
5647         auto trackIdFirstVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5648         auto firstTrackDataVersion = musicDb.trackDataFromDatabaseId(trackIdFirstVersion);
5649 
5650         QVERIFY(firstTrackDataVersion.hasEmbeddedCover());
5651         QCOMPARE(firstTrackDataVersion[DataTypes::ImageUrlRole].toString(), QStringLiteral("image://cover//test/$23"));
5652 
5653         firstTrackDataVersion[DataTypes::TrackNumberRole] = 12;
5654         firstTrackDataVersion[DataTypes::FileModificationTime] = QDateTime::fromMSecsSinceEpoch(32);
5655 
5656         musicDb.insertTracksList({firstTrackDataVersion}, {});
5657 
5658         musicDbTrackAddedSpy.wait(300);
5659 
5660         QCOMPARE(musicDb.allAlbumsData().count(), 1);
5661         QCOMPARE(musicDb.allArtistsData().count(), 1);
5662         QCOMPARE(musicDb.allTracksData().count(), 1);
5663         QCOMPARE(musicDbArtistAddedSpy.count(), 1);
5664         QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
5665         QCOMPARE(musicDbTrackAddedSpy.count(), 1);
5666         QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
5667         QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
5668         QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
5669         QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
5670         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
5671         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5672 
5673         auto modifiedTrackIdFirstVersion = musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/test/$23")));
5674         auto modifiedTrackDataVersion = musicDb.trackDataFromDatabaseId(modifiedTrackIdFirstVersion);
5675 
5676         QVERIFY(modifiedTrackDataVersion.hasEmbeddedCover());
5677         QCOMPARE(modifiedTrackDataVersion[DataTypes::ImageUrlRole].toString(), QStringLiteral("image://cover//test/$23"));
5678 
5679         auto modifiedTrack = musicDbTrackModifiedSpy.at(0).at(0).value<DataTypes::TrackDataType>();
5680 
5681         QVERIFY(modifiedTrack.hasEmbeddedCover());
5682         QCOMPARE(modifiedTrack[DataTypes::ImageUrlRole].toString(), QStringLiteral("image://cover//test/$23"));
5683     }
5684 
5685     void testInvalidDatabase()
5686     {
5687         const auto dbName = QStringLiteral("testDb");
5688         QString databaseFileName;
5689 
5690         {
5691             // NOTE: a QTemporaryFile cannot be deleted but `resetDatabase()` attempts to delete the database file,
5692             // hence why we use a QFile in this test. Remember to delete the file when the test has finished!
5693             QTemporaryFile tempFile;
5694             tempFile.open();
5695             databaseFileName = tempFile.fileName();
5696             tempFile.setAutoRemove(false);
5697         }
5698 
5699         QFile databaseFile(databaseFileName);
5700 
5701         // Make a valid database
5702         {
5703             DatabaseInterface musicDb;
5704 
5705             QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5706 
5707             musicDb.init(dbName, databaseFileName);
5708 
5709             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5710         }
5711 
5712         // Invalidate the database
5713         {
5714             auto invalidDatabase = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), dbName);
5715             invalidDatabase.setDatabaseName(databaseFileName);
5716             QCOMPARE(invalidDatabase.open(), true);
5717 
5718             QCOMPARE(invalidDatabase.transaction(), true);
5719 
5720             auto dropQuery = QSqlQuery(invalidDatabase);
5721             QCOMPARE(dropQuery.prepare(QStringLiteral("ALTER TABLE `Albums` DROP COLUMN `CoverFileName`")), true);
5722             QCOMPARE(dropQuery.exec(), true);
5723             dropQuery.finish();
5724 
5725             QCOMPARE(invalidDatabase.commit(), true);
5726 
5727             invalidDatabase.close();
5728         }
5729 
5730         // This one should detect the error & fix it
5731         {
5732             DatabaseInterface musicDb;
5733 
5734             QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5735 
5736             musicDb.init(dbName, databaseFileName);
5737 
5738             QCOMPARE(musicDbDatabaseErrorSpy.count(), 1);
5739         }
5740 
5741         // Check database has been fixed
5742         {
5743             DatabaseInterface musicDb;
5744 
5745             QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError);
5746 
5747             musicDb.init(dbName, databaseFileName);
5748 
5749             QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
5750         }
5751 
5752         databaseFile.remove();
5753     }
5754 };
5755 
5756 QTEST_GUILESS_MAIN(DatabaseInterfaceTests)
5757 
5758 
5759 #include "databaseinterfacetest.moc"