294 lines
9.5 KiB
C++
294 lines
9.5 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
// (c) Copyright, Ubisoft Entertainment Inc. || Created by Harbour //
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
#include "tests/config.h"
|
|
#include "tests/common/testJsonHelper.h"
|
|
#include "tests/fixture/memoryCheckFixture.h"
|
|
#include <ubiservices/core/JSON/json.h>
|
|
#include <ubiservices/core/JSON/jsonWriter.h>
|
|
#include <ubiservices/core/types/dateTimeHelper.h>
|
|
#include <ubiservices/services/news/newsInfo.h>
|
|
|
|
namespace US_NS {;
|
|
US_DEFINE_TEST(TestNewsInfo);
|
|
|
|
#if !defined(US_DLL)
|
|
|
|
namespace NewsInfoPrivate
|
|
{
|
|
bool extractData(const Json& source, NewsInfo& target);
|
|
}
|
|
|
|
typedef LeakCheckerNoScheduler UNIT_NEWSINFO;
|
|
|
|
namespace TestNewsInfo_BF
|
|
{
|
|
const char* const PROFILE_ID = "aaaa1111-bbbb-2222-cccc-3333dddd4444";
|
|
const char* const SPACE_ID = "11112222-3333-4444-5555-666677778888";
|
|
const char* const NEWS_ID = "aaaabbbbcccc-dddd-eeee-ffff-123456781234";
|
|
const char* const TYPE = "myNewsType";
|
|
const char* const PLACEMENT = "myNewsPlacement";
|
|
const char* const PUBLICATION_DATE = "2014-11-11T12:00:00";
|
|
const char* const LOCALE = "en-us";
|
|
const char* const TITLE = "myNewsTitle";
|
|
const char* const BODY = "myNewsBody";
|
|
const char* const MEDIA_URL = "http://myNewsUrl.com";
|
|
const char* const MEDIA_TYPE = "myNewsMediaType";
|
|
const char* const SUMMARY = "myDummySummary";
|
|
const char* const TAG_SWORD = "sword";
|
|
const char* const TAG_MEDIEVAL = "medieval";
|
|
|
|
const uint32 PRIORITY = 123;
|
|
const uint32 DISPLAY_TIME = 60;
|
|
|
|
const uint8 LINK_SIZE = 2u;
|
|
const uint8 TAG_SIZE = 2u;
|
|
|
|
Json getNewsInfo(bool missingField = false, bool extraField = false)
|
|
{
|
|
JsonWriter writer;
|
|
if (!missingField)
|
|
{
|
|
writer["profileId"] = PROFILE_ID; // <<<<<< missing field
|
|
}
|
|
writer["spaceId"] = SPACE_ID;
|
|
writer["newsId"] = NEWS_ID; // This is not a GUID
|
|
writer["type"] = TYPE;
|
|
writer["placement"] = PLACEMENT;
|
|
writer["priority"] = PRIORITY;
|
|
writer["displayTime"] = DISPLAY_TIME;
|
|
writer["publicationDate"] = PUBLICATION_DATE;
|
|
writer["locale"] = LOCALE;
|
|
writer["title"] = TITLE;
|
|
writer["body"] = BODY;
|
|
writer["mediaURL"] = MEDIA_URL;
|
|
writer["mediaType"] = MEDIA_TYPE;
|
|
{
|
|
Vector<Json> links;
|
|
links.reserve(2);
|
|
for(uint32 i = 0; i < 2; ++i)
|
|
{
|
|
JsonWriter link;
|
|
link["type"] = String::formatText("myLinkType%d", i);
|
|
link["param"] = String::formatText("myLinkParam%d", i);
|
|
link["actionName"] = String::formatText("myLinkActionName%d", i);
|
|
link["actionDescription"] = String::formatText("myLinkActionName%d", i);
|
|
links.push_back(link.getJson());
|
|
}
|
|
writer["links"] = links;
|
|
}
|
|
{
|
|
JsonWriter obj;
|
|
obj["field"] = "value";
|
|
writer["obj"] = obj.getJson();
|
|
}
|
|
|
|
if (extraField)
|
|
{
|
|
writer["field"] = "value";
|
|
}
|
|
writer["summary"] = SUMMARY;
|
|
JsonWriter tagsWriter(JsonWriterType::Array);
|
|
{
|
|
tagsWriter.addItemToArray(TAG_SWORD);
|
|
tagsWriter.addItemToArray(TAG_MEDIEVAL);
|
|
}
|
|
writer["tags"] = tagsWriter.getJson();
|
|
|
|
return writer.getJson();
|
|
}
|
|
|
|
void checkNewsInfoValid(const NewsInfo& news)
|
|
{
|
|
EXPECT_EQ(ProfileId(PROFILE_ID), news.m_profileId);
|
|
EXPECT_EQ(SpaceId(SPACE_ID), news.m_spaceId);
|
|
EXPECT_EQ(NewsId(NEWS_ID), news.m_id);
|
|
|
|
EXPECT_STREQ(TYPE, news.m_type.getUtf8());
|
|
EXPECT_STREQ(PLACEMENT, news.m_placement.getUtf8());
|
|
EXPECT_EQ(PRIORITY, news.m_priority);
|
|
EXPECT_EQ(DISPLAY_TIME, news.m_displayTime);
|
|
EXPECT_EQ(DateTimeHelper::parseDateISO8601(PUBLICATION_DATE), news.m_publicationDate);
|
|
|
|
EXPECT_STREQ(LOCALE, news.m_locale.getUtf8());
|
|
EXPECT_STREQ(TITLE, news.m_title.getUtf8());
|
|
EXPECT_STREQ(BODY, news.m_body.getUtf8());
|
|
EXPECT_STREQ(MEDIA_URL, news.m_mediaUrl.getUtf8());
|
|
EXPECT_STREQ(MEDIA_TYPE, news.m_mediaType.getUtf8());
|
|
|
|
EXPECT_EQ(LINK_SIZE, news.m_links.size());
|
|
EXPECT_FALSE(news.m_object.isEmpty());
|
|
|
|
ASSERT_TRUE(news.m_summary.isSpecified());
|
|
EXPECT_STREQ(SUMMARY, news.m_summary.value().getUtf8());
|
|
|
|
ASSERT_EQ(TAG_SIZE, news.m_tags.size());
|
|
EXPECT_STREQ(TAG_SWORD, news.m_tags[0].getUtf8());
|
|
EXPECT_STREQ(TAG_MEDIEVAL, news.m_tags[1].getUtf8());
|
|
}
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_ParsingJSON)
|
|
{
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
|
|
SAVE_ALLOC_COUNT(count1);
|
|
const Json jsonValid = TestNewsInfo_BF::getNewsInfo();
|
|
const Json jsonMissing = TestNewsInfo_BF::getNewsInfo(true, false);
|
|
const Json jsonExtra = TestNewsInfo_BF::getNewsInfo(false, true);
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(168u, 168, count1);
|
|
|
|
NewsInfo dummy;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(jsonValid, dummy)) << "Parsing Valid JSON";
|
|
TestNewsInfo_BF::checkNewsInfoValid(dummy);
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(82u, 82, count1);
|
|
|
|
EXPECT_FALSE(NewsInfoPrivate::extractData(jsonMissing, dummy)) << "Parsing JSON with missing field";
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(46u, 46, count1);
|
|
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(jsonExtra, dummy)) << "Parsing JSON with extra field";
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(408u, 408, testCount);
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NullProfileId)
|
|
{
|
|
const Json jsonNews(TestNewsInfo_BF::getNewsInfo(true, false));
|
|
|
|
JsonWriter writer(jsonNews);
|
|
writer["profileId"].setToNull();
|
|
|
|
NewsInfo dummy;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(jsonNews, dummy));
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_InvalidFormat)
|
|
{
|
|
const String jsonText = TestNewsInfo_BF::getNewsInfo().renderContent().replace(",", "");
|
|
|
|
NewsInfo dummy;
|
|
EXPECT_FALSE(NewsInfoPrivate::extractData(Json(jsonText), dummy));
|
|
}
|
|
|
|
/// summary field
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NewsInfoFieldSummaryInvalid)
|
|
{
|
|
const Json jsonData(TestNewsInfo_BF::getNewsInfo());
|
|
rapidjson::Document document;
|
|
|
|
document.Parse(jsonData.renderContent().getUtf8());
|
|
document["summary"].SetInt(5); // invalid value
|
|
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
const Json testJson(TestJsonHelper::getJson(document));
|
|
|
|
NewsInfo news;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(testJson, news));
|
|
EXPECT_FALSE(news.m_summary.isSpecified());
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(1u, 1u, testCount);
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NewsInfoFieldSummaryNull)
|
|
{
|
|
const Json jsonData(TestNewsInfo_BF::getNewsInfo());
|
|
rapidjson::Document document;
|
|
|
|
document.Parse(jsonData.renderContent().getUtf8());
|
|
document["summary"].SetNull();
|
|
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
const Json testJson(TestJsonHelper::getJson(document));
|
|
|
|
NewsInfo news;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(testJson, news));
|
|
EXPECT_FALSE(news.m_summary.isSpecified());
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(1u, 1u, testCount);
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NewsInfoFieldSummaryEmpty)
|
|
{
|
|
const Json jsonData(TestNewsInfo_BF::getNewsInfo());
|
|
rapidjson::Document document;
|
|
|
|
document.Parse(jsonData.renderContent().getUtf8());
|
|
document["summary"].SetString("");
|
|
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
const Json testJson(TestJsonHelper::getJson(document));
|
|
|
|
NewsInfo news;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(testJson, news));
|
|
EXPECT_TRUE(news.m_summary.isSpecified());
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(1u, 1u, testCount);
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NewsInfoFieldSummaryMissing)
|
|
{
|
|
const Json jsonData(TestNewsInfo_BF::getNewsInfo());
|
|
rapidjson::Document document;
|
|
|
|
document.Parse(jsonData.renderContent().getUtf8());
|
|
document.RemoveMember("summary");
|
|
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
const Json testJson(TestJsonHelper::getJson(document));
|
|
|
|
NewsInfo news;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(testJson, news));
|
|
EXPECT_FALSE(news.m_summary.isSpecified());
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(1u, 1u, testCount);
|
|
}
|
|
|
|
/// tags field
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NewsInfoFieldTagsInvalid)
|
|
{
|
|
const Json jsonData(TestNewsInfo_BF::getNewsInfo());
|
|
rapidjson::Document document;
|
|
|
|
document.Parse(jsonData.renderContent().getUtf8());
|
|
document["tags"].SetInt(5); // invalid value
|
|
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
const Json testJson(TestJsonHelper::getJson(document));
|
|
|
|
NewsInfo news;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(testJson, news));
|
|
EXPECT_EQ(0u, news.m_tags.size());
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(1u, 1u, testCount);
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NewsInfoFieldTagsNull)
|
|
{
|
|
const Json jsonData(TestNewsInfo_BF::getNewsInfo());
|
|
rapidjson::Document document;
|
|
|
|
document.Parse(jsonData.renderContent().getUtf8());
|
|
document["tags"].SetNull();
|
|
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
const Json testJson(TestJsonHelper::getJson(document));
|
|
|
|
NewsInfo news;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(testJson, news));
|
|
EXPECT_EQ(0u, news.m_tags.size());
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(1u, 1u, testCount);
|
|
}
|
|
|
|
TEST_F(UNIT_NEWSINFO, LOCAL_NewsInfoFieldTagsMissing)
|
|
{
|
|
const Json jsonData(TestNewsInfo_BF::getNewsInfo());
|
|
rapidjson::Document document;
|
|
|
|
document.Parse(jsonData.renderContent().getUtf8());
|
|
document.RemoveMember("tags");
|
|
|
|
SAVE_ALLOC_COUNT(testCount);
|
|
const Json testJson(TestJsonHelper::getJson(document));
|
|
|
|
NewsInfo news;
|
|
EXPECT_TRUE(NewsInfoPrivate::extractData(testJson, news));
|
|
EXPECT_EQ(0u, news.m_tags.size());
|
|
EXPECT_ALLOC_COUNT_PC_X1_EQ(1u, 1u, testCount);
|
|
}
|
|
#endif
|
|
|
|
};
|