Skip to content

Commit

Permalink
feat: forward tags to scenario request handler (#483)
Browse files Browse the repository at this point in the history
* feat!: Forward tags to scenario request handler

* check for optional before usage

* Add unit tests for forwarding tags

* Apply suggestions from code review

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Process review comments

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
  • Loading branch information
andjordan and github-actions[bot] authored Dec 1, 2023
1 parent 0c594d9 commit a66f711
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 10 deletions.
2 changes: 1 addition & 1 deletion infra/syntax/Json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ namespace infra
bool Error() const;

private:
infra::BoundedConstString objectString;
infra::BoundedConstString objectString{ "[]" };
bool error = false;
};

Expand Down
1 change: 1 addition & 0 deletions services/cucumber/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ target_link_libraries(services.cucumber PUBLIC
target_sources(services.cucumber PRIVATE
CucumberContext.cpp
CucumberContext.hpp
CucumberRequestHandlers.cpp
CucumberRequestHandlers.hpp
CucumberStep.cpp
CucumberStep.hpp
Expand Down
14 changes: 14 additions & 0 deletions services/cucumber/CucumberRequestHandlers.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include "services/cucumber/CucumberRequestHandlers.hpp"

namespace services
{
void CucumberScenarioRequestHandler::BeginScenario(infra::JsonArray&, const infra::Function<void()>& onDone)
{
onDone();
}

void CucumberScenarioRequestHandler::EndScenario(const infra::Function<void()>& onDone)
{
onDone();
};
}
12 changes: 4 additions & 8 deletions services/cucumber/CucumberRequestHandlers.hpp
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
#ifndef SERVICES_CUCUMBER_REQUEST_HANDLERS_HPP
#define SERVICES_CUCUMBER_REQUEST_HANDLERS_HPP

#include "infra/syntax/Json.hpp"
#include "infra/util/Function.hpp"

namespace services
{
class CucumberScenarioRequestHandler
{
public:
virtual void BeginScenario(const infra::Function<void()>& onDone)
{
onDone();
};
virtual ~CucumberScenarioRequestHandler() = default;

virtual void EndScenario(const infra::Function<void()>& onDone)
{
onDone();
};
virtual void BeginScenario(infra::JsonArray& tags, const infra::Function<void()>& onDone);
virtual void EndScenario(const infra::Function<void()>& onDone);
};
}

Expand Down
5 changes: 4 additions & 1 deletion services/cucumber/CucumberWireProtocolController.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "services/cucumber/CucumberWireProtocolController.hpp"
#include "infra/syntax/Json.hpp"

namespace services
{
Expand Down Expand Up @@ -78,7 +79,9 @@ namespace services

void CucumberWireProtocolController::HandleBeginScenarioRequest(CucumberWireProtocolParser& parser)
{
scenarioRequestHandler.BeginScenario([this]()
auto tags = parser.scenarioTags ? parser.scenarioTags->GetOptionalArray("tags").ValueOrDefault() : infra::JsonArray();

scenarioRequestHandler.BeginScenario(tags, [this]()
{
connectionObserver.Subject().RequestSendStream(connectionObserver.Subject().MaxSendStreamSize());
});
Expand Down
1 change: 1 addition & 0 deletions services/cucumber/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ target_link_libraries(services.cucumber_test PUBLIC
)

target_sources(services.cucumber_test PRIVATE
TestCucumberWireProtocolController.cpp
TestCucumberWireProtocolParser.cpp
TestCucumberWireProtocolServer.cpp
)
67 changes: 67 additions & 0 deletions services/cucumber/test/TestCucumberWireProtocolController.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include "infra/timer/test_helper/ClockFixture.hpp"
#include "infra/util/BoundedString.hpp"
#include "services/cucumber/CucumberContext.hpp"
#include "services/cucumber/CucumberRequestHandlers.hpp"
#include "services/cucumber/CucumberWireProtocolController.hpp"
#include "services/cucumber/CucumberWireProtocolParser.hpp"
#include "services/network/test_doubles/ConnectionMock.hpp"
#include "gmock/gmock.h"
#include <algorithm>

namespace
{
class CucumberScenarioRequestHandlerMock
: public services::CucumberScenarioRequestHandler
{
public:
MOCK_METHOD(void, BeginScenario, (infra::JsonArray & tags, const infra::Function<void()>& onDone), (override));
MOCK_METHOD(void, EndScenario, (const infra::Function<void()>& onDone), (override));
};

class CucumberWireProtocolControllerTest
: public testing::Test
, public infra::ClockFixture
{
public:
void Request(infra::BoundedConstString request);
void RequestWithoutScenarioTags(infra::BoundedConstString request);

public:
services::CucumberContext context;
testing::StrictMock<services::ConnectionObserverMock> connectionObserver;
testing::StrictMock<CucumberScenarioRequestHandlerMock> scenarioRequestHandler;
services::CucumberWireProtocolController controller{ connectionObserver, scenarioRequestHandler };
services::CucumberWireProtocolParser parser;
};

void CucumberWireProtocolControllerTest::Request(infra::BoundedConstString request)
{
parser.ParseRequest(request);
controller.HandleRequest(parser);
}

void CucumberWireProtocolControllerTest::RequestWithoutScenarioTags(infra::BoundedConstString request)
{
parser.ParseRequest(request);
parser.scenarioTags = infra::none;
controller.HandleRequest(parser);
}
};

TEST_F(CucumberWireProtocolControllerTest, begin_scenario_with_uninitialized_tags_calls_with_empty_json_array)
{
EXPECT_CALL(scenarioRequestHandler, BeginScenario(testing::Eq(infra::JsonArray()), testing::_));
Request(R"(["begin_scenario"])");
}

TEST_F(CucumberWireProtocolControllerTest, begin_scenario_without_tags_calls_with_empty_json_array)
{
EXPECT_CALL(scenarioRequestHandler, BeginScenario(testing::Eq(infra::JsonArray()), testing::_));
RequestWithoutScenarioTags(R"(["begin_scenario"])");
}

TEST_F(CucumberWireProtocolControllerTest, begin_scenario_with_tags_forward_tags_as_json_array)
{
EXPECT_CALL(scenarioRequestHandler, BeginScenario(testing::Eq(infra::JsonArray(R"(["tag1","tag2"])")), testing::_));
Request(R"(["begin_scenario",{"tags":["tag1","tag2"]}])");
}

0 comments on commit a66f711

Please sign in to comment.