add tests for time and state based rules

This commit is contained in:
Simon Stürz 2017-10-08 23:47:42 +02:00 committed by Michael Zanetti
parent 511b43828b
commit 497c710ae1
2 changed files with 175 additions and 5 deletions

View File

@ -109,15 +109,16 @@ QList<QByteArray> TimeManager::availableTimeZones() const
void TimeManager::stopTimer()
{
qWarning(dcTimeManager()) << "TimeManager timer stopped. You should only see this in tests.";
qCWarning(dcTimeManager()) << "TimeManager timer stopped. You should only see this in tests.";
// Stop clock (used for testing)
m_guhTimer->stop();
}
void TimeManager::setTime(const QDateTime &dateTime)
{
qWarning(dcTimeManager()) << "TimeManager time changed. You should only see this in tests.";
qCWarning(dcTimeManager()) << "TimeManager time changed. You should only see this in tests.";
// This method will only be called for testing to set the guhIO intern time
qCDebug(dcTimeManager()) << dateTime.toString("dd.MM.yyyy hh:mm:ss");
emit tick();
emit dateTimeChanged(dateTime);
}

View File

@ -69,6 +69,10 @@ private slots:
void testCalendarYearlyDateTime_data();
void testCalendarYearlyDateTime();
void testCalendarItemDailyStates_data();
void testCalendarItemDailyStates();
// TimeEventItems
void testEventItemDateTime_data();
void testEventItemDateTime();
@ -98,6 +102,11 @@ private:
void cleanupMockHistory();
void removeAllRules();
void setIntState(const int &value);
void setBoolState(const bool &value);
QVariantMap createTimeEventItem(const QString &time = QString(), const QVariantMap &repeatingOption = QVariantMap()) const;
QVariantMap createTimeEventItem(const int &dateTime, const QVariantMap &repeatingOption = QVariantMap()) const;
QVariantMap createTimeDescriptorTimeEvent(const QVariantMap &timeEventItem) const;
@ -1020,6 +1029,123 @@ void TestTimeManager::testCalendarYearlyDateTime()
verifyRuleError(response);
}
void TestTimeManager::testCalendarItemDailyStates_data()
{
initTimeManager();
// Repeating option
QVariantMap repeatingOptionDaily;
repeatingOptionDaily.insert("mode", "RepeatingModeDaily");
// Action
QVariantMap action;
action.insert("actionTypeId", mockActionIdNoParams);
action.insert("deviceId", m_mockDeviceId);
action.insert("ruleActionParams", QVariantList());
// Exit action (with params)
QVariantMap exitAction;
QVariantList actionParams;
QVariantMap param1;
param1.insert("paramTypeId", mockActionParam1ParamTypeId);
param1.insert("value", 12);
actionParams.append(param1);
QVariantMap param2;
param2.insert("paramTypeId", mockActionParam2ParamTypeId);
param2.insert("value", true);
actionParams.append(param2);
exitAction.insert("actionTypeId", mockActionIdWithParams);
exitAction.insert("deviceId", m_mockDeviceId);
exitAction.insert("ruleActionParams", actionParams);
// Stateevaluators
QVariantMap stateEvaluator;
QVariantMap stateDescriptorInt;
stateDescriptorInt.insert("deviceId", m_mockDeviceId);
stateDescriptorInt.insert("operator", JsonTypes::valueOperatorToString(Types::ValueOperatorGreaterOrEqual));
stateDescriptorInt.insert("stateTypeId", mockIntStateId);
stateDescriptorInt.insert("value", 65);
QVariantMap stateDescriptorBool;
stateDescriptorBool.insert("deviceId", m_mockDeviceId);
stateDescriptorBool.insert("operator", JsonTypes::valueOperatorToString(Types::ValueOperatorEquals));
stateDescriptorBool.insert("stateTypeId", mockBoolStateId);
stateDescriptorBool.insert("value", true);
QVariantMap stateEvaluatorInt;
stateEvaluatorInt.insert("stateDescriptor", stateDescriptorInt);
stateEvaluatorInt.insert("operator", JsonTypes::stateOperatorToString(Types::StateOperatorAnd));
QVariantMap stateEvaluatorBool;
stateEvaluatorBool.insert("stateDescriptor", stateDescriptorBool);
stateEvaluatorBool.insert("operator", JsonTypes::stateOperatorToString(Types::StateOperatorAnd));
QVariantList childEvaluators;
childEvaluators.append(stateEvaluatorInt);
childEvaluators.append(stateEvaluatorBool);
stateEvaluator.insert("childEvaluators", childEvaluators);
stateEvaluator.insert("operator", JsonTypes::stateOperatorToString(Types::StateOperatorAnd));
// The rule
QVariantMap ruleMap;
ruleMap.insert("name", "Time and state based daily calendar rule");
ruleMap.insert("stateEvaluator", stateEvaluator);
ruleMap.insert("actions", QVariantList() << action);
ruleMap.insert("exitActions", QVariantList() << exitAction);
ruleMap.insert("timeDescriptor", createTimeDescriptorCalendar(createCalendarItem("08:00", 10, repeatingOptionDaily)));
GuhCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(07,59)));
QVariant response = injectAndWait("Rules.AddRule", ruleMap);
verifyRuleError(response);
QTest::addColumn<QDateTime>("dateTime");
QTest::addColumn<bool>("boolValue");
QTest::addColumn<int>("intValue");
QTest::addColumn<bool>("trigger");
QTest::addColumn<bool>("active");
QTest::newRow("07:59 | true - 66") << QDateTime(QDate::currentDate(), QTime(07,59)) << true << 66 << false << false;
QTest::newRow("08:00 | true - 66") << QDateTime(QDate::currentDate(), QTime(8,0)) << true << 66 << true << true;
QTest::newRow("08:01 | true - 66") << QDateTime(QDate::currentDate(), QTime(8,1)) << true << 66 << false << false;
QTest::newRow("08:02 | false - 66") << QDateTime(QDate::currentDate(), QTime(8,2)) << false << 66 << true << false;
QTest::newRow("08:03 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,3)) << true << 65 << true << true;
QTest::newRow("08:06 | true - 64") << QDateTime(QDate::currentDate(), QTime(8,6)) << true << 64 << true << false;
QTest::newRow("08:06 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,6)) << true << 65 << true << true;
QTest::newRow("08:09 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,9)) << true << 65 << false << false;
QTest::newRow("08:10 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,10)) << true << 65 << false << false;
QTest::newRow("08:11 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,11)) << true << 65 << false << false;
}
void TestTimeManager::testCalendarItemDailyStates()
{
QFETCH(QDateTime, dateTime);
QFETCH(bool, boolValue);
QFETCH(int, intValue);
QFETCH(bool, trigger);
QFETCH(bool, active);
GuhCore::instance()->timeManager()->setTime(dateTime);
setBoolState(boolValue);
setIntState(intValue);
// Actions
if (trigger && active) {
verifyRuleExecuted(mockActionIdNoParams);
cleanupMockHistory();
}
// Exit actions
if (trigger && !active) {
verifyRuleExecuted(mockActionIdWithParams);
cleanupMockHistory();
}
// Nothing triggert
if (!trigger) {
verifyRuleNotExecuted();
}
}
void TestTimeManager::testEventItemDateTime_data()
{
QTest::addColumn<QDateTime>("dateTime");
@ -1033,6 +1159,7 @@ void TestTimeManager::testEventItemDateTime()
{
QFETCH(QDateTime, dateTime);
removeAllRules();
initTimeManager();
// Action (without params)
@ -1051,15 +1178,16 @@ void TestTimeManager::testEventItemDateTime()
verifyRuleError(response);
RuleId ruleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString());
QDateTime oneMinuteBeforeEvent = dateTime.addSecs(-60);
// not triggering
GuhCore::instance()->timeManager()->setTime(oneMinuteBeforeEvent);
GuhCore::instance()->timeManager()->setTime(dateTime.addSecs(-120));
GuhCore::instance()->timeManager()->setTime(dateTime.addSecs(-60));
verifyRuleNotExecuted();
// trigger
GuhCore::instance()->timeManager()->setTime(dateTime);
verifyRuleExecuted(mockActionIdNoParams);
cleanupMockHistory();
// not triggering
GuhCore::instance()->timeManager()->setTime(dateTime.addSecs(60));
verifyRuleNotExecuted();
@ -1561,6 +1689,47 @@ void TestTimeManager::cleanupMockHistory() {
reply->deleteLater();
}
void TestTimeManager::removeAllRules()
{
qDebug() << "Remove all rules";
QVariant response = injectAndWait("Rules.GetRules");
QVariantList ruleDescriptions = response.toMap().value("params").toMap().value("ruleDescriptions").toList();
QVariantMap removeParams;
foreach (const QVariant &ruleDescription, ruleDescriptions) {
removeParams.insert("ruleId", ruleDescription.toMap().value("id"));
response = injectAndWait("Rules.RemoveRule", removeParams);
verifyRuleError(response);
}
}
void TestTimeManager::setIntState(const int &value)
{
qDebug() << "Setting mock int state to" << value;
QNetworkAccessManager nam;
QSignalSpy spy(&nam, SIGNAL(finished(QNetworkReply*)));
spy.clear();
QNetworkRequest request(QUrl(QString("http://localhost:%1/setstate?%2=%3").arg(m_mockDevice1Port).arg(mockIntStateId.toString()).arg(value)));
QNetworkReply *reply = nam.get(request);
spy.wait();
QCOMPARE(spy.count(), 1);
reply->deleteLater();
}
void TestTimeManager::setBoolState(const bool &value)
{
qDebug() << "Setting mock bool state to" << value;
QNetworkAccessManager nam;
QSignalSpy spy(&nam, SIGNAL(finished(QNetworkReply*)));
spy.clear();
QNetworkRequest request(QUrl(QString("http://localhost:%1/setstate?%2=%3").arg(m_mockDevice1Port).arg(mockBoolStateId.toString()).arg(value)));
QNetworkReply *reply = nam.get(request);
spy.wait();
QCOMPARE(spy.count(), 1);
reply->deleteLater();
}
QVariantMap TestTimeManager::createTimeEventItem(const QString &time, const QVariantMap &repeatingOption) const
{
QVariantMap calendarItem;