@iobroker/testing 4.1.2 → 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.
Files changed (35) hide show
  1. package/README.md +1 -1
  2. package/build/lib/adapterTools.d.ts +0 -1
  3. package/build/lib/adapterTools.js +13 -12
  4. package/build/lib/executeCommand.d.ts +0 -1
  5. package/build/lib/executeCommand.js +2 -3
  6. package/build/lib/str2regex.js +1 -2
  7. package/build/lib/testAdapter.d.ts +1 -0
  8. package/build/lib/testAdapter.js +1 -0
  9. package/build/tests/index.js +0 -1
  10. package/build/tests/integration/index.d.ts +0 -2
  11. package/build/tests/integration/index.js +2 -2
  12. package/build/tests/integration/lib/adapterSetup.js +16 -3
  13. package/build/tests/integration/lib/controllerSetup.js +1 -1
  14. package/build/tests/integration/lib/dbConnection.d.ts +0 -4
  15. package/build/tests/integration/lib/dbConnection.js +2 -2
  16. package/build/tests/integration/lib/harness.d.ts +0 -5
  17. package/build/tests/integration/lib/harness.js +2 -1
  18. package/build/tests/integration/lib/logger.d.ts +0 -1
  19. package/build/tests/integration/lib/logger.js +1 -3
  20. package/build/tests/integration/lib/tools.js +5 -6
  21. package/build/tests/packageFiles/index.js +21 -6
  22. package/build/tests/unit/harness/createMocks.d.ts +0 -1
  23. package/build/tests/unit/harness/createMocks.js +1 -2
  24. package/build/tests/unit/index.js +1 -2
  25. package/build/tests/unit/mocks/mockAdapter.d.ts +0 -1
  26. package/build/tests/unit/mocks/mockAdapter.js +2 -2
  27. package/build/tests/unit/mocks/mockAdapterCore.d.ts +0 -1
  28. package/build/tests/unit/mocks/mockAdapterCore.js +1 -2
  29. package/build/tests/unit/mocks/mockDatabase.d.ts +0 -2
  30. package/build/tests/unit/mocks/mockDatabase.js +2 -2
  31. package/build/tests/unit/mocks/mockLogger.d.ts +0 -1
  32. package/build/tests/unit/mocks/mockLogger.js +1 -2
  33. package/build/tests/unit/mocks/tools.d.ts +0 -1
  34. package/build/tests/unit/mocks/tools.js +3 -4
  35. 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
- This methods takes a mock database and adapter and creates 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.
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.
@@ -1,4 +1,3 @@
1
- /// <reference types="iobroker" />
2
1
  /**
3
2
  * Loads an adapter's package.json
4
3
  * @param adapterDir The directory the adapter resides in
@@ -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.getAdapterDependencies = exports.getAdapterFullName = exports.getAdapterName = exports.getAppName = exports.loadInstanceObjects = exports.loadAdapterCommon = exports.loadAdapterConfig = exports.locateAdapterMainFile = exports.getAdapterExecutionMode = exports.loadIoPackage = exports.loadNpmPackage = void 0;
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,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  export interface ExecuteCommandOptions {
3
2
  /** Whether the executed command should be logged to the stdout. Default: false */
4
3
  logCommandExecution: boolean;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.executeCommand = void 0;
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 (e) {
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;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.str2regex = void 0;
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 {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  // TODO: Do we need this file?
3
3
  // import * as utils from "@iobroker/adapter-core";
4
+ Object.defineProperty(exports, "__esModule", { value: true });
4
5
  // const adapter = utils.adapter({
5
6
  // name: "foo",
6
7
  // ready() {
@@ -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 */
@@ -1,5 +1,3 @@
1
- /// <reference types="iobroker" />
2
- /// <reference types="mocha" />
3
1
  import { TestHarness } from "./lib/harness";
4
2
  export interface TestAdapterOptions {
5
3
  allowedExitCodes?: (number | string)[];
@@ -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 = void 0;
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] = `file:./${tarballName}`;
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", "--production"], {
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", "--production"], {
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-var-requires
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-var-requires
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,2 +1 @@
1
- /// <reference types="iobroker" />
2
1
  export declare function createLogger(loglevel: ioBroker.LogLevel): ioBroker.Logger;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLogger = void 0;
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.getTestAdapterDir = exports.getTestDBDir = exports.getTestLogDir = exports.getTestDataDir = exports.getTestControllerDir = void 0;
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 = void 0;
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)(require(packagePath), `${filename} must contain an object!`).to.be.an("object");
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
  }
