From ab280e7beef86d95335d0538fa1f6a6dfdd1125b Mon Sep 17 00:00:00 2001 From: Aotrix <9aotrix@protonmail.com> Date: Mon, 26 Jan 2026 23:31:02 +0100 Subject: added a test to count the number of cards --- battleNetApi/include/hearthstoneApi.hpp | 31 +++++-------------------------- battleNetApi/src/hearthstoneApi.cpp | 14 ++++++-------- battleNetApi/tests/tests.cpp | 32 +++++++++++++++++++------------- 3 files changed, 30 insertions(+), 47 deletions(-) (limited to 'battleNetApi') diff --git a/battleNetApi/include/hearthstoneApi.hpp b/battleNetApi/include/hearthstoneApi.hpp index c11acc7..72f5141 100644 --- a/battleNetApi/include/hearthstoneApi.hpp +++ b/battleNetApi/include/hearthstoneApi.hpp @@ -1,41 +1,20 @@ #pragma once #include "token.hpp" -#include -#include +#include #include +using json = nlohmann::json; + class HearthstoneApi { public: + HearthstoneApi(const Token &iToken); HearthstoneApi(Token &&iToken); - std::uint64_t numberOfCards(const std::string &iApiResponse) const; + json makeApiRequest(const std::string &iUrl) const; private: std::string authorizationHeader(); - std::string makeApiRequest(const std::string &iUrl) const; static size_t curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS); - /** - * @brief - * @param[in] iJsonContent The std::string which contains Json (Battle.net API response for instance) - * @param[in] iKeyValueRegex The regex used to retrieve value from (key, value) pair - * An example: "\"cardCount\":(\\d+)" - */ - template T valueInJson(const std::string &iJsonContent, const std::string &iKeyValueRegex) const { - const std::regex iRegex{iKeyValueRegex}; - std::smatch aMatches; - if (std::regex_search(iJsonContent, aMatches, iRegex)) { - const std::string kValueString{aMatches[1].str()}; - T aValue; - const auto kConversionStatus = - std::from_chars(kValueString.data(), kValueString.data() + kValueString.size(), aValue); - if (kConversionStatus.ec == std::errc{}) { - return aValue; - } - } - std::cerr << std::format("Unable to find value with regex: '{}'\n", iKeyValueRegex); - return 0; - } - Token mToken; std::string mAuthorizationHeader; // HearthstoneApi::HearthstoneApi(Token &&iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} +HearthstoneApi::HearthstoneApi(const Token &iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} -std::uint64_t HearthstoneApi::numberOfCards(const std::string &iApiResponse) const { - const std::string aCardCountRegex{"\"cardCount\":(\\d+)"}; - return valueInJson(iApiResponse, aCardCountRegex); -} std::string HearthstoneApi::authorizationHeader() { return std::format("Authorization: Bearer {}", mToken.text()); } size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS) { @@ -21,20 +18,21 @@ size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, si return kNewLength; } -std::string HearthstoneApi::makeApiRequest(const std::string &iUrl) const { +json HearthstoneApi::makeApiRequest(const std::string &iUrl) const { CURL *curl = curl_easy_init(); - std::string request_output; + std::string aRequestOutput; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, iUrl.c_str()); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallbackStringOutput); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &request_output); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &aRequestOutput); struct curl_slist *chunk = nullptr; chunk = curl_slist_append(chunk, mAuthorizationHeader.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); curl_easy_perform(curl); curl_easy_cleanup(curl); } - return request_output; + json aOutputJson = json::parse(aRequestOutput); + return aOutputJson; } diff --git a/battleNetApi/tests/tests.cpp b/battleNetApi/tests/tests.cpp index 550e2ca..611cf83 100644 --- a/battleNetApi/tests/tests.cpp +++ b/battleNetApi/tests/tests.cpp @@ -1,7 +1,8 @@ #include "apiUrl.hpp" #include "hearthstoneApi.hpp" #include -#include +#include +#include TEST_CASE("Retrieve API Token", "[generateApiToken]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; @@ -12,18 +13,23 @@ TEST_CASE("Retrieve API Token", "[generateApiToken]") { REQUIRE(kTokenSize <= 40); } -// TEST_CASE("Retrieve number of cards", "[getCardsCount]") { -// HearthstoneApiMock aHearthstoneApi; -// const std::string kContentType{"cards"}; -// const std::string kRegion{"eu"}; -// ApiUrl aApiUrl(kContentType, kRegion); -// aApiUrl.setLocale("fr_FR"); -// aApiUrl.setGameMode("constructed"); -// aApiUrl.setPageSize("1"); -// std::uint64_t kNumberOfCards{aHearthstoneApi.numberOfCards(aHearthstoneApi.makeApiRequest(aApiUrl()))}; -// REQUIRE(kNumberOfCards == 6033); -// } -// +TEST_CASE("Retrieve number of cards", "[getCardsCount]") { + const std::string kCredentialsFile{"tests/resources/credentials.json"}; + Token aToken(kCredentialsFile); + HearthstoneApi aHearthstoneApi(aToken); + const std::string kContentType{"cards"}; + const std::string kRegion{"eu"}; + ApiUrl aApiUrl(kContentType, kRegion); + aApiUrl.setLocale("fr_FR"); + aApiUrl.setGameMode("constructed"); + aApiUrl.setPageSize("1"); + const json kResponse{aHearthstoneApi.makeApiRequest(aApiUrl())}; + REQUIRE(kResponse.size() > 0); + REQUIRE(kResponse[0].contains("pageCount")); + std::uint64_t kNumberOfCards{kResponse[0]["pageCount"]}; + REQUIRE(kNumberOfCards == 6033); +} + // TEST_CASE("Retrieve cards", "[retrieveCards]") { // HearthstoneApiMock aHearthstoneApi; // const std::string kContentType{"cards"}; -- cgit v1.2.3