mirror of https://github.com/kiwix/libkiwix.git
Testing of HTTP errors in XML format
This commit is contained in:
parent
bfcf317f09
commit
cc8ad9ebf2
|
@ -310,7 +310,7 @@ enum ExpectedResponseDataType
|
||||||
|
|
||||||
// Operator overloading is used as a means of defining a mini-DSL for
|
// Operator overloading is used as a means of defining a mini-DSL for
|
||||||
// defining test data in a concise way (see usage in
|
// defining test data in a concise way (see usage in
|
||||||
// TEST_F(ServerTest, 404WithBodyTesting))
|
// TEST_F(ServerTest, Http404HtmlError))
|
||||||
ExpectedResponseData operator==(ExpectedResponseDataType t, std::string s)
|
ExpectedResponseData operator==(ExpectedResponseDataType t, std::string s)
|
||||||
{
|
{
|
||||||
switch (t)
|
switch (t)
|
||||||
|
@ -545,7 +545,7 @@ std::string TestContentIn400HtmlResponse::pageTitle() const {
|
||||||
|
|
||||||
} // namespace TestingOfHtmlResponses
|
} // namespace TestingOfHtmlResponses
|
||||||
|
|
||||||
TEST_F(ServerTest, 404WithBodyTesting)
|
TEST_F(ServerTest, Http404HtmlError)
|
||||||
{
|
{
|
||||||
using namespace TestingOfHtmlResponses;
|
using namespace TestingOfHtmlResponses;
|
||||||
const std::vector<TestContentIn404HtmlResponse> testData{
|
const std::vector<TestContentIn404HtmlResponse> testData{
|
||||||
|
@ -735,7 +735,7 @@ TEST_F(ServerTest, 404WithBodyTesting)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ServerTest, 400WithBodyTesting)
|
TEST_F(ServerTest, Http400HtmlError)
|
||||||
{
|
{
|
||||||
using namespace TestingOfHtmlResponses;
|
using namespace TestingOfHtmlResponses;
|
||||||
const std::vector<TestContentIn400HtmlResponse> testData{
|
const std::vector<TestContentIn400HtmlResponse> testData{
|
||||||
|
@ -811,6 +811,85 @@ TEST_F(ServerTest, 400WithBodyTesting)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ServerTest, HttpXmlError)
|
||||||
|
{
|
||||||
|
struct TestData
|
||||||
|
{
|
||||||
|
std::string url;
|
||||||
|
int expectedStatusCode;
|
||||||
|
std::string expectedXml;
|
||||||
|
|
||||||
|
std::string fullExpectedXml() const
|
||||||
|
{
|
||||||
|
return R"(<?xml version="1.0" encoding="UTF-8">)" + expectedXml;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestContext ctx() const
|
||||||
|
{
|
||||||
|
return TestContext{ {"url", url} };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::vector<TestData> testData{
|
||||||
|
{ /* url */ "/ROOT/search?format=xml",
|
||||||
|
/* HTTP status code */ 400,
|
||||||
|
/* expected response XML */ R"(
|
||||||
|
<error>Invalid request</error>
|
||||||
|
<detail>The requested URL "/ROOT/search?format=xml" is not a valid request.</detail>
|
||||||
|
<detail>Too many books requested (4) where limit is 3</detail>
|
||||||
|
)" },
|
||||||
|
{ /* url */ "/ROOT/search?format=xml&content=zimfile",
|
||||||
|
/* HTTP status code */ 400,
|
||||||
|
/* expected response XML */ R"(
|
||||||
|
<error>Invalid request</error>
|
||||||
|
<detail>The requested URL "/ROOT/search?content=zimfile&format=xml" is not a valid request.</detail>
|
||||||
|
<detail>No query provided.</detail>
|
||||||
|
)" },
|
||||||
|
{ /* url */ "/ROOT/search?format=xml&content=non-existing-book&pattern=asdfqwerty",
|
||||||
|
/* HTTP status code */ 400,
|
||||||
|
/* expected response XML */ R"(
|
||||||
|
<error>Invalid request</error>
|
||||||
|
<detail>The requested URL "/ROOT/search?content=non-existing-book&format=xml&pattern=asdfqwerty" is not a valid request.</detail>
|
||||||
|
<detail>No such book: non-existing-book</detail>
|
||||||
|
)" },
|
||||||
|
{ /* url */ "/ROOT/search?format=xml&content=non-existing-book&pattern=a\"<script foo>",
|
||||||
|
/* HTTP status code */ 400,
|
||||||
|
/* expected response XML */ R"(
|
||||||
|
<error>Invalid request</error>
|
||||||
|
<detail>The requested URL "/ROOT/search?content=non-existing-book&format=xml&pattern=a"<script foo>" is not a valid request.</detail>
|
||||||
|
<detail>No such book: non-existing-book</detail>
|
||||||
|
)" },
|
||||||
|
// There is a flaw in our way to handle query string, we cannot differenciate
|
||||||
|
// between `pattern` and `pattern=`
|
||||||
|
{ /* url */ "/ROOT/search?format=xml&books.filter.lang=eng&pattern",
|
||||||
|
/* HTTP status code */ 400,
|
||||||
|
/* expected response XML */ R"(
|
||||||
|
<error>Invalid request</error>
|
||||||
|
<detail>The requested URL "/ROOT/search?books.filter.lang=eng&format=xml&pattern=" is not a valid request.</detail>
|
||||||
|
<detail>No query provided.</detail>
|
||||||
|
)" },
|
||||||
|
{ /* url */ "/ROOT/search?format=xml&pattern=foo",
|
||||||
|
/* HTTP status code */ 400,
|
||||||
|
/* expected response XML */ R"(
|
||||||
|
<error>Invalid request</error>
|
||||||
|
<detail>The requested URL "/ROOT/search?format=xml&pattern=foo" is not a valid request.</detail>
|
||||||
|
<detail>Too many books requested (4) where limit is 3</detail>
|
||||||
|
)" },
|
||||||
|
{ /* url */ "/ROOT/search?format=xml&content=poor&pattern=whatever",
|
||||||
|
/* HTTP status code */ 404,
|
||||||
|
/* expected response XML */ R"(
|
||||||
|
<error>Fulltext search unavailable</error>
|
||||||
|
<detail>The fulltext search engine is not available for this content.</detail>
|
||||||
|
)" },
|
||||||
|
};
|
||||||
|
|
||||||
|
for ( const auto& t : testData ) {
|
||||||
|
const auto r = zfs1_->GET(t.url.c_str());
|
||||||
|
EXPECT_EQ(r->status, t.expectedStatusCode) << t.ctx();
|
||||||
|
EXPECT_EQ(r->body, t.fullExpectedXml()) << t.ctx();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ServerTest, 500)
|
TEST_F(ServerTest, 500)
|
||||||
{
|
{
|
||||||
const std::string expectedBody = R"(<!DOCTYPE html>
|
const std::string expectedBody = R"(<!DOCTYPE html>
|
||||||
|
|
Loading…
Reference in New Issue