Commit 9db7c1abe2e9d7d51fd22cc1f73a8892492592b0
Committed by
Moritz Wirger
1 parent
505a0e05
Add toScheduleCommand to StateTransaction.
Showing
5 changed files
with
45 additions
and
9 deletions
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) && |
| 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) | ... | ... |