Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crate filter tests #1277

Merged
merged 4 commits into from
Jun 5, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
212 changes: 212 additions & 0 deletions src/test/searchqueryparsertest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,17 @@ class SearchQueryParserTest : public LibraryTest {
virtual ~SearchQueryParserTest() {
}

TrackId addTrackToCollection(const QString& trackLocation) {
TrackPointer pTrack(collection()->getTrackDAO().addSingleTrack(trackLocation, false));
return pTrack ? pTrack->getId() : TrackId();
}

SearchQueryParser m_parser;

// The expected query to be returned by CrateFilterNode
const QString m_crateFilterQuery =
"id IN (SELECT DISTINCT track_id FROM crate_tracks"
" JOIN crates ON crate_id=id WHERE name LIKE '%%1%' ORDER BY track_id)";
};

TEST_F(SearchQueryParserTest, EmptySearch) {
Expand Down Expand Up @@ -660,3 +670,205 @@ TEST_F(SearchQueryParserTest, HumanReadableDurationSearchwithRangeFilter) {
qPrintable(QString("(duration >= 150) AND (duration <= 200)")),
qPrintable(pQuery->toSql()));
}

TEST_F(SearchQueryParserTest, CrateFilter) {
// User's search term
QString searchTerm = "test";

// Parse the user query
auto pQuery(m_parser.parseQuery(QString("crate: %1").arg(searchTerm),
QStringList(), ""));

// locations for test tracks
const QString kTrackALocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-jpg.mp3");
const QString kTrackBLocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-png.mp3");

// Create new crate and add it to the collection
Crate testCrate;
testCrate.setName(searchTerm);
CrateId testCrateId;
collection()->insertCrate(testCrate, &testCrateId);

// Add the track in the collection
TrackId trackAId = addTrackToCollection(kTrackALocationTest);
TrackPointer pTrackA(Track::newDummy(kTrackALocationTest, trackAId));
TrackId trackBId = addTrackToCollection(kTrackBLocationTest);
TrackPointer pTrackB(Track::newDummy(kTrackBLocationTest, trackBId));

// Add track A to the newly created crate
QList<TrackId> trackIds;
trackIds << trackAId;
collection()->addCrateTracks(testCrateId, trackIds);

EXPECT_TRUE(pQuery->match(pTrackA));
EXPECT_FALSE(pQuery->match(pTrackB));

EXPECT_STREQ(
qPrintable(m_crateFilterQuery.arg(searchTerm)),
qPrintable(pQuery->toSql()));
}

TEST_F(SearchQueryParserTest, CrateFilterEmpty) {
// Empty should match everything
auto pQuery(m_parser.parseQuery(QString("crate: "), QStringList(), ""));

TrackPointer pTrackA(Track::newTemporary());

EXPECT_TRUE(pQuery->match(pTrackA));

EXPECT_STREQ(
qPrintable(""),
qPrintable(pQuery->toSql()));
}

// Checks if the crate filter works with quoted text with whitespaces
TEST_F(SearchQueryParserTest, CrateFilterQuote){
// User's search term
QString searchTerm = "test with whitespace";

// Parse the user query
auto pQuery(m_parser.parseQuery(QString("crate: \"%1\"").arg(searchTerm),
QStringList(), ""));

// locations for test tracks
const QString kTrackALocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-jpg.mp3");
const QString kTrackBLocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-png.mp3");

// Create new crate and add it to the collection
Crate testCrate;
testCrate.setName(searchTerm);
CrateId testCrateId;
collection()->insertCrate(testCrate, &testCrateId);

// Add the tracks in the collection
TrackId trackAId = addTrackToCollection(kTrackALocationTest);
TrackPointer pTrackA(Track::newDummy(kTrackALocationTest, trackAId));
TrackId trackBId = addTrackToCollection(kTrackBLocationTest);
TrackPointer pTrackB(Track::newDummy(kTrackBLocationTest, trackBId));

// Add track A to the newly created crate
QList<TrackId> trackIds;
trackIds << trackAId;
collection()->addCrateTracks(testCrateId, trackIds);

EXPECT_TRUE(pQuery->match(pTrackA));
EXPECT_FALSE(pQuery->match(pTrackB));

EXPECT_STREQ(
qPrintable(m_crateFilterQuery.arg(searchTerm)),
qPrintable(pQuery->toSql()));
}

