summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2017-01-30 16:56:07 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2017-01-30 16:56:07 +0000
commit7ed9145c42d26dbad0b945085455e7a0174e6bcf (patch)
tree436d970f0632a9cf7db8a4fed20be9d8ac1523b8
parentAdd tests for atoms (diff)
downloadgentoobrowse-2.0.0_beta5.tar.bz2
gentoobrowse-2.0.0_beta5.tar.xz
gentoobrowse-2.0.0_beta5.zip
Add basic interceptor for handling NoRows from API service as 404gentoobrowse-2.0.0_beta5
-rw-r--r--gentoobrowse/src/base.cpp16
-rw-r--r--gentoobrowse/src/mash.ice1
-rw-r--r--gentoobrowse/src/test.cpp80
-rw-r--r--gentoobrowse/src/use.json3
4 files changed, 83 insertions, 17 deletions
diff --git a/gentoobrowse/src/base.cpp b/gentoobrowse/src/base.cpp
index 9656a1f..5ed5114 100644
--- a/gentoobrowse/src/base.cpp
+++ b/gentoobrowse/src/base.cpp
@@ -4,6 +4,8 @@
#include <icespider-routes-base.h>
#include <mash.h>
#include <algorithm>
+#include <core.h>
+#include <exceptions.h>
namespace GentooBrowse {
::Gentoo::UserPtr
@@ -61,7 +63,21 @@ namespace GentooBrowse {
return ids.find(package->packageid) == ids.end();
}), packages.end());
}
+
+ class SlicerNoRowsHandler : public IceSpider::ErrorHandler {
+ public:
+ IceSpider::ErrorHandlerResult
+ handleError(IceSpider::IHttpRequest *, const std::exception & ex) const
+ {
+ if (dynamic_cast<const Slicer::NoRowsReturned *>(&ex)) {
+ throw IceSpider::Http404_NotFound();
+ }
+ return IceSpider::ErrorHandlerResult_Unhandled;
+ }
+ };
}
+PLUGIN(GentooBrowse::SlicerNoRowsHandler, IceSpider::ErrorHandler);
+
#endif
diff --git a/gentoobrowse/src/mash.ice b/gentoobrowse/src/mash.ice
index 6440d80..ff3f5f9 100644
--- a/gentoobrowse/src/mash.ice
+++ b/gentoobrowse/src/mash.ice
@@ -99,6 +99,7 @@ module GentooBrowse {
Gentoo::Categories categories;
Gentoo::Uses usage;
Gentoo::Packages packages;
+ Gentoo::Use use;
};
["slicer:root:gentoo"]
diff --git a/gentoobrowse/src/test.cpp b/gentoobrowse/src/test.cpp
index 1841721..a3fff0e 100644
--- a/gentoobrowse/src/test.cpp
+++ b/gentoobrowse/src/test.cpp
@@ -20,21 +20,27 @@ class ChromiumRequest : public TestRequest {
TestRequest(c, m, p)
{
hdr["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.21 Safari/537.36";
- hdr["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
hdr["Accept-Encoding"] = "gzip, deflate, sdch";
hdr["Accept-Language"] = "en-GB,en;q=0.8";
}
- virtual void standardAssertions(const char * name)
+ virtual void standardAssertions(const char * name) = 0;
+};
+
+class ChromiumRequestHtml : public ChromiumRequest {
+ public:
+ ChromiumRequestHtml(const Core * c, HttpMethod m, const std::string & p) :
+ ChromiumRequest(c, m, p)
+ {
+ hdr["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
+ }
+
+ virtual void standardAssertions(const char * name) override
{
auto h = getResponseHeaders();
BOOST_REQUIRE_EQUAL(h["Status"], "200 OK");
BOOST_REQUIRE_EQUAL(h["Content-Type"], "text/html");
- validateHtml(name);
- }
- void validateHtml(const char * name)
- {
TidyDoc tdoc = tidyCreate();
TidyInputSource tis{ &output, &streamGet, &streamUnget, &streamEof };
BOOST_REQUIRE_EQUAL(1, tidyOptSetBool(tdoc, TidyIndentContent, yes));
@@ -48,6 +54,18 @@ class ChromiumRequest : public TestRequest {
}
};
+class ChromiumRequest404 : public ChromiumRequest {
+ public:
+ ChromiumRequest404(const Core * c, HttpMethod m, const std::string & p) :
+ ChromiumRequest(c, m, p) { }
+
+ virtual void standardAssertions(const char *) override
+ {
+ auto h = getResponseHeaders();
+ BOOST_REQUIRE_EQUAL(h["Status"], "404 Not found");
+ }
+};
+
class ChromiumRequestXml : public ChromiumRequest {
public:
ChromiumRequestXml(const Core * c, HttpMethod m, const std::string & p) :
@@ -99,70 +117,98 @@ BOOST_AUTO_TEST_CASE( endpointCount )
BOOST_AUTO_TEST_CASE( home )
{
- ChromiumRequest request(this, HttpMethod::GET, "/");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( news )
{
- ChromiumRequest request(this, HttpMethod::GET, "/news");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/news");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( news_ruby_20_removal )
{
- ChromiumRequest request(this, HttpMethod::GET, "/news/2016-12-06-ruby-20-removal");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/news/2016-12-06-ruby-20-removal");
+ process(&request);
+ request.standardAssertions(typeid(this).name());
+}
+
+BOOST_AUTO_TEST_CASE( news_404 )
+{
+ ChromiumRequest404 request(this, HttpMethod::GET, "/news/404");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( packages )
{
- ChromiumRequest request(this, HttpMethod::GET, "/packages");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/packages");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( packages_popular )
{
- ChromiumRequest request(this, HttpMethod::GET, "/packages/popular");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/packages/popular");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( packages_virtual )
{
- ChromiumRequest request(this, HttpMethod::GET, "/packages/virtual");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/packages/virtual");
+ process(&request);
+ request.standardAssertions(typeid(this).name());
+}
+
+BOOST_AUTO_TEST_CASE( packages_404 )
+{
+ ChromiumRequest404 request(this, HttpMethod::GET, "/packages/404");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( packages_virtual_cron )
{
- ChromiumRequest request(this, HttpMethod::GET, "/packages/virtual/cron");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/packages/virtual/cron");
+ process(&request);
+ request.standardAssertions(typeid(this).name());
+}
+
+BOOST_AUTO_TEST_CASE( packages_virtual_404 )
+{
+ ChromiumRequest404 request(this, HttpMethod::GET, "/packages/virtual/404");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( use )
{
- ChromiumRequest request(this, HttpMethod::GET, "/use");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/use");
process(&request);
request.standardAssertions(typeid(this).name());
}
BOOST_AUTO_TEST_CASE( use_gles )
{
- ChromiumRequest request(this, HttpMethod::GET, "/use/gles");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/use/gles");
+ process(&request);
+ request.standardAssertions(typeid(this).name());
+}
+
+BOOST_AUTO_TEST_CASE( use_404 )
+{
+ ChromiumRequest404 request(this, HttpMethod::GET, "/use/404");
process(&request);
request.standardAssertions(typeid(this).name());
}
-BOOST_AUTO_TEST_CASE( search_default )
+BOOST_AUTO_TEST_CASE( search_default )
{
- ChromiumRequest request(this, HttpMethod::GET, "/search");
+ ChromiumRequestHtml request(this, HttpMethod::GET, "/search");
request.qs["criteria"] = "default";
process(&request);
request.standardAssertions(typeid(this).name());
diff --git a/gentoobrowse/src/use.json b/gentoobrowse/src/use.json
index 63a9161..a0bd57d 100644
--- a/gentoobrowse/src/use.json
+++ b/gentoobrowse/src/use.json
@@ -36,6 +36,9 @@
"packages": {
"operation": "Gentoo.Portage.getUsePackages"
},
+ "use": {
+ "operation": "Gentoo.Portage.getUse"
+ },
"usage": {
"operation": "Gentoo.Portage.getUseUsage"
}