node-red-contrib-power-saver
Version:
A module for Node-RED that you can use to turn on and off a switch based on power prices
150 lines (141 loc) • 5.07 kB
JavaScript
const expect = require("chai").expect;
const cloneDeep = require("lodash.clonedeep");
const helper = require("node-red-node-test-helper");
const lowestPrice = require("../src/strategy-lowest-price.js");
const prices = require("./data/converted-prices.json");
const result = require("./data/commands-result-lowest-price.json");
const { equalPlan, equalSchedule } = require("./test-utils");
const { makeFlow } = require("./strategy-lowest-price-test-utils");
helper.init(require.resolve("node-red"));
describe("send command as input to lowest price", () => {
beforeEach(function (done) {
helper.startServer(done);
});
afterEach(function (done) {
helper.unload().then(function () {
helper.stopServer(done);
});
});
it("should send schedule on command", function (done) {
const flow = makeFlow(3, 2);
let pass = 1;
helper.load(lowestPrice, flow, function () {
const n1 = helper.getNode("n1");
const n2 = helper.getNode("n2");
n1.sendCurrentValueWhenRescheduling = true;
n2.on("input", function (msg) {
switch (pass) {
case 1:
pass++;
expect(equalSchedule(result.schedule, msg.payload.schedule)).to.equal(true);
n1.receive({ payload: { commands: { sendSchedule: true } } });
break;
case 2:
expect(equalSchedule(result.schedule, msg.payload.schedule)).to.equal(true);
done();
break;
}
});
const payload = cloneDeep(prices);
payload.time = "2021-10-10T00:00:00.000+02:00";
n1.receive({ payload });
});
});
it("should send output on command", function (done) {
const flow = makeFlow(3, 2, true);
let pass = 1;
helper.load(lowestPrice, flow, function () {
const n1 = helper.getNode("n1");
const n2 = helper.getNode("n2");
const n3 = helper.getNode("n3");
const n4 = helper.getNode("n4");
n1.sendCurrentValueWhenRescheduling = true;
let countOn = 0;
let countOff = 0;
n2.on("input", function (msg) {
switch (pass) {
case 1:
pass++;
expect(equalPlan(result, msg.payload)).to.equal(true);
n1.receive({ payload: { commands: { sendOutput: true }, time: "2021-10-11T11:00:05.000+02:00" } });
setTimeout(() => {
console.log("countOn = " + countOn + ", countOff = " + countOff);
expect(countOn).to.equal(1);
expect(countOff).to.equal(1);
done();
}, 50);
break;
}
});
n3.on("input", function (msg) {
countOn++;
expect(msg).to.have.deep.property("payload", true);
});
n4.on("input", function (msg) {
countOff++;
expect(msg).to.have.deep.property("payload", false);
});
const payload = cloneDeep(prices);
payload.time = "2021-10-10T00:00:05.000+02:00";
payload.commands = { runSchedule: false };
n1.receive({ payload });
});
});
it("should reset on command", function (done) {
const flow = makeFlow(3, 2, true);
helper.load(lowestPrice, flow, function () {
const n1 = helper.getNode("n1");
const n2 = helper.getNode("n2");
n2.on("input", function (msg) {
expect(equalPlan(result, msg.payload)).to.equal(true);
n1.receive({ payload: { commands: { reset: true } } });
n1.warn.should.be.calledWithExactly("No price data");
done();
});
const payload = cloneDeep(prices);
payload.time = "2021-10-11T00:00:05.000+02:00";
n1.receive({ payload });
});
});
it("should replan on command", function (done) {
const flow = makeFlow(3, 2, true);
let pass = 1;
helper.load(lowestPrice, flow, function () {
const n1 = helper.getNode("n1");
const n2 = helper.getNode("n2");
const n3 = helper.getNode("n3");
const n4 = helper.getNode("n4");
let countOn = 0;
let countOff = 0;
n2.on("input", function (msg) {
switch (pass) {
case 1:
pass++;
expect(equalPlan(result, msg.payload)).to.equal(true);
n1.receive({ payload: { commands: { replan: true }, time: "2021-10-11T00:00:05.000+02:00" } });
break;
case 2:
pass++;
expect(equalPlan(result, msg.payload)).to.equal(true);
setTimeout(() => {
console.log("countOn = " + countOn + ", countOff = " + countOff);
expect(countOn).to.equal(0);
expect(countOff).to.equal(2);
done();
}, 50);
}
});
n3.on("input", function (msg) {
countOn++;
expect(msg).to.have.deep.property("payload", true);
});
n4.on("input", function (msg) {
countOff++;
expect(msg).to.have.deep.property("payload", false);
});
const payload = cloneDeep(prices);
payload.time = "2021-10-11T00:00:05.000+02:00";
n1.receive({ payload });
});
});
});