1+ #include < gmock/gmock.h>
2+ #include < rest/controller/PricePlanComparatorController.h>
3+ #include < rest/configuration.h>
4+ #include < string>
5+
6+ #include < boost/beast/http.hpp>
7+ #include < nlohmann/json.hpp>
8+
9+ using nlohmann::json;
10+ using ::testing::Eq;
11+
12+ class PricePlanComparatorControllerTest : public ::testing::Test {
13+ protected:
14+ std::unordered_map<std::string, std::vector<ElectricityReading>> meterAssociatedReadings;
15+ MeterReadingService meterReadingService{meterAssociatedReadings};
16+ std::vector<PricePlan> price_plans = pricePlans();
17+ PricePlanService pricePlanService{price_plans, meterReadingService};
18+ PricePlanComparatorController controller{pricePlanService};
19+ };
20+
21+ TEST_F (PricePlanComparatorControllerTest, CompareShouldCalculateCostForMeterReadingsForEveryPricePlan) {
22+ const std::string smart_meter_id = " smart-meter-0" ;
23+ std::vector<ElectricityReading> readings = {
24+ {std::chrono::system_clock::now () - std::chrono::seconds (3600 ), 15 * 10000 },
25+ {std::chrono::system_clock::now (), 5 * 10000 }
26+ };
27+ meterReadingService.storeReadings (smart_meter_id, readings);
28+ http::request<http::string_body> req;
29+ std::vector<std::string> queries = {smart_meter_id};
30+
31+ auto response = controller.Compare (req, queries);
32+
33+ auto body = json::parse (response.body ());
34+ EXPECT_THAT (body[" pricePlanId" ], Eq (" price-plan-0" ));
35+ EXPECT_THAT (body[" pricePlanComparisons" ][" price-plan-0" ], Eq (100 ));
36+ EXPECT_THAT (body[" pricePlanComparisons" ][" price-plan-1" ], Eq (20 ));
37+ EXPECT_THAT (body[" pricePlanComparisons" ][" price-plan-2" ], Eq (10 ));
38+ }
39+
40+ TEST_F (PricePlanComparatorControllerTest, RecommandShouldRecommandCheapestPricePlansNoLimitForMeterUsage) {
41+ const std::string smart_meter_id = " smart-meter-0" ;
42+ std::vector<ElectricityReading> readings = {
43+ {std::chrono::system_clock::now () - std::chrono::seconds (1800 ), 35 * 10000 },
44+ {std::chrono::system_clock::now (), 3 * 10000 }
45+ };
46+ meterReadingService.storeReadings (smart_meter_id, readings);
47+ http::request<http::string_body> req;
48+ std::vector<std::string> queries = {smart_meter_id};
49+
50+ auto response = controller.Recommend (req, queries);
51+
52+ auto body = json::parse (response.body ());
53+ auto recommend = body[" recommend" ];
54+ EXPECT_THAT (recommend.size (), Eq (3 ));
55+ EXPECT_THAT (body[" recommend" ][0 ][" price-plan-2" ], Eq (38 ));
56+ EXPECT_THAT (body[" recommend" ][1 ][" price-plan-1" ], Eq (76 ));
57+ EXPECT_THAT (body[" recommend" ][2 ][" price-plan-0" ], Eq (380 ));
58+ }
59+
60+ TEST_F (PricePlanComparatorControllerTest, RecommandShouldRecommendLimitedCheapestPricePlansForMeterUsage) {
61+ const std::string smart_meter_id = " smart-meter-0" ;
62+ std::vector<ElectricityReading> readings = {
63+ {std::chrono::system_clock::now () - std::chrono::seconds (2700 ), 5 * 10000 },
64+ {std::chrono::system_clock::now (), 20 * 10000 }
65+ };
66+ meterReadingService.storeReadings (smart_meter_id, readings);
67+ http::request<http::string_body> req;
68+ std::vector<std::string> queries = {smart_meter_id, " limit" , " 2" };
69+
70+ auto response = controller.Recommend (req, queries);
71+
72+ auto body = json::parse (response.body ());
73+ auto recommend = body[" recommend" ];
74+ EXPECT_THAT (recommend.size (), Eq (2 ));
75+ EXPECT_THAT (body[" recommend" ][0 ][" price-plan-2" ], Eq (16.6666 ));
76+ EXPECT_THAT (body[" recommend" ][1 ][" price-plan-1" ], Eq (33.3332 ));
77+ }
78+
79+ TEST_F (PricePlanComparatorControllerTest, RecommandShouldRecommendCheapestPricePlansMoreThanLimitAvailableForMeterUsage) {
80+ const std::string smart_meter_id = " smart-meter-0" ;
81+ std::vector<ElectricityReading> readings = {
82+ {std::chrono::system_clock::now () - std::chrono::seconds (3600 ), 25 * 10000 },
83+ {std::chrono::system_clock::now (), 3 * 10000 }
84+ };
85+ meterReadingService.storeReadings (smart_meter_id, readings);
86+ http::request<http::string_body> req;
87+ std::vector<std::string> queries = {smart_meter_id, " limit" , " 5" };
88+
89+ auto response = controller.Recommend (req, queries);
90+
91+ auto body = json::parse (response.body ());
92+ auto recommend = body[" recommend" ];
93+ EXPECT_THAT (recommend.size (), Eq (3 ));
94+ EXPECT_THAT (body[" recommend" ][0 ][" price-plan-2" ], Eq (14 ));
95+ EXPECT_THAT (body[" recommend" ][1 ][" price-plan-1" ], Eq (28 ));
96+ EXPECT_THAT (body[" recommend" ][2 ][" price-plan-0" ], Eq (140 ));
97+ }
98+ TEST_F (PricePlanComparatorControllerTest, CompareShouldReturnNotFoundGivenNoMatchingMeterId) {
99+ http::request<http::string_body> req;
100+ std::vector<std::string> queries = {" meter-id-not-exist" };
101+
102+ auto response = controller.Compare (req, queries);
103+
104+ EXPECT_THAT (response.result (), Eq (http::status::not_found));
105+ }
0 commit comments