mirror of
https://github.com/RetroAchievements/RAIntegration.git
synced 2026-10-12 02:09:25 +00:00
227 lines
9.5 KiB
C++
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
|