Commit 9db7c1abe2e9d7d51fd22cc1f73a8892492592b0

Authored by Jojo-1000
Committed by Moritz Wirger
1 parent 505a0e05

Add toScheduleCommand to StateTransaction.

include/hueplusplus/HueCommandAPI.h
... ... @@ -119,6 +119,9 @@ public:
119 119 //! \overload
120 120 nlohmann::json POSTRequest(const std::string& path, const nlohmann::json& request) const;
121 121  
  122 + //! \brief Combines path with api prefix and username
  123 + //! \returns "/api/<username>/<path>"
  124 + std::string combinedPath(const std::string& path) const;
122 125 private:
123 126 struct TimeoutData
124 127 {
... ... @@ -131,10 +134,6 @@ private:
131 134 //! \returns \ref response if there is no error
132 135 nlohmann::json HandleError(FileInfo fileInfo, const nlohmann::json& response) const;
133 136  
134   - //! \brief Combines path with api prefix and username
135   - //! \returns "/api/<username>/<path>"
136   - std::string CombinedPath(const std::string& path) const;
137   -
138 137 private:
139 138 std::string ip;
140 139 int port;
... ...
include/hueplusplus/StateTransaction.h
... ... @@ -26,6 +26,7 @@
26 26 #include <string>
27 27  
28 28 #include "HueCommandAPI.h"
  29 +#include "Schedule.h"
29 30  
30 31 #include "json/json.hpp"
31 32  
... ... @@ -64,6 +65,10 @@ public:
64 65 //! \throws nlohmann::json::parse_error when response could not be parsed
65 66 bool commit(bool trimRequest = true) &&;
66 67  
  68 + //! \brief Create a ScheduleCommand from the transaction
  69 + //! \returns A ScheduleCommand that can be used to execute this transaction on a Schedule.
  70 + ScheduleCommand toScheduleCommand() &&;
  71 +
67 72 //! \brief Turn light on or off.
68 73 //! \param on true for on, false for off
69 74 //! \returns This transaction for chaining calls
... ...
src/HueCommandAPI.cpp
... ... @@ -81,7 +81,7 @@ nlohmann::json HueCommandAPI::PUTRequest(
81 81 const std::string& path, const nlohmann::json& request, FileInfo fileInfo) const
82 82 {
83 83 return HandleError(std::move(fileInfo), RunWithTimeout(timeout, Config::instance().getBridgeRequestDelay(), [&]() {
84   - return httpHandler->PUTJson(CombinedPath(path), request, ip, port);
  84 + return httpHandler->PUTJson(combinedPath(path), request, ip, port);
85 85 }));
86 86 }
87 87  
... ... @@ -94,7 +94,7 @@ nlohmann::json HueCommandAPI::GETRequest(
94 94 const std::string& path, const nlohmann::json& request, FileInfo fileInfo) const
95 95 {
96 96 return HandleError(std::move(fileInfo), RunWithTimeout(timeout, Config::instance().getBridgeRequestDelay(), [&]() {
97   - return httpHandler->GETJson(CombinedPath(path), request, ip, port);
  97 + return httpHandler->GETJson(combinedPath(path), request, ip, port);
98 98 }));
99 99 }
100 100  
... ... @@ -107,7 +107,7 @@ nlohmann::json HueCommandAPI::DELETERequest(
107 107 const std::string& path, const nlohmann::json& request, FileInfo fileInfo) const
108 108 {
109 109 return HandleError(std::move(fileInfo), RunWithTimeout(timeout, Config::instance().getBridgeRequestDelay(), [&]() {
110   - return httpHandler->DELETEJson(CombinedPath(path), request, ip, port);
  110 + return httpHandler->DELETEJson(combinedPath(path), request, ip, port);
111 111 }));
112 112 }
113 113  
... ... @@ -120,7 +120,7 @@ nlohmann::json HueCommandAPI::POSTRequest(
120 120 const std::string& path, const nlohmann::json& request, FileInfo fileInfo) const
121 121 {
122 122 return HandleError(std::move(fileInfo), RunWithTimeout(timeout, Config::instance().getBridgeRequestDelay(), [&]() {
123   - return httpHandler->POSTJson(CombinedPath(path), request, ip, port);
  123 + return httpHandler->POSTJson(combinedPath(path), request, ip, port);
124 124 }));
125 125 }
126 126  
... ... @@ -143,7 +143,7 @@ nlohmann::json HueCommandAPI::HandleError(FileInfo fileInfo, const nlohmann::jso
143 143 return response;
144 144 }
145 145  
146   -std::string HueCommandAPI::CombinedPath(const std::string& path) const
  146 +std::string HueCommandAPI::combinedPath(const std::string& path) const
147 147 {
148 148 std::string result = "/api/";
149 149 result.append(username);
... ...
src/StateTransaction.cpp
... ... @@ -68,6 +68,12 @@ bool StateTransaction::commit(bool trimRequest) &amp;&amp;
68 68 return true;
69 69 }
70 70  
  71 +ScheduleCommand StateTransaction::toScheduleCommand() &&
  72 +{
  73 + nlohmann::json command {{"method", "PUT"}, {"address", commands.combinedPath(path)}, {"body", request}};
  74 + return ScheduleCommand(command);
  75 +}
  76 +
71 77 StateTransaction&& StateTransaction::setOn(bool on) &&
72 78 {
73 79 request["on"] = on;
... ...
test/test_StateTransaction.cpp
... ... @@ -49,6 +49,32 @@ TEST(StateTransaction, commit)
49 49 StateTransaction(commands, "/path", nlohmann::json::object()).setOn(false).setBrightness(100).commit());
50 50 Mock::VerifyAndClearExpectations(handler.get());
51 51 }
  52 + // Do not trim
  53 + {
  54 + const nlohmann::json request = {{"on", false}, {"bri", 100}};
  55 + const nlohmann::json state = {{"on", false}, {"bri", 100}};
  56 + nlohmann::json response = {{{"success", {{"/path/on", false}}}}, {{"success", {{"/path/bri", 100}}}}};
  57 + EXPECT_CALL(*handler, PUTJson(requestPath, request, getBridgeIp(), getBridgePort())).WillOnce(Return(response));
  58 + EXPECT_TRUE(StateTransaction(commands, "/path", state).setOn(false).setBrightness(100).commit(false));
  59 + Mock::VerifyAndClearExpectations(handler.get());
  60 + }
  61 +}
  62 +
  63 +TEST(StateTransaction, toScheduleCommand)
  64 +{
  65 + auto handler = std::make_shared<MockHttpHandler>();
  66 + HueCommandAPI commands(getBridgeIp(), getBridgePort(), getBridgeUsername(), handler);
  67 + const std::string requestPath = "/api/" + getBridgeUsername() + "/path";
  68 + nlohmann::json request = {{"on", false}, {"bri", 100}};
  69 +
  70 + ScheduleCommand command = StateTransaction(commands, "/path", nlohmann::json::object())
  71 + .setOn(false)
  72 + .setBrightness(100)
  73 + .toScheduleCommand();
  74 + Mock::VerifyAndClearExpectations(handler.get());
  75 + EXPECT_EQ(ScheduleCommand::Method::put, command.getMethod());
  76 + EXPECT_EQ(request, command.getBody());
  77 + EXPECT_EQ(requestPath, command.getAddress());
52 78 }
53 79  
54 80 TEST(StateTransaction, setOn)
... ...