@iobroker/testing 4.1.3 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/lib/adapterTools.d.ts +0 -1
- package/build/lib/adapterTools.js +13 -12
- package/build/lib/executeCommand.d.ts +0 -1
- package/build/lib/executeCommand.js +2 -3
- package/build/lib/str2regex.js +1 -2
- package/build/lib/testAdapter.d.ts +1 -0
- package/build/lib/testAdapter.js +1 -0
- package/build/tests/index.js +0 -1
- package/build/tests/integration/index.d.ts +0 -2
- package/build/tests/integration/index.js +2 -2
- package/build/tests/integration/lib/adapterSetup.js +16 -3
- package/build/tests/integration/lib/controllerSetup.js +1 -1
- package/build/tests/integration/lib/dbConnection.d.ts +0 -4
- package/build/tests/integration/lib/dbConnection.js +2 -2
- package/build/tests/integration/lib/harness.d.ts +0 -5
- package/build/tests/integration/lib/harness.js +2 -1
- package/build/tests/integration/lib/logger.d.ts +0 -1
- package/build/tests/integration/lib/logger.js +1 -3
- package/build/tests/integration/lib/tools.js +5 -6
- package/build/tests/packageFiles/index.js +18 -4
- package/build/tests/unit/harness/createMocks.d.ts +0 -1
- package/build/tests/unit/harness/createMocks.js +1 -2
- package/build/tests/unit/index.js +1 -2
- package/build/tests/unit/mocks/mockAdapter.d.ts +0 -1
- package/build/tests/unit/mocks/mockAdapter.js +2 -2
- package/build/tests/unit/mocks/mockAdapterCore.d.ts +0 -1
- package/build/tests/unit/mocks/mockAdapterCore.js +1 -2
- package/build/tests/unit/mocks/mockDatabase.d.ts +0 -2
- package/build/tests/unit/mocks/mockDatabase.js +2 -2
- package/build/tests/unit/mocks/mockLogger.d.ts +0 -1
- package/build/tests/unit/mocks/mockLogger.js +1 -2
- package/build/tests/unit/mocks/tools.d.ts +0 -1
- package/build/tests/unit/mocks/tools.js +3 -4
- package/package.json +35 -32
package/README.md
CHANGED
|
@@ -136,7 +136,7 @@ This method creates a mock database and a mock adapter. See below for a more det
|
|
|
136
136
|
const asserts = utils.unit.createAsserts(database, adapter);
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
These methods take a mock database and adapter and create a set of asserts for your tests. All IDs may either be a string, which is taken literally, or an array of strings which are concatenated with `"."`. If an ID is not fully qualified, the adapter namespace is prepended automatically.
|
|
140
140
|
|
|
141
141
|
- `assertObjectExists(id: string | string[])` asserts that an object with the given ID exists in the database.
|
|
142
142
|
- `assertStateExists(id: string | string[])` asserts that a state with the given ID exists in the database.
|
|
@@ -26,7 +26,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
29
|
+
exports.loadNpmPackage = loadNpmPackage;
|
|
30
|
+
exports.loadIoPackage = loadIoPackage;
|
|
31
|
+
exports.getAdapterExecutionMode = getAdapterExecutionMode;
|
|
32
|
+
exports.locateAdapterMainFile = locateAdapterMainFile;
|
|
33
|
+
exports.loadAdapterConfig = loadAdapterConfig;
|
|
34
|
+
exports.loadAdapterCommon = loadAdapterCommon;
|
|
35
|
+
exports.loadInstanceObjects = loadInstanceObjects;
|
|
36
|
+
exports.getAppName = getAppName;
|
|
37
|
+
exports.getAdapterName = getAdapterName;
|
|
38
|
+
exports.getAdapterFullName = getAdapterFullName;
|
|
39
|
+
exports.getAdapterDependencies = getAdapterDependencies;
|
|
30
40
|
// Add debug logging for tests
|
|
31
41
|
const typeguards_1 = require("alcalzone-shared/typeguards");
|
|
32
42
|
const debug_1 = __importDefault(require("debug"));
|
|
@@ -38,22 +48,21 @@ const debug = (0, debug_1.default)("testing:unit:adapterTools");
|
|
|
38
48
|
* @param adapterDir The directory the adapter resides in
|
|
39
49
|
*/
|
|
40
50
|
function loadNpmPackage(adapterDir) {
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
41
52
|
return require(path.join(adapterDir, "package.json"));
|
|
42
53
|
}
|
|
43
|
-
exports.loadNpmPackage = loadNpmPackage;
|
|
44
54
|
/**
|
|
45
55
|
* Loads an adapter's io-package.json
|
|
46
56
|
* @param adapterDir The directory the adapter resides in
|
|
47
57
|
*/
|
|
48
58
|
function loadIoPackage(adapterDir) {
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
49
60
|
return require(path.join(adapterDir, "io-package.json"));
|
|
50
61
|
}
|
|
51
|
-
exports.loadIoPackage = loadIoPackage;
|
|
52
62
|
function getAdapterExecutionMode(adapterDir) {
|
|
53
63
|
const ioPackage = loadIoPackage(adapterDir);
|
|
54
64
|
return ioPackage.common.mode;
|
|
55
65
|
}
|
|
56
|
-
exports.getAdapterExecutionMode = getAdapterExecutionMode;
|
|
57
66
|
/**
|
|
58
67
|
* Locates an adapter's main file
|
|
59
68
|
* @param adapterDir The directory the adapter resides in
|
|
@@ -83,7 +92,6 @@ async function locateAdapterMainFile(adapterDir) {
|
|
|
83
92
|
}
|
|
84
93
|
throw new Error(`The adapter main file was not found in ${adapterDir}`);
|
|
85
94
|
}
|
|
86
|
-
exports.locateAdapterMainFile = locateAdapterMainFile;
|
|
87
95
|
/**
|
|
88
96
|
* Locates an adapter's config to populate the `adapter.config` object with
|
|
89
97
|
* @param adapterDir The directory the adapter resides in
|
|
@@ -92,7 +100,6 @@ function loadAdapterConfig(adapterDir) {
|
|
|
92
100
|
const ioPackage = loadIoPackage(adapterDir);
|
|
93
101
|
return ioPackage.native || {};
|
|
94
102
|
}
|
|
95
|
-
exports.loadAdapterConfig = loadAdapterConfig;
|
|
96
103
|
/**
|
|
97
104
|
* Loads the adapter's common configuration from `io-package.json`
|
|
98
105
|
* @param adapterDir The directory the adapter resides in
|
|
@@ -101,7 +108,6 @@ function loadAdapterCommon(adapterDir) {
|
|
|
101
108
|
const ioPackage = loadIoPackage(adapterDir);
|
|
102
109
|
return ioPackage.common || {};
|
|
103
110
|
}
|
|
104
|
-
exports.loadAdapterCommon = loadAdapterCommon;
|
|
105
111
|
/**
|
|
106
112
|
* Loads the instanceObjects for an adapter from its `io-package.json`
|
|
107
113
|
* @param adapterDir The directory the adapter resides in
|
|
@@ -110,25 +116,21 @@ function loadInstanceObjects(adapterDir) {
|
|
|
110
116
|
const ioPackage = loadIoPackage(adapterDir);
|
|
111
117
|
return ioPackage.instanceObjects || [];
|
|
112
118
|
}
|
|
113
|
-
exports.loadInstanceObjects = loadInstanceObjects;
|
|
114
119
|
/** Returns the branded name of "iobroker" */
|
|
115
120
|
function getAppName(adapterDir) {
|
|
116
121
|
const npmPackage = loadNpmPackage(adapterDir);
|
|
117
122
|
return npmPackage.name.split(".")[0] || "iobroker";
|
|
118
123
|
}
|
|
119
|
-
exports.getAppName = getAppName;
|
|
120
124
|
/** Returns the name of an adapter without the prefix */
|
|
121
125
|
function getAdapterName(adapterDir) {
|
|
122
126
|
const ioPackage = loadIoPackage(adapterDir);
|
|
123
127
|
return ioPackage.common.name;
|
|
124
128
|
}
|
|
125
|
-
exports.getAdapterName = getAdapterName;
|
|
126
129
|
/** Returns the full name of an adapter, including the prefix */
|
|
127
130
|
function getAdapterFullName(adapterDir) {
|
|
128
131
|
const npmPackage = loadNpmPackage(adapterDir);
|
|
129
132
|
return npmPackage.name;
|
|
130
133
|
}
|
|
131
|
-
exports.getAdapterFullName = getAdapterFullName;
|
|
132
134
|
/** Reads other ioBroker modules this adapter depends on from io-package.json */
|
|
133
135
|
function getAdapterDependencies(adapterDir) {
|
|
134
136
|
const ioPackage = loadIoPackage(adapterDir);
|
|
@@ -147,4 +149,3 @@ function getAdapterDependencies(adapterDir) {
|
|
|
147
149
|
}
|
|
148
150
|
return ret;
|
|
149
151
|
}
|
|
150
|
-
exports.getAdapterDependencies = getAdapterDependencies;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.executeCommand =
|
|
3
|
+
exports.executeCommand = executeCommand;
|
|
4
4
|
const typeguards_1 = require("alcalzone-shared/typeguards");
|
|
5
5
|
const child_process_1 = require("child_process");
|
|
6
6
|
const isWindows = /^win/.test(process.platform);
|
|
@@ -75,9 +75,8 @@ function executeCommand(command, argsOrOptions, options) {
|
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
-
catch
|
|
78
|
+
catch {
|
|
79
79
|
// doesn't matter, we return the exit code in the "close" handler
|
|
80
80
|
}
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
|
-
exports.executeCommand = executeCommand;
|
package/build/lib/str2regex.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.str2regex =
|
|
3
|
+
exports.str2regex = str2regex;
|
|
4
4
|
function str2regex(pattern) {
|
|
5
5
|
return new RegExp(pattern
|
|
6
6
|
.replace(/\\/g, "\\\\") // Backslashes escapen
|
|
@@ -8,4 +8,3 @@ function str2regex(pattern) {
|
|
|
8
8
|
.replace(/\*/g, ".*") // Wildcard in Regex umsetzen
|
|
9
9
|
.replace(/!/g, "?!"));
|
|
10
10
|
}
|
|
11
|
-
exports.str2regex = str2regex;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/build/lib/testAdapter.js
CHANGED
package/build/tests/index.js
CHANGED
|
@@ -8,7 +8,6 @@ const createMocks_1 = require("./unit/harness/createMocks");
|
|
|
8
8
|
const mockDatabase_1 = require("./unit/mocks/mockDatabase");
|
|
9
9
|
var harness_1 = require("./integration/lib/harness");
|
|
10
10
|
Object.defineProperty(exports, "IntegrationTestHarness", { enumerable: true, get: function () { return harness_1.TestHarness; } });
|
|
11
|
-
var mockAdapter_1 = require("./unit/mocks/mockAdapter");
|
|
12
11
|
var mockDatabase_2 = require("./unit/mocks/mockDatabase");
|
|
13
12
|
Object.defineProperty(exports, "MockDatabase", { enumerable: true, get: function () { return mockDatabase_2.MockDatabase; } });
|
|
14
13
|
/** Predefined test sets */
|
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.testAdapter =
|
|
26
|
+
exports.testAdapter = testAdapter;
|
|
27
27
|
const async_1 = require("alcalzone-shared/async");
|
|
28
28
|
const os = __importStar(require("os"));
|
|
29
29
|
const path = __importStar(require("path"));
|
|
@@ -114,6 +114,7 @@ function testAdapter(adapterDir, options = {}) {
|
|
|
114
114
|
switch (harness.getAdapterExecutionMode()) {
|
|
115
115
|
case "schedule":
|
|
116
116
|
case "once":
|
|
117
|
+
// @ts-expect-error subscribe was deprecated
|
|
117
118
|
case "subscribe":
|
|
118
119
|
allowedExitCodes.add(0);
|
|
119
120
|
}
|
|
@@ -201,4 +202,3 @@ function testAdapter(adapterDir, options = {}) {
|
|
|
201
202
|
}
|
|
202
203
|
});
|
|
203
204
|
}
|
|
204
|
-
exports.testAdapter = testAdapter;
|
|
@@ -27,7 +27,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.AdapterSetup = void 0;
|
|
30
|
-
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
31
30
|
// Add debug logging for tests
|
|
32
31
|
const objects_1 = require("alcalzone-shared/objects");
|
|
33
32
|
const debug_1 = __importDefault(require("debug"));
|
|
@@ -76,11 +75,25 @@ class AdapterSetup {
|
|
|
76
75
|
const tarballPath = path.resolve(this.adapterDir, tarballName);
|
|
77
76
|
await (0, fs_extra_1.copy)(tarballPath, path.resolve(this.testDir, tarballName));
|
|
78
77
|
await (0, fs_extra_1.unlink)(tarballPath);
|
|
78
|
+
// Let npm remove the adapter in the package-lock.json file(s),
|
|
79
|
+
// so that the installation in the following step
|
|
80
|
+
// won't grab the cached files.
|
|
81
|
+
// See https://github.com/ioBroker/testing/issues/612
|
|
82
|
+
debug("Removing the adapter from package-lock.json");
|
|
83
|
+
await (0, executeCommand_1.executeCommand)("npm", [
|
|
84
|
+
"uninstall",
|
|
85
|
+
this.adapterFullName,
|
|
86
|
+
"--package-lock-only",
|
|
87
|
+
"--omit=dev",
|
|
88
|
+
], {
|
|
89
|
+
cwd: this.testDir,
|
|
90
|
+
});
|
|
79
91
|
// Complete the package.json, so npm can do it's magic
|
|
80
92
|
debug("Saving the adapter in package.json");
|
|
81
93
|
const packageJsonPath = path.join(this.testDir, "package.json");
|
|
82
94
|
const packageJson = await (0, fs_extra_1.readJSON)(packageJsonPath);
|
|
83
|
-
packageJson.dependencies[this.adapterFullName] =
|
|
95
|
+
packageJson.dependencies[this.adapterFullName] =
|
|
96
|
+
`file:./${tarballName}`;
|
|
84
97
|
for (const [dep, version] of (0, objects_1.entries)((0, adapterTools_1.getAdapterDependencies)(this.adapterDir))) {
|
|
85
98
|
// Don't overwrite the js-controller github dependency with a probably lower one
|
|
86
99
|
if (dep === "js-controller")
|
|
@@ -93,7 +106,7 @@ class AdapterSetup {
|
|
|
93
106
|
await (0, fs_extra_1.remove)(this.testAdapterDir);
|
|
94
107
|
debug("Installing adapter");
|
|
95
108
|
// Defer to npm to install the controller (if it wasn't already)
|
|
96
|
-
await (0, executeCommand_1.executeCommand)("npm", ["i", "--
|
|
109
|
+
await (0, executeCommand_1.executeCommand)("npm", ["i", "--omit=dev"], {
|
|
97
110
|
cwd: this.testDir,
|
|
98
111
|
});
|
|
99
112
|
debug(" => done!");
|
|
@@ -89,7 +89,7 @@ class ControllerSetup {
|
|
|
89
89
|
const wasJsControllerInstalled = await this.isJsControllerInstalled();
|
|
90
90
|
// Defer to npm to install the controller (if it wasn't already)
|
|
91
91
|
debug("(Re-)installing JS Controller...");
|
|
92
|
-
await (0, executeCommand_1.executeCommand)("npm", ["i", "--
|
|
92
|
+
await (0, executeCommand_1.executeCommand)("npm", ["i", "--omit=dev"], {
|
|
93
93
|
cwd: this.testDir,
|
|
94
94
|
});
|
|
95
95
|
// Prepare/clean the databases and config
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/// <reference types="iobroker" />
|
|
2
|
-
/// <reference types="iobroker" />
|
|
3
|
-
/// <reference types="node" />
|
|
4
|
-
/// <reference types="node" />
|
|
5
1
|
import EventEmitter from "events";
|
|
6
2
|
export type ObjectsDB = Record<string, ioBroker.Object>;
|
|
7
3
|
export type StatesDB = Record<string, ioBroker.State>;
|
|
@@ -193,7 +193,7 @@ class DBConnection extends events_1.default {
|
|
|
193
193
|
],
|
|
194
194
|
});
|
|
195
195
|
debug(` => objects DB lib found at ${objectsDbPath}`);
|
|
196
|
-
// eslint-disable-next-line @typescript-eslint/no-
|
|
196
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
197
197
|
const { Server, Client } = require(objectsDbPath);
|
|
198
198
|
// First create the server
|
|
199
199
|
await new Promise((resolve) => {
|
|
@@ -241,7 +241,7 @@ class DBConnection extends events_1.default {
|
|
|
241
241
|
],
|
|
242
242
|
});
|
|
243
243
|
debug(` => states DB lib found at ${statesDbPath}`);
|
|
244
|
-
// eslint-disable-next-line @typescript-eslint/no-
|
|
244
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
245
245
|
const { Server, Client } = require(statesDbPath);
|
|
246
246
|
// First create the server
|
|
247
247
|
await new Promise((resolve) => {
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/// <reference types="iobroker" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
/// <reference types="node" />
|
|
4
|
-
/// <reference types="iobroker" />
|
|
5
|
-
/// <reference types="node" />
|
|
6
1
|
import { ChildProcess } from "child_process";
|
|
7
2
|
import { EventEmitter } from "events";
|
|
8
3
|
import type { DBConnection } from "./dbConnection";
|
|
@@ -27,7 +27,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.TestHarness = void 0;
|
|
30
|
-
/* eslint-disable @typescript-eslint/no-inferrable-types */
|
|
31
30
|
const async_1 = require("alcalzone-shared/async");
|
|
32
31
|
const objects_1 = require("alcalzone-shared/objects");
|
|
33
32
|
const child_process_1 = require("child_process");
|
|
@@ -237,6 +236,8 @@ class TestHarness extends events_1.EventEmitter {
|
|
|
237
236
|
type: "instance",
|
|
238
237
|
common: {},
|
|
239
238
|
native: {},
|
|
239
|
+
instanceObjects: [],
|
|
240
|
+
objects: [],
|
|
240
241
|
});
|
|
241
242
|
this.dbConnection.subscribeMessage(fromAdapterID);
|
|
242
243
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createLogger =
|
|
3
|
+
exports.createLogger = createLogger;
|
|
4
4
|
var LoglevelOrder;
|
|
5
5
|
(function (LoglevelOrder) {
|
|
6
6
|
LoglevelOrder[LoglevelOrder["error"] = 0] = "error";
|
|
@@ -11,7 +11,6 @@ var LoglevelOrder;
|
|
|
11
11
|
})(LoglevelOrder || (LoglevelOrder = {}));
|
|
12
12
|
function createLogger(loglevel) {
|
|
13
13
|
const loglevelNumeric = LoglevelOrder[loglevel ?? "debug"] ?? LoglevelOrder.debug;
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
15
14
|
const ignore = () => { };
|
|
16
15
|
return {
|
|
17
16
|
error: loglevelNumeric >= LoglevelOrder.error ? console.error : ignore,
|
|
@@ -22,4 +21,3 @@ function createLogger(loglevel) {
|
|
|
22
21
|
level: loglevel,
|
|
23
22
|
};
|
|
24
23
|
}
|
|
25
|
-
exports.createLogger = createLogger;
|
|
@@ -23,7 +23,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
26
|
+
exports.getTestControllerDir = getTestControllerDir;
|
|
27
|
+
exports.getTestDataDir = getTestDataDir;
|
|
28
|
+
exports.getTestLogDir = getTestLogDir;
|
|
29
|
+
exports.getTestDBDir = getTestDBDir;
|
|
30
|
+
exports.getTestAdapterDir = getTestAdapterDir;
|
|
27
31
|
const path = __importStar(require("path"));
|
|
28
32
|
const adapterTools_1 = require("../../../lib/adapterTools");
|
|
29
33
|
/**
|
|
@@ -34,7 +38,6 @@ const adapterTools_1 = require("../../../lib/adapterTools");
|
|
|
34
38
|
function getTestControllerDir(appName, testDir) {
|
|
35
39
|
return path.resolve(testDir, "node_modules", `${appName}.js-controller`);
|
|
36
40
|
}
|
|
37
|
-
exports.getTestControllerDir = getTestControllerDir;
|
|
38
41
|
/**
|
|
39
42
|
* Locates the directory where JS-Controller stores its data for integration tests
|
|
40
43
|
* @param appName The branded name of "iobroker"
|
|
@@ -43,7 +46,6 @@ exports.getTestControllerDir = getTestControllerDir;
|
|
|
43
46
|
function getTestDataDir(appName, testDir) {
|
|
44
47
|
return path.resolve(testDir, `${appName}-data`);
|
|
45
48
|
}
|
|
46
|
-
exports.getTestDataDir = getTestDataDir;
|
|
47
49
|
/**
|
|
48
50
|
* Locates the directory where JS-Controller stores its logs for integration tests
|
|
49
51
|
* @param appName The branded name of "iobroker"
|
|
@@ -52,7 +54,6 @@ exports.getTestDataDir = getTestDataDir;
|
|
|
52
54
|
function getTestLogDir(appName, testDir) {
|
|
53
55
|
return path.resolve(testDir, "log");
|
|
54
56
|
}
|
|
55
|
-
exports.getTestLogDir = getTestLogDir;
|
|
56
57
|
/**
|
|
57
58
|
* Locates the directory where JS-Controller stores its sqlite db during integration tests
|
|
58
59
|
* @param appName The branded name of "iobroker"
|
|
@@ -61,7 +62,6 @@ exports.getTestLogDir = getTestLogDir;
|
|
|
61
62
|
function getTestDBDir(appName, testDir) {
|
|
62
63
|
return path.resolve(getTestDataDir(appName, testDir), "sqlite");
|
|
63
64
|
}
|
|
64
|
-
exports.getTestDBDir = getTestDBDir;
|
|
65
65
|
/**
|
|
66
66
|
* Locates the directory where the adapter will be be stored for integration tests
|
|
67
67
|
* @param adapterDir The root directory of the adapter
|
|
@@ -71,4 +71,3 @@ function getTestAdapterDir(adapterDir, testDir) {
|
|
|
71
71
|
const adapterName = (0, adapterTools_1.getAdapterFullName)(adapterDir);
|
|
72
72
|
return path.resolve(testDir, "node_modules", adapterName);
|
|
73
73
|
}
|
|
74
|
-
exports.getTestAdapterDir = getTestAdapterDir;
|
|
@@ -23,8 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.validatePackageFiles =
|
|
27
|
-
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
26
|
+
exports.validatePackageFiles = validatePackageFiles;
|
|
28
27
|
const typeguards_1 = require("alcalzone-shared/typeguards");
|
|
29
28
|
const chai_1 = require("chai");
|
|
30
29
|
const fs = __importStar(require("fs"));
|
|
@@ -58,6 +57,7 @@ function validatePackageFiles(adapterDir) {
|
|
|
58
57
|
it(`The property "${propertyPath}" exists`, () => {
|
|
59
58
|
let prev = targetObj;
|
|
60
59
|
for (const part of propertyParts) {
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
61
61
|
(0, chai_1.expect)(prev[part]).to.not.be.undefined;
|
|
62
62
|
prev = prev[part];
|
|
63
63
|
}
|
|
@@ -75,6 +75,7 @@ function validatePackageFiles(adapterDir) {
|
|
|
75
75
|
skipIfInvalid.call(this, filename);
|
|
76
76
|
});
|
|
77
77
|
it("exists", () => {
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
78
79
|
(0, chai_1.expect)(fs.existsSync(packagePath), `${filename} is missing in the adapter dir. Please create it!`).to.be.true;
|
|
79
80
|
});
|
|
80
81
|
it("contains valid JSON", () => {
|
|
@@ -83,7 +84,9 @@ function validatePackageFiles(adapterDir) {
|
|
|
83
84
|
}, `${filename} contains invalid JSON!`).not.to.throw();
|
|
84
85
|
});
|
|
85
86
|
it("is an object", () => {
|
|
86
|
-
(0, chai_1.expect)(
|
|
87
|
+
(0, chai_1.expect)(
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
89
|
+
require(packagePath), `${filename} must contain an object!`).to.be.an("object");
|
|
87
90
|
});
|
|
88
91
|
});
|
|
89
92
|
}
|
|
@@ -92,7 +95,9 @@ function validatePackageFiles(adapterDir) {
|
|
|
92
95
|
beforeEach(function () {
|
|
93
96
|
skipIfInvalid.call(this, "package.json");
|
|
94
97
|
});
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
95
99
|
const packageContent = require(packageJsonPath);
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
96
101
|
const iopackContent = require(ioPackageJsonPath);
|
|
97
102
|
const requiredProperties = [
|
|
98
103
|
"name",
|
|
@@ -114,6 +119,7 @@ function validatePackageFiles(adapterDir) {
|
|
|
114
119
|
});
|
|
115
120
|
if (!iopackContent.common.onlyWWW) {
|
|
116
121
|
it(`property main is defined for non onlyWWW adapters`, () => {
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
117
123
|
(0, chai_1.expect)(packageContent.main).to.not.be.undefined;
|
|
118
124
|
});
|
|
119
125
|
}
|
|
@@ -138,6 +144,7 @@ function validatePackageFiles(adapterDir) {
|
|
|
138
144
|
beforeEach(function () {
|
|
139
145
|
skipIfInvalid.call(this, "io-package.json");
|
|
140
146
|
});
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
141
148
|
const iopackContent = require(ioPackageJsonPath);
|
|
142
149
|
const requiredProperties = [
|
|
143
150
|
"common.name",
|
|
@@ -170,11 +177,13 @@ function validatePackageFiles(adapterDir) {
|
|
|
170
177
|
});
|
|
171
178
|
it(`common.authors is an array that is not empty`, () => {
|
|
172
179
|
const authors = iopackContent.common.authors;
|
|
180
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
173
181
|
(0, chai_1.expect)((0, typeguards_1.isArray)(authors)).to.be.true;
|
|
174
182
|
(0, chai_1.expect)(authors.length).to.be.at.least(1);
|
|
175
183
|
});
|
|
176
184
|
it(`common.news is an object that contains maximum 20 entries`, () => {
|
|
177
185
|
const news = iopackContent.common.news;
|
|
186
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
178
187
|
(0, chai_1.expect)((0, typeguards_1.isObject)(news)).to.be.true;
|
|
179
188
|
(0, chai_1.expect)(Object.keys(news).length).to.be.at.most(20);
|
|
180
189
|
});
|
|
@@ -183,15 +192,18 @@ function validatePackageFiles(adapterDir) {
|
|
|
183
192
|
(0, chai_1.expect)(iopackContent.common.licenseInformation).to.be.an("object");
|
|
184
193
|
(0, chai_1.expect)(iopackContent.common.licenseInformation.type).to.be.oneOf(["free", "commercial", "paid", "limited"]);
|
|
185
194
|
if (iopackContent.common.licenseInformation.type !== "free") {
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
186
196
|
(0, chai_1.expect)(iopackContent.common.licenseInformation.link, "License link is missing").to.not.be.undefined;
|
|
187
197
|
}
|
|
188
198
|
});
|
|
189
199
|
it(`common.license should not exist together with common.licenseInformation`, () => {
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
190
201
|
(0, chai_1.expect)(iopackContent.common.license, "common.license must be removed").to.be.undefined;
|
|
191
202
|
});
|
|
192
203
|
}
|
|
193
204
|
else {
|
|
194
205
|
it(`common.license must exist without common.licenseInformation`, () => {
|
|
206
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
195
207
|
(0, chai_1.expect)(iopackContent.common.license, "common.licenseInformation (preferred) or common.license (deprecated) must exist").to.not.be.undefined;
|
|
196
208
|
});
|
|
197
209
|
}
|
|
@@ -211,6 +223,7 @@ function validatePackageFiles(adapterDir) {
|
|
|
211
223
|
iopackContent.common.adminUI?.config === "html" ||
|
|
212
224
|
iopackContent.common.adminUI?.config === "json" ||
|
|
213
225
|
iopackContent.common.adminUI?.config === "materialize";
|
|
226
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
214
227
|
(0, chai_1.expect)(hasSupportedUI, "Unsupported Admin UI, must be html, materialize or JSON config!").to.be.true;
|
|
215
228
|
});
|
|
216
229
|
}
|
|
@@ -219,7 +232,9 @@ function validatePackageFiles(adapterDir) {
|
|
|
219
232
|
beforeEach(function () {
|
|
220
233
|
skipIfInvalid.call(this, "package.json", "io-package.json");
|
|
221
234
|
});
|
|
235
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
222
236
|
const packageContent = require(packageJsonPath);
|
|
237
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
223
238
|
const iopackContent = require(ioPackageJsonPath);
|
|
224
239
|
it("The name matches", () => {
|
|
225
240
|
(0, chai_1.expect)("iobroker." + iopackContent.common.name).to.equal(packageContent.name);
|
|
@@ -255,4 +270,3 @@ function validatePackageFiles(adapterDir) {
|
|
|
255
270
|
// });
|
|
256
271
|
// });
|
|
257
272
|
}
|
|
258
|
-
exports.validatePackageFiles = validatePackageFiles;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createMocks =
|
|
3
|
+
exports.createMocks = createMocks;
|
|
4
4
|
const mockAdapter_1 = require("../mocks/mockAdapter");
|
|
5
5
|
const mockDatabase_1 = require("../mocks/mockDatabase");
|
|
6
6
|
/**
|
|
@@ -16,4 +16,3 @@ function createMocks(adapterOptions) {
|
|
|
16
16
|
adapter: adapterMock,
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
-
exports.createMocks = createMocks;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testAdapterWithMocks =
|
|
3
|
+
exports.testAdapterWithMocks = testAdapterWithMocks;
|
|
4
4
|
/**
|
|
5
5
|
* @deprecated
|
|
6
6
|
* Tests the adapter startup in offline mode (with mocks, no JS-Controller)
|
|
@@ -21,4 +21,3 @@ function testAdapterWithMocks(_adapterDir, options = {}) {
|
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
exports.testAdapterWithMocks = testAdapterWithMocks;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createAdapterMock =
|
|
3
|
+
exports.createAdapterMock = createAdapterMock;
|
|
4
4
|
const objects_1 = require("alcalzone-shared/objects");
|
|
5
5
|
const sinon_1 = require("sinon");
|
|
6
6
|
const mockLogger_1 = require("./mockLogger");
|
|
@@ -45,6 +45,7 @@ const implementedMethods = {
|
|
|
45
45
|
sendTo: "no error",
|
|
46
46
|
sendToHost: "no error",
|
|
47
47
|
getHistory: "normal",
|
|
48
|
+
// @ts-expect-error This method was deprecated
|
|
48
49
|
setBinaryState: "normal",
|
|
49
50
|
getBinaryState: "normal",
|
|
50
51
|
getEnum: "normal",
|
|
@@ -528,4 +529,3 @@ function createAdapterMock(db, options = {}) {
|
|
|
528
529
|
});
|
|
529
530
|
return ret;
|
|
530
531
|
}
|
|
531
|
-
exports.createAdapterMock = createAdapterMock;
|
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.mockAdapterCore =
|
|
26
|
+
exports.mockAdapterCore = mockAdapterCore;
|
|
27
27
|
const os = __importStar(require("os"));
|
|
28
28
|
const path = __importStar(require("path"));
|
|
29
29
|
const mockAdapter_1 = require("./mockAdapter");
|
|
@@ -74,4 +74,3 @@ function mockAdapterCore(database, options = {}) {
|
|
|
74
74
|
getAbsoluteInstanceDataDir,
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
|
-
exports.mockAdapterCore = mockAdapterCore;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.MockDatabase = void 0;
|
|
4
|
+
exports.createAsserts = createAsserts;
|
|
4
5
|
const objects_1 = require("alcalzone-shared/objects");
|
|
5
6
|
const typeguards_1 = require("alcalzone-shared/typeguards");
|
|
6
7
|
const str2regex_1 = require("../../../lib/str2regex");
|
|
@@ -186,4 +187,3 @@ function createAsserts(db, adapter) {
|
|
|
186
187
|
};
|
|
187
188
|
return ret;
|
|
188
189
|
}
|
|
189
|
-
exports.createAsserts = createAsserts;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createLoggerMock =
|
|
3
|
+
exports.createLoggerMock = createLoggerMock;
|
|
4
4
|
const sinon_1 = require("sinon");
|
|
5
5
|
const tools_1 = require("./tools");
|
|
6
6
|
// Define here which methods were implemented manually, so we can hook them up with a real stub
|
|
@@ -34,4 +34,3 @@ function createLoggerMock() {
|
|
|
34
34
|
(0, tools_1.stubAndPromisifyImplementedMethods)(ret, implementedMethods);
|
|
35
35
|
return ret;
|
|
36
36
|
}
|
|
37
|
-
exports.createLoggerMock = createLoggerMock;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.doResetHistory = doResetHistory;
|
|
4
|
+
exports.doResetBehavior = doResetBehavior;
|
|
5
|
+
exports.stubAndPromisifyImplementedMethods = stubAndPromisifyImplementedMethods;
|
|
4
6
|
const async_1 = require("alcalzone-shared/async");
|
|
5
7
|
const sinon_1 = require("sinon");
|
|
6
8
|
function doResetHistory(parent) {
|
|
@@ -10,7 +12,6 @@ function doResetHistory(parent) {
|
|
|
10
12
|
val.resetHistory();
|
|
11
13
|
}
|
|
12
14
|
}
|
|
13
|
-
exports.doResetHistory = doResetHistory;
|
|
14
15
|
function doResetBehavior(parent, implementedMethods) {
|
|
15
16
|
for (const prop of Object.keys(parent)) {
|
|
16
17
|
if (prop in implementedMethods ||
|
|
@@ -21,7 +22,6 @@ function doResetBehavior(parent, implementedMethods) {
|
|
|
21
22
|
val.resetBehavior();
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
exports.doResetBehavior = doResetBehavior;
|
|
25
25
|
function dontOverwriteThis() {
|
|
26
26
|
throw new Error("You must not overwrite the behavior of this stub!");
|
|
27
27
|
}
|
|
@@ -54,4 +54,3 @@ function stubAndPromisifyImplementedMethods(parent, implementedMethods, allowUse
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
exports.stubAndPromisifyImplementedMethods = stubAndPromisifyImplementedMethods;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iobroker/testing",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "Shared utilities for adapter and module testing in ioBroker",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
"prewatch": "rimraf ./build",
|
|
16
16
|
"watch": "tsc -p tsconfig.build.json --watch",
|
|
17
17
|
"check": "npm run build -- --noEmit",
|
|
18
|
-
"lint:ts": "eslint
|
|
18
|
+
"lint:ts": "eslint -c eslint.config.mjs",
|
|
19
19
|
"lint": "npm run lint:ts",
|
|
20
|
-
"release": "release-script"
|
|
20
|
+
"release": "release-script",
|
|
21
|
+
"update-packages": "ncu --upgrade"
|
|
21
22
|
},
|
|
22
23
|
"repository": {
|
|
23
24
|
"type": "git",
|
|
@@ -38,38 +39,40 @@
|
|
|
38
39
|
},
|
|
39
40
|
"homepage": "https://github.com/AlCalzone/testing#readme",
|
|
40
41
|
"devDependencies": {
|
|
41
|
-
"@alcalzone/release-script": "^3.
|
|
42
|
-
"@alcalzone/release-script-plugin-license": "^3.
|
|
43
|
-
"@
|
|
44
|
-
"@
|
|
45
|
-
"@
|
|
46
|
-
"@types
|
|
47
|
-
"@
|
|
48
|
-
"@types/
|
|
49
|
-
"@types/
|
|
50
|
-
"@types/
|
|
51
|
-
"@types/
|
|
52
|
-
"@types/
|
|
53
|
-
"@types/
|
|
54
|
-
"@
|
|
55
|
-
"@
|
|
56
|
-
"eslint": "^8.
|
|
57
|
-
"eslint
|
|
58
|
-
"eslint
|
|
59
|
-
"prettier": "^
|
|
60
|
-
"
|
|
42
|
+
"@alcalzone/release-script": "^3.8.0",
|
|
43
|
+
"@alcalzone/release-script-plugin-license": "^3.7.0",
|
|
44
|
+
"@eslint/js": "^9.10.0",
|
|
45
|
+
"@eslint/eslintrc": "^3.1.0",
|
|
46
|
+
"@iobroker/adapter-core": "^3.1.6",
|
|
47
|
+
"@iobroker/types": "^6.0.11",
|
|
48
|
+
"@tsconfig/node14": "^14.1.2",
|
|
49
|
+
"@types/chai": "^4.3.19",
|
|
50
|
+
"@types/chai-as-promised": "^8.0.0",
|
|
51
|
+
"@types/debug": "4.1.12",
|
|
52
|
+
"@types/fs-extra": "^11.0.4",
|
|
53
|
+
"@types/mocha": "^10.0.8",
|
|
54
|
+
"@types/node": "^22.5.5",
|
|
55
|
+
"@types/sinon": "^17.0.3",
|
|
56
|
+
"@types/sinon-chai": "^3.2.12",
|
|
57
|
+
"@typescript-eslint/eslint-plugin": "^8.5.0",
|
|
58
|
+
"@typescript-eslint/parser": "^8.5.0",
|
|
59
|
+
"eslint": "^9.10.0",
|
|
60
|
+
"eslint-config-prettier": "^9.1.0",
|
|
61
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
62
|
+
"prettier": "^3.3.3",
|
|
63
|
+
"rimraf": "^6.0.1",
|
|
61
64
|
"source-map-support": "^0.5.21",
|
|
62
|
-
"ts-node": "^10.9.
|
|
63
|
-
"typescript": "~
|
|
65
|
+
"ts-node": "^10.9.2",
|
|
66
|
+
"typescript": "~5.6.2"
|
|
64
67
|
},
|
|
65
68
|
"dependencies": {
|
|
66
|
-
"alcalzone-shared": "~4.0.
|
|
67
|
-
"chai": "^4.
|
|
68
|
-
"chai-as-promised": "^7.1.
|
|
69
|
-
"debug": "^4.3.
|
|
70
|
-
"fs-extra": "^
|
|
71
|
-
"mocha": "^10.
|
|
72
|
-
"sinon": "^
|
|
69
|
+
"alcalzone-shared": "~4.0.8",
|
|
70
|
+
"chai": "^4.5.0",
|
|
71
|
+
"chai-as-promised": "^7.1.2",
|
|
72
|
+
"debug": "^4.3.7",
|
|
73
|
+
"fs-extra": "^11.2.0",
|
|
74
|
+
"mocha": "^10.7.3",
|
|
75
|
+
"sinon": "^19.0.2",
|
|
73
76
|
"sinon-chai": "^3.7.0"
|
|
74
77
|
}
|
|
75
78
|
}
|