// Tests if the crate filter works along with other filters (artist)
TEST_F(SearchQueryParserTest, CrateFilterWithOther){
QStringList searchColumns;
searchColumns << "artist"
<< "album";

// User's search term
QString searchTerm = "test";

// Parse the user query
auto pQuery(m_parser.parseQuery(QString("crate: %1 artist: asdf").arg(searchTerm),
QStringList(), ""));

// locations for test tracks
const QString kTrackALocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-jpg.mp3");
const QString kTrackBLocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-png.mp3");

// Create new crate and add it to the collection
Crate testCrate;
testCrate.setName(searchTerm);
CrateId testCrateId;
collection()->insertCrate(testCrate, &testCrateId);

// Add the tracks in the collection
TrackId trackAId = addTrackToCollection(kTrackALocationTest);
TrackPointer pTrackA(Track::newDummy(kTrackALocationTest, trackAId));
TrackId trackBId = addTrackToCollection(kTrackBLocationTest);
TrackPointer pTrackB(Track::newDummy(kTrackBLocationTest, trackBId));

// Add trackA to the newly created crate
QList<TrackId> trackIds;
trackIds << trackAId;
collection()->addCrateTracks(testCrateId, trackIds);

pTrackA->setArtist("asdf");
pTrackB->setArtist("asdf");

EXPECT_TRUE(pQuery->match(pTrackA));
EXPECT_FALSE(pQuery->match(pTrackB));

EXPECT_STREQ(
qPrintable("(" + m_crateFilterQuery.arg(searchTerm) +
") AND ((artist LIKE '%asdf%') OR (album_artist LIKE '%asdf%'))"),
qPrintable(pQuery->toSql()));
}

TEST_F(SearchQueryParserTest, CrateFilterWithCrateFilterAndNegation){
// User's search term
QString searchTermA = "testA";
QString searchTermB = "testB";

// Parse the user query
auto pQueryA(m_parser.parseQuery(QString("crate: %1 crate: %2").arg(searchTermA, searchTermB),
QStringList(), ""));

// locations for test tracks
const QString kTrackALocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-jpg.mp3");
const QString kTrackBLocationTest(QDir::currentPath() %
"/src/test/id3-test-data/cover-test-png.mp3");

// Create new crates and add them to the collection
Crate testCrateA;
testCrateA.setName(searchTermA);
CrateId testCrateAId;
collection()->insertCrate(testCrateA, &testCrateAId);
Crate testCrateB;
testCrateB.setName(searchTermB);
CrateId testCrateBId;
collection()->insertCrate(testCrateB, &testCrateBId);

// Add the tracks in the collection
TrackId trackAId = addTrackToCollection(kTrackALocationTest);
TrackPointer pTrackA(Track::newDummy(kTrackALocationTest, trackAId));
TrackId trackBId = addTrackToCollection(kTrackBLocationTest);
TrackPointer pTrackB(Track::newDummy(kTrackBLocationTest, trackBId));

// Add trackA and trackB to crate A
QList<TrackId> trackIdsA;
trackIdsA << trackAId << trackBId;
collection()->addCrateTracks(testCrateAId, trackIdsA);

// Add trackA to crate B
QList<TrackId> trackIdsB;
trackIdsB << trackAId;
collection()->addCrateTracks(testCrateBId, trackIdsB);

EXPECT_TRUE(pQueryA->match(pTrackA));
EXPECT_FALSE(pQueryA->match(pTrackB));

EXPECT_STREQ(
qPrintable("(" + m_crateFilterQuery.arg(searchTermA) +
") AND (" + m_crateFilterQuery.arg(searchTermB) + ")"),
qPrintable(pQueryA->toSql()));

// parse again to test negation
auto pQueryB(m_parser.parseQuery(QString("crate: %1 -crate: %2").arg(searchTermA, searchTermB),
QStringList(), ""));

EXPECT_FALSE(pQueryB->match(pTrackA));
EXPECT_TRUE(pQueryB->match(pTrackB));

EXPECT_STREQ(
qPrintable("(" + m_crateFilterQuery.arg(searchTermA) +
") AND (NOT (" + m_crateFilterQuery.arg(searchTermB) + "))"),
qPrintable(pQueryB->toSql()));
}