diff --git a/test/server.cpp b/test/server.cpp index 334f6079b..f90cdcae1 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -45,6 +45,18 @@ Headers invariantHeaders(Headers headers) return headers; } +// Output generated via mustache templates sometimes contains end-of-line +// whitespace. This complicates representing the expected output of a unit-test +// as C++ raw strings in editors that are configured to delete EOL whitespace. +// A workaround is to put special markers (//EOLWHITESPACEMARKER) at the end +// of such lines in the expected output string and remove them at runtime. +// This is exactly what this function is for. +std::string removeEOLWhitespaceMarkers(const std::string& s) +{ + const std::regex pattern("//EOLWHITESPACEMARKER"); + return std::regex_replace(s, pattern, ""); +} + class ZimFileServer { @@ -444,7 +456,7 @@ TEST_F(ServerTest, ETagOfUncompressibleContentIsNotAffectedByAcceptEncoding) // NOTE: The "Date" header (which should belong to that list as required // NOTE: by RFC 7232) is not included (since the result of this function // NOTE: will be used to check the equality of headers from the 200 and 304 -// NOTe: responses). +// NOTE: responses). Headers special304Headers(const httplib::Response& r) { Headers result; @@ -625,6 +637,85 @@ TEST_F(ServerTest, RangeHeaderIsCaseInsensitive) } } +TEST_F(ServerTest, suggestions) +{ + typedef std::pair UrlAndExpectedResponse; + const std::vector testData{ + { /* url: */ "/ROOT/suggest?content=zimfile&term=thing", +R"EXPECTEDRESPONSE([ + { + "value" : "Doing His Thing", + "label" : "Doing His <b>Thing</b>", + "kind" : "path" + , "path" : "A/Doing_His_Thing" + }, + { + "value" : "We Didn't See a Thing", + "label" : "We Didn't See a <b>Thing</b>", + "kind" : "path" + , "path" : "A/We_Didn't_See_a_Thing" + }, + { + "value" : "thing ", + "label" : "containing 'thing'...", + "kind" : "pattern" + //EOLWHITESPACEMARKER + } +] +)EXPECTEDRESPONSE" + }, + { /* url: */ "/ROOT/suggest?content=zimfile&term=movie", +R"EXPECTEDRESPONSE([ + { + "value" : "Ray (movie)", + "label" : "Ray (<b>movie</b>)", + "kind" : "path" + , "path" : "A/Ray_(movie)" + }, + { + "value" : "movie ", + "label" : "containing 'movie'...", + "kind" : "pattern" + //EOLWHITESPACEMARKER + } +] +)EXPECTEDRESPONSE" + }, + { /* url: */ "/ROOT/suggest?content=zimfile&term=abracadabra", +R"EXPECTEDRESPONSE([ + { + "value" : "abracadabra ", + "label" : "containing 'abracadabra'...", + "kind" : "pattern" + //EOLWHITESPACEMARKER + } +] +)EXPECTEDRESPONSE" + }, + { // Test handling of & (%26 when url-encoded) in the search string + /* url: */ "/ROOT/suggest?content=zimfile&term=A%26B", +R"EXPECTEDRESPONSE([ + { + "value" : "A&B ", + "label" : "containing 'A&B'...", + "kind" : "pattern" + //EOLWHITESPACEMARKER + } +] +)EXPECTEDRESPONSE" + }, + }; + + for ( const auto& urlAndExpectedResponse : testData ) { + const std::string url = urlAndExpectedResponse.first; + const std::string expectedResponse = urlAndExpectedResponse.second; + const TestContext ctx{ {"url", url} }; + const auto r = zfs1_->GET(url.c_str()); + EXPECT_EQ(r->status, 200) << ctx; + EXPECT_EQ(r->body, removeEOLWhitespaceMarkers(expectedResponse)) << ctx; + } +} + //////////////////////////////////////////////////////////////////////////////// // Testing of the library-related functionality of the server ////////////////////////////////////////////////////////////////////////////////