summaryrefslogtreecommitdiff
path: root/battleNetApi
diff options
context:
space:
mode:
Diffstat (limited to 'battleNetApi')
-rw-r--r--battleNetApi/include/hearthstoneApi.hpp31
-rw-r--r--battleNetApi/src/hearthstoneApi.cpp14
-rw-r--r--battleNetApi/tests/tests.cpp32
3 files changed, 30 insertions, 47 deletions
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 <iostream>
-#include <regex>
+#include <nlohmann/json.hpp>
#include <string>
+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 <typename T> 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; //<! Bearer authorization string for OAuth 2.0 header
diff --git a/battleNetApi/src/hearthstoneApi.cpp b/battleNetApi/src/hearthstoneApi.cpp
index 026737a..945425f 100644
--- a/battleNetApi/src/hearthstoneApi.cpp
+++ b/battleNetApi/src/hearthstoneApi.cpp
@@ -3,11 +3,8 @@
#include <format>
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<std::uint64_t>(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 <catch2/catch_test_macros.hpp>
-#include <utility>
+#include <iostream>
+#include <nlohmann/json.hpp>
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"};