feat: Implement Tapo P110/P115 power and energy monitoring, add Tapo device testing utilities, and include a database upsert test.
This commit is contained in:
63
test_db_upsert.js
Normal file
63
test_db_upsert.js
Normal file
@@ -0,0 +1,63 @@
|
||||
import sqlite3 from 'sqlite3';
|
||||
|
||||
const db = new sqlite3.Database(':memory:');
|
||||
|
||||
db.serialize(() => {
|
||||
db.run("CREATE TABLE devices (mac TEXT PRIMARY KEY, model TEXT, connected INTEGER, last_seen TEXT)");
|
||||
});
|
||||
|
||||
const upsertSql = `
|
||||
INSERT INTO devices (mac, model, connected, last_seen)
|
||||
VALUES (?, ?, ?, ?)
|
||||
ON CONFLICT(mac) DO UPDATE SET
|
||||
model = excluded.model,
|
||||
connected = COALESCE(excluded.connected, devices.connected),
|
||||
last_seen = excluded.last_seen
|
||||
`;
|
||||
|
||||
console.log("Starting sequential tests...");
|
||||
|
||||
// Test 1: Insert initial online device
|
||||
db.run(upsertSql, ['AA:BB:CC', 'T110', 1, '2023-01-01T12:00:00Z'], (err) => {
|
||||
if (err) console.error(err);
|
||||
checkDevice('Test 1 (Init Online)', 'AA:BB:CC', 1, () => {
|
||||
|
||||
// Test 2: Update with NULL status
|
||||
db.run(upsertSql, ['AA:BB:CC', 'T110', null, '2023-01-01T12:05:00Z'], (err) => {
|
||||
if (err) console.error(err);
|
||||
checkDevice('Test 2 (Sensor Event/Null)', 'AA:BB:CC', 1, () => {
|
||||
|
||||
// Test 3: Update with offline status
|
||||
db.run(upsertSql, ['AA:BB:CC', 'T110', 0, '2023-01-01T12:10:00Z'], (err) => {
|
||||
if (err) console.error(err);
|
||||
checkDevice('Test 3 (Offline/0)', 'AA:BB:CC', 0, () => {
|
||||
|
||||
// Test 4: Update with NULL status while offline
|
||||
db.run(upsertSql, ['AA:BB:CC', 'T110', null, '2023-01-01T12:15:00Z'], (err) => {
|
||||
if (err) console.error(err);
|
||||
checkDevice('Test 4 (Sensor Event while Offline)', 'AA:BB:CC', 0, () => {
|
||||
|
||||
// Test 5: Back online
|
||||
db.run(upsertSql, ['AA:BB:CC', 'T110', 1, '2023-01-01T12:20:00Z'], (err) => {
|
||||
if (err) console.error(err);
|
||||
checkDevice('Test 5 (Online again)', 'AA:BB:CC', 1, () => {
|
||||
console.log("All tests completed.");
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function checkDevice(testName, mac, expectedConnected, callback) {
|
||||
db.get("SELECT * FROM devices WHERE mac = ?", [mac], (err, row) => {
|
||||
if (err) console.error("DB Error:", err);
|
||||
const status = row.connected === expectedConnected ? 'PASS' : 'FAIL';
|
||||
console.log(`${testName}: connected=${row.connected} (Expected: ${expectedConnected}) -> ${status}`);
|
||||
if (callback) callback();
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user