From 4abc4f85187b26a593f581a965d223b6b3005082 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sat, 13 Mar 2021 00:54:06 +0400 Subject: [PATCH] Support for book category attribute in library.xml --- src/book.cpp | 3 +- test/book.cpp | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) diff --git a/src/book.cpp b/src/book.cpp index a2f349384..e8c4e0f47 100644 --- a/src/book.cpp +++ b/src/book.cpp @@ -127,7 +127,8 @@ void Book::updateFromXml(const pugi::xml_node& node, const std::string& baseDir) try { m_downloadId = ATTR("downloadId"); } catch(...) {} - m_category = getCategoryFromTags(); + const auto catattr = node.attribute("category"); + m_category = catattr.empty() ? getCategoryFromTags() : catattr.value(); } #undef ATTR diff --git a/test/book.cpp b/test/book.cpp index 3298ee953..261ac9c59 100644 --- a/test/book.cpp +++ b/test/book.cpp @@ -1,5 +1,6 @@ #include "gtest/gtest.h" #include "../include/book.h" +#include TEST(BookTest, updateTest) { @@ -31,3 +32,110 @@ TEST(BookTest, updateTest) EXPECT_EQ(newBook.getFavicon(), book.getFavicon()); EXPECT_EQ(newBook.getFaviconMimeType(), book.getFaviconMimeType()); } + +namespace +{ + +struct XMLDoc : pugi::xml_document +{ + explicit XMLDoc(const std::string& xml) + { + load_buffer(xml.c_str(), xml.size()); + } +}; + +} // unnamed namespace + +TEST(BookTest, updateFromXMLTest) +{ + const XMLDoc xml(R"( + + + )"); + + kiwix::Book book; + book.updateFromXml(xml.child("book"), "/data/zim"); + + EXPECT_EQ(book.getPath(), "/data/zim/zara.zim"); + EXPECT_EQ(book.getUrl(), "https://who.org/zara.zim"); + EXPECT_EQ(book.getTitle(), "Catch an infection in 24 hours"); + EXPECT_EQ(book.getDescription(), "Complete guide to contagious diseases"); + EXPECT_EQ(book.getTags(), "unittest;_category:medicine;_pictures:yes"); + EXPECT_EQ(book.getName(), "who_contagious_diseases_en"); + EXPECT_EQ(book.getCategory(), "medicine"); + EXPECT_EQ(book.getArticleCount(), 123456U); + EXPECT_EQ(book.getMediaCount(), 234567U); + EXPECT_EQ(book.getSize(), 345678U*1024U); +} + +TEST(BookTest, updateFromXMLCategoryHandlingTest) +{ + { + const XMLDoc xml(R"( + + + )"); + + kiwix::Book book; + book.updateFromXml(xml.child("book"), ""); + + EXPECT_EQ(book.getCategory(), "category_defined_via_tags_only"); + } + { + const XMLDoc xml(R"( + + + )"); + + kiwix::Book book; + book.updateFromXml(xml.child("book"), ""); + + EXPECT_EQ(book.getCategory(), "category_defined_via_attribute_only"); + } + { + const XMLDoc xml(R"( + + + )"); + + kiwix::Book book; + book.updateFromXml(xml.child("book"), ""); + + EXPECT_EQ(book.getCategory(), "category_attribute_overrides_tags"); + } + { + const XMLDoc xml(R"( + + + )"); + + kiwix::Book book; + book.updateFromXml(xml.child("book"), ""); + + EXPECT_EQ(book.getCategory(), "category_attribute_overrides_tags"); + } +}