JD2022-TU1/main/extern/UbiServices/custom/testsUnit/services/testNewsInfo.cpp

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
};