@iobroker/testing 2.5.4 → 2.5.5
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/CHANGELOG.md +5 -0
- package/build/index.js +5 -1
- package/build/lib/adapterTools.d.ts +1 -10
- package/build/lib/adapterTools.js +10 -7
- package/build/tests/integration/index.js +12 -3
- package/build/tests/integration/lib/adapterSetup.js +5 -1
- package/build/tests/integration/lib/controllerSetup.js +5 -1
- package/build/tests/integration/lib/dbConnection.js +6 -5
- package/build/tests/integration/lib/harness.d.ts +1 -0
- package/build/tests/integration/lib/harness.js +9 -4
- package/build/tests/integration/lib/tools.js +5 -1
- package/build/tests/packageFiles/index.js +18 -1
- package/build/tests/unit/mocks/mockAdapterCore.js +5 -1
- package/package.json +19 -19
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
PLACEHOLDER for next version:
|
|
5
5
|
## __WORK IN PROGRESS__
|
|
6
6
|
-->
|
|
7
|
+
## 2.5.5 (2022-03-04)
|
|
8
|
+
* Allow immediate exit with code `0` for schedule adapters
|
|
9
|
+
* Check that `npm` is not listed as a local dependency in `package.json`
|
|
10
|
+
* Updated dependencies
|
|
11
|
+
|
|
7
12
|
## 2.5.4 (2022-02-02)
|
|
8
13
|
* Modifying ioBroker databases now uses the same methods that JS-Controller uses internally. This ensures that the testing is compatible with the `jsonl` database format.
|
|
9
14
|
* Testing adapters with adapter dependencies that try to access the databases during installation now works.
|
package/build/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -9,16 +9,7 @@ export declare function loadNpmPackage(adapterDir: string): Record<string, any>;
|
|
|
9
9
|
* @param adapterDir The directory the adapter resides in
|
|
10
10
|
*/
|
|
11
11
|
export declare function loadIoPackage(adapterDir: string): Record<string, any>;
|
|
12
|
-
|
|
13
|
-
* Checks if an adapter claims that it supports compact mode
|
|
14
|
-
* @param ioPackage The contents of io-package.json in object format
|
|
15
|
-
*/
|
|
16
|
-
export declare function adapterShouldSupportCompactMode(ioPackage: Record<string, any>): boolean;
|
|
17
|
-
/**
|
|
18
|
-
* Checks if an adapter claims that it supports compact mode
|
|
19
|
-
* @param adapterDir The directory the adapter resides in
|
|
20
|
-
*/
|
|
21
|
-
export declare function adapterShouldSupportCompactMode(adapterDir: string): boolean;
|
|
12
|
+
export declare function getAdapterExecutionMode(adapterDir: string): ioBroker.AdapterCommon["mode"];
|
|
22
13
|
/**
|
|
23
14
|
* Locates an adapter's main file
|
|
24
15
|
* @param adapterDir The directory the adapter resides in
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -22,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
22
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
27
|
};
|
|
24
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.getAdapterDependencies = exports.getAdapterFullName = exports.getAdapterName = exports.getAppName = exports.loadInstanceObjects = exports.loadAdapterCommon = exports.loadAdapterConfig = exports.locateAdapterMainFile = exports.
|
|
29
|
+
exports.getAdapterDependencies = exports.getAdapterFullName = exports.getAdapterName = exports.getAppName = exports.loadInstanceObjects = exports.loadAdapterCommon = exports.loadAdapterConfig = exports.locateAdapterMainFile = exports.getAdapterExecutionMode = exports.loadIoPackage = exports.loadNpmPackage = void 0;
|
|
26
30
|
// Add debug logging for tests
|
|
27
31
|
const typeguards_1 = require("alcalzone-shared/typeguards");
|
|
28
32
|
const debug_1 = __importDefault(require("debug"));
|
|
@@ -45,12 +49,11 @@ function loadIoPackage(adapterDir) {
|
|
|
45
49
|
return require(path.join(adapterDir, "io-package.json"));
|
|
46
50
|
}
|
|
47
51
|
exports.loadIoPackage = loadIoPackage;
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return dirOrIoPack.common.compact === true;
|
|
52
|
+
function getAdapterExecutionMode(adapterDir) {
|
|
53
|
+
const ioPackage = loadIoPackage(adapterDir);
|
|
54
|
+
return ioPackage.common.mode;
|
|
52
55
|
}
|
|
53
|
-
exports.
|
|
56
|
+
exports.getAdapterExecutionMode = getAdapterExecutionMode;
|
|
54
57
|
/**
|
|
55
58
|
* Locates an adapter's main file
|
|
56
59
|
* @param adapterDir The directory the adapter resides in
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -98,7 +102,13 @@ function testAdapter(adapterDir, options = {}) {
|
|
|
98
102
|
harness.removeAllListeners();
|
|
99
103
|
});
|
|
100
104
|
it("The adapter starts", function () {
|
|
105
|
+
var _a;
|
|
101
106
|
this.timeout(60000);
|
|
107
|
+
const allowedExitCodes = new Set((_a = options.allowedExitCodes) !== null && _a !== void 0 ? _a : []);
|
|
108
|
+
// Schedule adapters are allowed to "immediately" exit with code 0
|
|
109
|
+
if (harness.getAdapterExecutionMode() === "schedule") {
|
|
110
|
+
allowedExitCodes.add(0);
|
|
111
|
+
}
|
|
102
112
|
return new Promise((resolve, reject) => {
|
|
103
113
|
// Register a handler to check the alive state and exit codes
|
|
104
114
|
harness
|
|
@@ -114,8 +124,7 @@ function testAdapter(adapterDir, options = {}) {
|
|
|
114
124
|
}
|
|
115
125
|
})
|
|
116
126
|
.on("failed", (code) => {
|
|
117
|
-
if (
|
|
118
|
-
options.allowedExitCodes.indexOf(code) === -1) {
|
|
127
|
+
if (!allowedExitCodes.has(code)) {
|
|
119
128
|
reject(new Error(`The adapter startup was interrupted unexpectedly with ${typeof code === "number"
|
|
120
129
|
? "code"
|
|
121
130
|
: "signal"} ${code}`));
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -136,7 +140,6 @@ class DBConnection extends events_1.default {
|
|
|
136
140
|
if (wasRunning)
|
|
137
141
|
await this.start();
|
|
138
142
|
}
|
|
139
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
140
143
|
setSystemConfig(systemConfig) {
|
|
141
144
|
const systemFilename = path.join(this.testDataDir, `${this.appName}.json`);
|
|
142
145
|
(0, fs_extra_1.writeJSONSync)(systemFilename, systemConfig, { spaces: 2 });
|
|
@@ -276,9 +279,7 @@ class DBConnection extends events_1.default {
|
|
|
276
279
|
}
|
|
277
280
|
return this._statesClient.subscribeMessage(id);
|
|
278
281
|
}
|
|
279
|
-
pushMessage(instanceId,
|
|
280
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
281
|
-
msg, callback) {
|
|
282
|
+
pushMessage(instanceId, msg, callback) {
|
|
282
283
|
if (!this._statesClient) {
|
|
283
284
|
throw new Error("States DB is not running");
|
|
284
285
|
}
|
|
@@ -61,6 +61,7 @@ export declare class TestHarness extends EventEmitter {
|
|
|
61
61
|
* Updates the adapter config. The changes can be a subset of the target object
|
|
62
62
|
*/
|
|
63
63
|
changeAdapterConfig(adapterName: string, changes: Record<string, any>): Promise<void>;
|
|
64
|
+
getAdapterExecutionMode(): ioBroker.AdapterCommon["mode"];
|
|
64
65
|
/** Enables the sendTo method */
|
|
65
66
|
enableSendTo(): Promise<void>;
|
|
66
67
|
private sendToID;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -222,6 +226,9 @@ class TestHarness extends events_1.EventEmitter {
|
|
|
222
226
|
await this.dbConnection.setObject(adapterInstanceId, obj);
|
|
223
227
|
}
|
|
224
228
|
}
|
|
229
|
+
getAdapterExecutionMode() {
|
|
230
|
+
return (0, adapterTools_1.getAdapterExecutionMode)(this.testAdapterDir);
|
|
231
|
+
}
|
|
225
232
|
/** Enables the sendTo method */
|
|
226
233
|
async enableSendTo() {
|
|
227
234
|
await this.dbConnection.setObject(fromAdapterID, {
|
|
@@ -232,9 +239,7 @@ class TestHarness extends events_1.EventEmitter {
|
|
|
232
239
|
this.dbConnection.subscribeMessage(fromAdapterID);
|
|
233
240
|
}
|
|
234
241
|
/** Sends a message to an adapter instance */
|
|
235
|
-
sendTo(target, command,
|
|
236
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
237
|
-
message, callback) {
|
|
242
|
+
sendTo(target, command, message, callback) {
|
|
238
243
|
const stateChangedHandler = (id, state) => {
|
|
239
244
|
if (id === `messagebox.${fromAdapterID}`) {
|
|
240
245
|
callback(state.message);
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -111,6 +115,19 @@ function validatePackageFiles(adapterDir) {
|
|
|
111
115
|
it(`The repository type is "git"`, () => {
|
|
112
116
|
(0, chai_1.expect)(packageContent.repository.type).to.equal("git");
|
|
113
117
|
});
|
|
118
|
+
it("npm is not listed as a dependency", () => {
|
|
119
|
+
for (const depType of [
|
|
120
|
+
"dependencies",
|
|
121
|
+
"devDependencies",
|
|
122
|
+
"optionalDependencies",
|
|
123
|
+
"peerDependencies",
|
|
124
|
+
]) {
|
|
125
|
+
if ((0, typeguards_1.isObject)(packageContent[depType]) &&
|
|
126
|
+
"npm" in packageContent[depType]) {
|
|
127
|
+
throw new chai_1.AssertionError(`npm must not be listed in ${depType}, found "${packageContent[depType].npm}"!`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
114
131
|
});
|
|
115
132
|
describe(`Check contents of io-package.json`, () => {
|
|
116
133
|
var _a;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iobroker/testing",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.5",
|
|
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",
|
|
@@ -38,38 +38,38 @@
|
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://github.com/AlCalzone/testing#readme",
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@alcalzone/release-script": "^3.5.
|
|
42
|
-
"@alcalzone/release-script-plugin-license": "^3.5.
|
|
43
|
-
"@iobroker/adapter-core": "^2.
|
|
41
|
+
"@alcalzone/release-script": "^3.5.4",
|
|
42
|
+
"@alcalzone/release-script-plugin-license": "^3.5.3",
|
|
43
|
+
"@iobroker/adapter-core": "^2.6.0",
|
|
44
44
|
"@tsconfig/node12": "^1.0.9",
|
|
45
45
|
"@types/chai": "^4.3.0",
|
|
46
|
-
"@types/chai-as-promised": "^7.1.
|
|
46
|
+
"@types/chai-as-promised": "^7.1.5",
|
|
47
47
|
"@types/debug": "4.1.7",
|
|
48
48
|
"@types/fs-extra": "^9.0.13",
|
|
49
|
-
"@types/iobroker": "^
|
|
50
|
-
"@types/mocha": "^9.
|
|
51
|
-
"@types/node": "^16.
|
|
52
|
-
"@types/sinon": "^10.0.
|
|
49
|
+
"@types/iobroker": "^4.0.1",
|
|
50
|
+
"@types/mocha": "^9.1.0",
|
|
51
|
+
"@types/node": "^16.11.26",
|
|
52
|
+
"@types/sinon": "^10.0.11",
|
|
53
53
|
"@types/sinon-chai": "^3.2.8",
|
|
54
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
55
|
-
"@typescript-eslint/parser": "^
|
|
56
|
-
"eslint": "^
|
|
57
|
-
"eslint-config-prettier": "^8.
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^5.13.0",
|
|
55
|
+
"@typescript-eslint/parser": "^5.13.0",
|
|
56
|
+
"eslint": "^8.10.0",
|
|
57
|
+
"eslint-config-prettier": "^8.5.0",
|
|
58
58
|
"eslint-plugin-prettier": "^4.0.0",
|
|
59
59
|
"prettier": "^2.5.1",
|
|
60
60
|
"rimraf": "^3.0.2",
|
|
61
61
|
"source-map-support": "^0.5.21",
|
|
62
|
-
"ts-node": "^10.
|
|
63
|
-
"typescript": "~4.
|
|
62
|
+
"ts-node": "^10.6.0",
|
|
63
|
+
"typescript": "~4.6.2"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"alcalzone-shared": "~4.0.1",
|
|
67
|
-
"chai": "^4.3.
|
|
67
|
+
"chai": "^4.3.6",
|
|
68
68
|
"chai-as-promised": "^7.1.1",
|
|
69
69
|
"debug": "^4.3.3",
|
|
70
|
-
"fs-extra": "^10.0.
|
|
71
|
-
"mocha": "^9.1
|
|
72
|
-
"sinon": "^
|
|
70
|
+
"fs-extra": "^10.0.1",
|
|
71
|
+
"mocha": "^9.2.1",
|
|
72
|
+
"sinon": "^13.0.1",
|
|
73
73
|
"sinon-chai": "^3.7.0"
|
|
74
74
|
}
|
|
75
75
|
}
|