@@ -206,11 +218,13 @@ function validatePackageFiles(adapterDir) {
206
218
  iopackContent.common.noConfig === "true" ||
207
219
  iopackContent.common.adminUI?.config === "none";
208
220
  if (!hasNoConfigPage) {
209
- it("The adapter uses Material UI or JSON Config for the admin UI", () => {
221
+ it("The adapter uses a supported admin UI", () => {
210
222
  const hasSupportedUI = !!iopackContent.common.materialize ||
223
+ iopackContent.common.adminUI?.config === "html" ||
211
224
  iopackContent.common.adminUI?.config === "json" ||
212
225
  iopackContent.common.adminUI?.config === "materialize";
213
- (0, chai_1.expect)(hasSupportedUI, "Unsupported Admin UI, must be materialize or json config!").to.be.true;
226
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
227
+ (0, chai_1.expect)(hasSupportedUI, "Unsupported Admin UI, must be html, materialize or JSON config!").to.be.true;
214
228
  });
215
229
  }
216
230
  });
@@ -218,7 +232,9 @@ function validatePackageFiles(adapterDir) {
218
232
  beforeEach(function () {
219
233
  skipIfInvalid.call(this, "package.json", "io-package.json");
220
234
  });
235
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
221
236
  const packageContent = require(packageJsonPath);
237
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
222
238
  const iopackContent = require(ioPackageJsonPath);
223
239
  it("The name matches", () => {
224
240
  (0, chai_1.expect)("iobroker." + iopackContent.common.name).to.equal(packageContent.name);
@@ -254,4 +270,3 @@ function validatePackageFiles(adapterDir) {
254
270
  // });
255
271
  // });
256
272
  }
257
- exports.validatePackageFiles = validatePackageFiles;
@@ -1,4 +1,3 @@
1
- /// <reference types="iobroker" />
2
1
  import { MockDatabase } from "../mocks/mockDatabase";
3
2
  /**
4
3
  * Creates a new set of mocks, including a mock database and a mock adapter.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMocks = void 0;
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 = void 0;
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,4 +1,3 @@
1
- /// <reference types="iobroker" />
2
1
  import type { MockDatabase } from "./mockDatabase";
3
2
  import { MockLogger } from "./mockLogger";
4
3
  import { Mock } from "./tools";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAdapterMock = void 0;
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;
@@ -1,4 +1,3 @@
1
- /// <reference types="iobroker" />
2
1
  import { MockAdapter } from "./mockAdapter";
3
2
  import type { MockDatabase } from "./mockDatabase";
4
3
  interface MockAdapterConstructor {
@@ -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 = void 0;
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,5 +1,3 @@
1
- /// <reference types="iobroker" />
2
- /// <reference types="iobroker" />
3
1
  import type { MockAdapter } from "./mockAdapter";
4
2
  /**
5
3
  * A minimalistic version of ioBroker's Objects and States DB that just operates on a Map
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAsserts = exports.MockDatabase = void 0;
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,4 +1,3 @@
1
- /// <reference types="iobroker" />
2
1
  import { Mock } from "./tools";
3
2
  export type MockLogger = Mock<ioBroker.Logger> & {
4
3
  resetMock(): void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLoggerMock = void 0;
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,4 +1,3 @@
1
- /// <reference types="sinon" />
2
1
  import type { Equals, Overwrite } from "alcalzone-shared/types";
3
2
  export type IsAny<T> = Equals<T extends never ? false : true, boolean>;
4
3
  export type MockableMethods<T, All = Required<T>, NoAny = {
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stubAndPromisifyImplementedMethods = exports.doResetBehavior = exports.doResetHistory = void 0;
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": "4.1.2",
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 --ext .ts src",
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.7.0",
42
- "@alcalzone/release-script-plugin-license": "^3.5.9",
43
- "@iobroker/adapter-core": "^2.6.8",
44
- "@tsconfig/node14": "^1.0.3",
45
- "@types/chai": "^4.3.5",
46
- "@types/chai-as-promised": "^7.1.5",
47
- "@types/debug": "4.1.7",
48
- "@types/fs-extra": "^9.0.13",
49
- "@types/iobroker": "^4.0.5",
50
- "@types/mocha": "^10.0.1",
51
- "@types/node": "^18.16.3",
52
- "@types/sinon": "^10.0.13",
53
- "@types/sinon-chai": "^3.2.9",
54
- "@typescript-eslint/eslint-plugin": "^5.54.0",
55
- "@typescript-eslint/parser": "^5.59.8",
56
- "eslint": "^8.44.0",
57
- "eslint-config-prettier": "^8.8.0",
58
- "eslint-plugin-prettier": "^4.2.1",
59
- "prettier": "^2.8.8",
60
- "rimraf": "^3.0.2",
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.1",
63
- "typescript": "~4.9.3"
65
+ "ts-node": "^10.9.2",
66
+ "typescript": "~5.6.2"
64
67
  },
65
68
  "dependencies": {
66
- "alcalzone-shared": "~4.0.3",
67
- "chai": "^4.3.7",
68
- "chai-as-promised": "^7.1.1",
69
- "debug": "^4.3.4",
70
- "fs-extra": "^10.1.0",
71
- "mocha": "^10.2.0",
72
- "sinon": "^15.0.1",
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
  }