Files
RAIntegration/tests/ui/viewmodels/OverlayFriendsPageViewModel_Tests.cpp

227 lines
9.5 KiB
C++

#include "CppUnitTest.h"
#include "ui\viewmodels\OverlayFriendsPageViewModel.hh"
#include "tests\devkit\context\mocks\MockRcClient.hh"
#include "tests\devkit\context\mocks\MockUserContext.hh"
#include "tests\devkit\services\mocks\MockClock.hh"
#include "tests\devkit\services\mocks\MockThreadPool.hh"
#include "tests\devkit\ui\mocks\MockImageRepository.hh"
#include "tests\mocks\MockOverlayManager.hh"
#include "tests\mocks\MockServer.hh"
#include "tests\RA_UnitTestHelpers.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace ra {
namespace ui {
namespace viewmodels {
namespace tests {
TEST_CLASS(OverlayFriendsPageViewModel_Tests)
{
private:
class OverlayFriendsPageViewModelHarness : public OverlayFriendsPageViewModel
{
public:
ra::context::mocks::MockRcClient mockRcClient;
ra::context::mocks::MockUserContext mockUserContext;
ra::services::mocks::MockClock mockClock;
ra::services::mocks::MockThreadPool mockTheadPool;
ra::ui::mocks::MockImageRepository mockImageRepository;
ra::ui::viewmodels::mocks::MockOverlayManager mockOverlayManager;
ItemViewModel* GetItem(gsl::index nIndex) { return m_vItems.GetItemAt(nIndex); }
size_t GetItemCount() const noexcept { return m_vItems.Count(); }
void TestFetchItemDetail(gsl::index nIndex)
{
auto* pItem = GetItem(nIndex);
Expects(pItem != nullptr);
OverlayFriendsPageViewModel::FetchItemDetail(*pItem);
}
};
public:
TEST_METHOD(TestNavigationLabels)
{
OverlayFriendsPageViewModelHarness friendsPage;
Assert::AreEqual(L"", friendsPage.GetAcceptButtonText());
Assert::AreEqual(L"Close", friendsPage.GetCancelButtonText());
Assert::AreEqual(L"Leaderboards", friendsPage.GetPrevButtonText());
Assert::AreEqual(L"Recent Games", friendsPage.GetNextButtonText());
}
TEST_METHOD(TestRefreshNoFriends)
{
OverlayFriendsPageViewModelHarness friendsPage;
friendsPage.mockUserContext.Initialize("Username", "ApiToken");
friendsPage.mockRcClient.MockResponse(
"r=getfriendlist&u=Username&t=ApiToken",
"{\"Success\":true,\"Friends\":[]}"
);
friendsPage.Refresh();
Assert::AreEqual(std::wstring(L"Following"), friendsPage.GetTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetSubTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetTitleDetail());
friendsPage.mockTheadPool.ExecuteNextTask(); // fetch friends list is async
Assert::AreEqual(std::wstring(), friendsPage.GetSubTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetTitleDetail());
Assert::AreEqual({0U}, friendsPage.GetItemCount());
}
TEST_METHOD(TestRefreshSeveralFriends)
{
OverlayFriendsPageViewModelHarness friendsPage;
friendsPage.mockUserContext.Initialize("Username", "ApiToken");
friendsPage.mockRcClient.MockResponse(
"r=getfriendlist&u=Username&t=ApiToken",
"{\"Success\":true,\"Friends\":["
"{\"Friend\":\"User1\",\"AvatarUrl\":\"\",\"RAPoints\":20,\"LastSeen\":\"Activity1\"},"
"{\"Friend\":\"User2\",\"AvatarUrl\":\"\",\"RAPoints\":60,\"LastSeen\":\"Activity2\"},"
"{\"Friend\":\"User3\",\"AvatarUrl\":\"\",\"RAPoints\":40,\"LastSeen\":\"Activity3\"}"
"]}"
);
friendsPage.Refresh();
Assert::AreEqual(std::wstring(L"Following"), friendsPage.GetTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetSubTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetTitleDetail());
friendsPage.mockTheadPool.ExecuteNextTask(); // fetch friends list is async
Assert::AreEqual(std::wstring(), friendsPage.GetSubTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetTitleDetail());
const auto* pFriend1 = friendsPage.GetItem(0);
Assert::IsNotNull(pFriend1);
Ensures(pFriend1 != nullptr);
Assert::AreEqual(std::wstring(L"User1 (20)"), pFriend1->GetLabel());
Assert::AreEqual(std::wstring(L"Activity1"), pFriend1->GetDetail());
Assert::IsFalse(pFriend1->IsHeader());
const auto* pFriend2 = friendsPage.GetItem(1);
Assert::IsNotNull(pFriend2);
Ensures(pFriend2 != nullptr);
Assert::AreEqual(std::wstring(L"User2 (60)"), pFriend2->GetLabel());
Assert::AreEqual(std::wstring(L"Activity2"), pFriend2->GetDetail());
Assert::IsFalse(pFriend2->IsHeader());
const auto* pFriend3 = friendsPage.GetItem(2);
Assert::IsNotNull(pFriend3);
Ensures(pFriend3 != nullptr);
Assert::AreEqual(std::wstring(L"User3 (40)"), pFriend3->GetLabel());
Assert::AreEqual(std::wstring(L"Activity3"), pFriend3->GetDetail());
Assert::IsFalse(pFriend3->IsHeader());
}
TEST_METHOD(TestRefreshError)
{
OverlayFriendsPageViewModelHarness friendsPage;
friendsPage.mockUserContext.Initialize("Username", "ApiToken");
friendsPage.Refresh();
Assert::AreEqual(std::wstring(L"Following"), friendsPage.GetTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetSubTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetTitleDetail());
// process response asynchronously by sending it after Refresh()
friendsPage.mockRcClient.MockResponse(
"r=getfriendlist&u=Username&t=ApiToken",
"{\"Success\":false,\"Error\":\"Failed to find friends\",\"Code\":\"internal_error\"}"
);
Assert::AreEqual(std::wstring(L"Failed to find friends"), friendsPage.GetSubTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetTitleDetail());
Assert::AreEqual({0U}, friendsPage.GetItemCount());
}
TEST_METHOD(TestRefreshTimer)
{
OverlayFriendsPageViewModelHarness friendsPage;
friendsPage.mockUserContext.Initialize("Username", "ApiToken");
friendsPage.mockRcClient.MockResponse(
"r=getfriendlist&u=Username&t=ApiToken",
"{\"Success\":true,\"Friends\":["
"{\"Friend\":\"User1\",\"AvatarUrl\":\"\",\"RAPoints\":20,\"LastSeen\":\"Activity1\"},"
"{\"Friend\":\"User2\",\"AvatarUrl\":\"\",\"RAPoints\":60,\"LastSeen\":\"Activity2\"},"
"{\"Friend\":\"User3\",\"AvatarUrl\":\"\",\"RAPoints\":40,\"LastSeen\":\"Activity3\"}"
"]}"
);
friendsPage.Refresh();
Assert::AreEqual(std::wstring(L"Following"), friendsPage.GetTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetSubTitle());
Assert::AreEqual(std::wstring(), friendsPage.GetTitleDetail());
friendsPage.mockTheadPool.ExecuteNextTask(); // fetch friends list is async
Assert::AreEqual({ 3U }, friendsPage.GetItemCount());
// two friends updated, one added
friendsPage.mockRcClient.MockResponse(
"r=getfriendlist&u=Username&t=ApiToken",
"{\"Success\":true,\"Friends\":["
"{\"Friend\":\"User1\",\"AvatarUrl\":\"\",\"RAPoints\":30,\"LastSeen\":\"Activity1b\"},"
"{\"Friend\":\"User2\",\"AvatarUrl\":\"\",\"RAPoints\":60,\"LastSeen\":\"Activity2\"},"
"{\"Friend\":\"User3\",\"AvatarUrl\":\"\",\"RAPoints\":45,\"LastSeen\":\"Activity3b\"},"
"{\"Friend\":\"User4\",\"AvatarUrl\":\"\",\"RAPoints\":90,\"LastSeen\":\"Activity4\"}"
"]}"
);
friendsPage.Refresh();
friendsPage.mockTheadPool.ExecuteNextTask(); // fetch friends list is async
Assert::AreEqual({ 3U }, friendsPage.GetItemCount()); // refresh should not have occurred
friendsPage.mockClock.AdvanceTime(std::chrono::minutes(1));
friendsPage.Refresh();
friendsPage.mockTheadPool.ExecuteNextTask(); // fetch friends list is async
Assert::AreEqual({ 3U }, friendsPage.GetItemCount()); // refresh should not have occurred
friendsPage.mockClock.AdvanceTime(std::chrono::minutes(1));
friendsPage.Refresh();
friendsPage.mockTheadPool.ExecuteNextTask(); // fetch friends list is async
Assert::AreEqual({ 4U }, friendsPage.GetItemCount()); // refresh should have occurred
const auto* pFriend1 = friendsPage.GetItem(0);
Assert::IsNotNull(pFriend1);
Ensures(pFriend1 != nullptr);
Assert::AreEqual(std::wstring(L"User1 (30)"), pFriend1->GetLabel());
Assert::AreEqual(std::wstring(L"Activity1b"), pFriend1->GetDetail());
Assert::IsFalse(pFriend1->IsHeader());
const auto* pFriend2 = friendsPage.GetItem(1);
Assert::IsNotNull(pFriend2);
Ensures(pFriend2 != nullptr);
Assert::AreEqual(std::wstring(L"User2 (60)"), pFriend2->GetLabel());
Assert::AreEqual(std::wstring(L"Activity2"), pFriend2->GetDetail());
Assert::IsFalse(pFriend2->IsHeader());
const auto* pFriend3 = friendsPage.GetItem(2);
Assert::IsNotNull(pFriend3);
Ensures(pFriend3 != nullptr);
Assert::AreEqual(std::wstring(L"User3 (45)"), pFriend3->GetLabel());
Assert::AreEqual(std::wstring(L"Activity3b"), pFriend3->GetDetail());
Assert::IsFalse(pFriend3->IsHeader());
const auto* pFriend4 = friendsPage.GetItem(3);
Assert::IsNotNull(pFriend4);
Ensures(pFriend4 != nullptr);
Assert::AreEqual(std::wstring(L"User4 (90)"), pFriend4->GetLabel());
Assert::AreEqual(std::wstring(L"Activity4"), pFriend4->GetDetail());
Assert::IsFalse(pFriend4->IsHeader());
}
};
} // namespace tests
} // namespace viewmodels
} // namespace ui
} // namespace ra