#include "apiUrl.hpp" #include "hearthstoneApi.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include TEST_CASE("Retrieve API Token", "[generateApiToken]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; Token aToken(kCredentialsFile); const std::string kTokenContent{aToken.text()}; const std::string::size_type kTokenSize{kTokenContent.size()}; REQUIRE(kTokenSize >= 30); REQUIRE(kTokenSize <= 40); } TEST_CASE("Retrieve number of cards", "[countCards]") { const std::string kCredentialsFile{}; const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); aApiUrl.setLocale("fr_FR"); aApiUrl.setGameMode("constructed"); aApiUrl.setPageSize("1"); TokenPool::feedTokenSource("tests/resources/credentials.json"); const json kResponse = HearthstoneApi::makeApiRequest( aApiUrl, TokenPool::availableToken().value().text()); REQUIRE(kResponse.size() > 0); REQUIRE(kResponse.contains("pageCount")); std::uint64_t kNumberOfCards{kResponse["pageCount"]}; std::uint64_t kExpectedNumberOfCards{6178}; REQUIRE(kNumberOfCards == kExpectedNumberOfCards); } TEST_CASE("Retrieve page once", "[retrievePageOnce]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; Token aToken(kCredentialsFile); const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); aApiUrl.setLocale("fr_FR"); aApiUrl.setGameMode("constructed"); aApiUrl.setPageSize("16"); TokenPool::feedTokenSource("tests/resources/credentials.json"); const json kApiResponse = HearthstoneApi::makeApiRequest( aApiUrl, TokenPool::availableToken().value().text()); REQUIRE(kApiResponse["cards"].size() == 16); } TEST_CASE("Retrieve pages 10 times without parallelization", "[retrievePagesNoParallel]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; Token aToken(kCredentialsFile); const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); aApiUrl.setLocale("fr_FR"); aApiUrl.setGameMode("constructed"); aApiUrl.setPageSize("16"); aApiUrl.setPage("1"); TokenPool::feedTokenSource("tests/resources/credentials.json"); std::string kTokenText{TokenPool::availableToken().value().text()}; json kApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, kTokenText); // Retrieve number of pages const int kNumberOfRetrievals{10}; const int kNumberOfPages{kApiResponse["pageCount"]}; REQUIRE(kNumberOfPages >= kNumberOfRetrievals); for (int i{1}; i < kNumberOfRetrievals; ++i) { REQUIRE(kApiResponse["cards"].size() == 16); aApiUrl.setPage(std::to_string(i + 1)); kApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, kTokenText); } REQUIRE(kApiResponse["cards"].size() >= 1); REQUIRE(kApiResponse["cards"].size() <= 16); } TEST_CASE("Retrieve pages 10 times with parallelization", "[retrievePagesParallel]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; Token aToken(kCredentialsFile); const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); aApiUrl.setLocale("fr_FR"); aApiUrl.setGameMode("constructed"); aApiUrl.setPageSize("16"); aApiUrl.setPage("1"); std::vector aRequests; TokenPool::feedTokenSource("tests/resources/credentials.json"); std::string kTokenText{TokenPool::availableToken().value().text()}; json kFirstPageJson = HearthstoneApi::makeApiRequest(aApiUrl, kTokenText); int kNumberOfPages{kFirstPageJson["pageCount"]}; const int kNumberOfRetrievals{10}; REQUIRE(kNumberOfPages >= kNumberOfRetrievals); for (int i{1}; i < kNumberOfRetrievals; ++i) { aApiUrl.setPage(std::to_string(i + 1)); aRequests.push_back(aApiUrl.text()); } std::vector kApiResponses = HearthstoneApi::makeApiRequest(aRequests, kTokenText); kApiResponses.emplace(kApiResponses.begin(), kFirstPageJson); REQUIRE(kApiResponses.size() == kNumberOfRetrievals); for (const json &kApiResponse : kApiResponses) { REQUIRE(kApiResponse["cards"].size() == 16); } } TEST_CASE("Merge two card lists from two page requests", "[Merge pages]") { std::ifstream aFirstPage{"tests/resources/page_merge_00.json"}; json kFirstPage = json::parse(aFirstPage); std::ifstream aSecondPage{"tests/resources/page_merge_01.json"}; const json kSecondPage = json::parse(aSecondPage); json::reference aMergedCards = kFirstPage["cards"]; for (auto &card : kSecondPage["cards"]) { aMergedCards.push_back(std::move(card)); } REQUIRE(aMergedCards.size() == 32); std::ofstream aOutputJson("build/output_pages_merge.json"); aOutputJson << aMergedCards.dump(4); } TEST_CASE("Retrieve a single page with HearthstoneApi::downloadCards", "[retrievePageOnceHearthstoneApi]") { const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); aApiUrl.setPage(3); TokenPool::feedTokenSource("tests/resources/credentials.json"); json kApiResponse = HearthstoneApi::makeApiRequest( aApiUrl, TokenPool::availableToken().value().text()); const json::size_type kExpectedNumberOfCards{kApiResponse["cards"].size()}; TokenPool::feedTokenSource("tests/resources/credentials.json"); kApiResponse = HearthstoneApi::downloadCards( aApiUrl, TokenPool::availableToken().value()); const json::size_type kCurrentNumberOfCards{kApiResponse["cards"].size()}; REQUIRE(kCurrentNumberOfCards == kExpectedNumberOfCards); }