forked from opensensorhub/ConnectedSystemsAPI-CPP
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObservationsTest.cpp
More file actions
152 lines (128 loc) · 6.69 KB
/
Copy pathObservationsTest.cpp
File metadata and controls
152 lines (128 loc) · 6.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <string>
#include "pch.h"
#include "CppUnitTest.h"
#include "ConnectedSystemsAPI.h"
#include "TestHelper.h"
#include "DataModels/DataStream.h"
#include "DataModels/ObservationBuilder.h"
#include "DataModels/ObservationSchema.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace std::string_literals;
namespace CSAPItest {
TEST_CLASS(ObservationsTest)
{
TestHelper testHelper;
ConnectedSystemsAPI::DataModels::Data::DataBlockMixed createTestDataBlock(const std::string& dataStreamId) {
//Get the schema to know what kind of observation to create
auto schemaResponse = testHelper.csapi.getDataStreamsAPI().getObservationSchema(dataStreamId);
auto schema = schemaResponse.getItems().at(0).getResultSchema();
auto schemaDataRecord = dynamic_cast<const ConnectedSystemsAPI::DataModels::Component::DataRecord*>(schema);
// Create a data block according to the schema
ConnectedSystemsAPI::DataModels::Data::DataBlockMixed dataBlock = schemaDataRecord->createDataBlock();
return dataBlock;
}
ConnectedSystemsAPI::DataModels::Observation pushTestObservation(const std::string& dataStreamId, const ConnectedSystemsAPI::DataModels::Data::DataBlockMixed& dataBlock) {
auto now = ConnectedSystemsAPI::DataModels::TimeInstant(std::chrono::system_clock::now());
auto observation = ConnectedSystemsAPI::DataModels::ObservationBuilder()
.withResultTime(now)
.withResult(dataBlock)
.build();
testHelper.csapi.getObservationsAPI().createObservation(dataStreamId, observation);
return getTestObservation(dataStreamId);
}
ConnectedSystemsAPI::DataModels::Observation getTestObservation(const std::string& dataStreamId) {
auto observationsResponse = testHelper.csapi.getObservationsAPI().fetchObservationsOfDataStream(dataStreamId);
Assert::IsTrue(observationsResponse.isSuccessful());
Assert::IsFalse(observationsResponse.getItems().empty());
return observationsResponse.getItems().at(0);
}
TEST_METHOD_INITIALIZE(ClassInitialize) {
testHelper = TestHelper();
}
TEST_METHOD_CLEANUP(MethodCleanup) {
testHelper.cleanupTestSystem();
}
TEST_METHOD(GetObservations) {
auto response = testHelper.csapi.getObservationsAPI().fetchObservations();
Assert::IsTrue(response.isSuccessful());
}
TEST_METHOD(GetObservationsOfDataStream) {
auto dataStreamsResponse = testHelper.csapi.getDataStreamsAPI().getDataStreams();
std::string dataStreamId = dataStreamsResponse.getItems().at(0).getId().value_or("");
auto response = testHelper.csapi.getObservationsAPI().fetchObservationsOfDataStream(dataStreamId);
Assert::IsTrue(response.isSuccessful());
}
TEST_METHOD(CreateObservation) {
auto systemId = testHelper.createTestSystem();
auto dataStreamId = testHelper.createTestDataStream(systemId);
auto dataBlock = createTestDataBlock(dataStreamId);
dataBlock.setField("booleanField", ConnectedSystemsAPI::DataModels::Data::DataValue(true));
auto observation = pushTestObservation(dataStreamId, dataBlock);
//Verify the data stream id matches
Assert::AreEqual(dataStreamId, observation.getDataStreamId().value_or(""));
//Verify the result matches
const auto* resultValue = observation.getResult().getField("booleanField");
Assert::IsNotNull(resultValue);
Assert::IsTrue(std::holds_alternative<bool>(resultValue->value));
}
TEST_METHOD(CreateObservation2) {
// Same as above, but instead of creating a new datastream, use an existing one
auto dataStreamsResponse = testHelper.csapi.getDataStreamsAPI().getDataStreams();
std::string dataStreamId = dataStreamsResponse.getItems().at(0).getId().value_or("");
assert(!dataStreamId.empty());
//Get the schema to know what kind of observation to create
auto schemaResponse = testHelper.csapi.getDataStreamsAPI().getObservationSchema(dataStreamId);
Assert::IsTrue(schemaResponse.isSuccessful());
auto schema = schemaResponse.getItems().at(0).getResultSchema();
auto schemaDataRecord = dynamic_cast<const ConnectedSystemsAPI::DataModels::Component::DataRecord*>(schema);
Assert::IsNotNull(schemaDataRecord);
// Create a data block according to the schema
auto dataBlock = schemaDataRecord->createDataBlock();
if (dataBlock.hasField("data")) {
// This field exists in the default datastream created by the OSH node example project
dataBlock.setField("data", ConnectedSystemsAPI::DataModels::Data::DataValue("Test string data"));
}
else {
Assert::Fail(L"Schema does not have 'data' field");
}
auto now = ConnectedSystemsAPI::DataModels::TimeInstant(std::chrono::system_clock::now());
// Then create an observation for that datastream
auto observation = ConnectedSystemsAPI::DataModels::ObservationBuilder()
.withResultTime(now)
.withResult(dataBlock)
.build();
auto observationCreateResponse = testHelper.csapi.getObservationsAPI().createObservation(dataStreamId, observation);
Assert::IsTrue(observationCreateResponse.isSuccessful());
// Get the observations to verify
auto observationsResponse = testHelper.csapi.getObservationsAPI().fetchObservationsOfDataStream(dataStreamId);
Assert::IsTrue(observationsResponse.isSuccessful());
Assert::IsFalse(observationsResponse.getItems().empty());
Assert::AreEqual(dataStreamId, observationsResponse.getItems().at(0).getDataStreamId().value_or(""));
//Verify the result matches
const auto* resultValue = observationsResponse.getItems().at(0).getResult().getField("data");
Assert::IsNotNull(resultValue);
Assert::IsTrue(std::holds_alternative<std::string>(resultValue->value));
}
TEST_METHOD(GetObservationById) {
auto systemId = testHelper.createTestSystem();
auto dataStreamId = testHelper.createTestDataStream(systemId);
auto dataBlock = createTestDataBlock(dataStreamId);
auto observation = pushTestObservation(dataStreamId, dataBlock);
auto observationId = observation.getId().value_or("");
auto getResponse = testHelper.csapi.getObservationsAPI().fetchObservationById(observationId);
Assert::IsTrue(getResponse.isSuccessful());
Assert::AreEqual(observationId, getResponse.getItems().at(0).getId().value_or(""));
}
TEST_METHOD(DeleteObservation) {
auto systemId = testHelper.createTestSystem();
auto dataStreamId = testHelper.createTestDataStream(systemId);
auto dataBlock = createTestDataBlock(dataStreamId);
auto observation = pushTestObservation(dataStreamId, dataBlock);
auto observationId = observation.getId().value_or("");
auto deleteResponse = testHelper.csapi.getObservationsAPI().deleteObservation(observationId);
Assert::IsTrue(deleteResponse.isSuccessful());
auto getResponse = testHelper.csapi.getObservationsAPI().fetchObservationById(observationId);
Assert::IsFalse(getResponse.isSuccessful());
}
};
}