import fs from "node:fs"; import path from "node:path"; import stringify from "json-stable-stringify-without-jsonify"; import tmp from "tmp"; import {vi} from "vitest"; import yaml from "../../lib/util/yaml"; export const mockDir: string = tmp.dirSync().name; const configFile = path.join(mockDir, "configuration.yaml"); const stateFile = path.join(mockDir, "state.json"); const databaseFile = path.join(mockDir, "database.db"); export const DEFAULT_CONFIGURATION = { homeassistant: {enabled: false}, frontend: {enabled: false}, availability: {enabled: false}, mqtt: { base_topic: "zigbee2mqtt", server: "mqtt://localhost", }, serial: { port: "/dev/dummy", }, devices: { "0x18fc2600000d7ae2": { friendly_name: "bosch_radiator", }, "0x18fc2600000d7ae3": { friendly_name: "bosch_rm230z", }, "0x000b57fffec6a5b2": { retain: true, friendly_name: "bulb", description: "this is my bulb", }, "0x0017880104e45517": { retain: true, friendly_name: "remote", }, "0x0017880104e45520": { retain: false, friendly_name: "button", }, "0x0017880104e45521": { retain: false, friendly_name: "button_double_key", }, "0x0017880104e45522": { qos: 1, retain: false, friendly_name: "weather_sensor", }, "0x0017880104e45523": { retain: false, friendly_name: "occupancy_sensor", }, "0x0017880104e45524": { retain: false, friendly_name: "power_plug", }, "0x0017880104e45530": { retain: false, friendly_name: "button_double_key_interviewing", }, "0x0017880104e45540": { friendly_name: "ikea_onoff", }, "0x000b57fffec6a5b7": { retain: false, friendly_name: "bulb_2", }, "0x000b57fffec6a5b3": { retain: false, friendly_name: "bulb_color", }, "0x000b57fffec6a5b4": { retain: false, friendly_name: "bulb_color_2", }, "0x0017880104e45541": { retain: false, friendly_name: "wall_switch", }, "0x0017880104e45542": { retain: false, friendly_name: "wall_switch_double", }, "0x0017880104e45543": { retain: false, friendly_name: "led_controller_1", }, "0x0017880104e45544": { retain: false, friendly_name: "led_controller_2", }, "0x0017880104e45545": { retain: false, friendly_name: "dimmer_wall_switch", }, "0x0017880104e45547": { retain: false, friendly_name: "curtain", }, "0x0017880104e45548": { retain: false, friendly_name: "fan", }, "0x0017880104e45549": { retain: false, friendly_name: "siren", }, "0x0017880104e45529": { retain: false, friendly_name: "unsupported2", }, "0x0017880104e45550": { retain: false, friendly_name: "thermostat", }, "0x0017880104e45551": { retain: false, friendly_name: "smart vent", }, "0x0017880104e45552": { retain: false, friendly_name: "j1", }, "0x0017880104e45553": { retain: false, friendly_name: "bulb_enddevice", }, "0x0017880104e45559": { retain: false, friendly_name: "cc2530_router", }, "0x0017880104e45560": { retain: false, friendly_name: "livolo", }, "0x90fd9ffffe4b64ae": { retain: false, friendly_name: "tradfri_remote", }, "0x90fd9ffffe4b64af": { friendly_name: "roller_shutter", }, "0x90fd9ffffe4b64ax": { friendly_name: "ZNLDP12LM", }, "0x90fd9ffffe4b64aa": { friendly_name: "SP600_OLD", }, "0x90fd9ffffe4b64ab": { friendly_name: "SP600_NEW", }, "0x90fd9ffffe4b64ac": { friendly_name: "MKS-CM-W5", }, "0x0017880104e45526": { friendly_name: "GL-S-007ZS", }, "0x0017880104e43559": { friendly_name: "U202DST600ZB", }, "0xf4ce368a38be56a1": { retain: false, friendly_name: "zigfred_plus", front_surface_enabled: "true", dimmer_1_enabled: "true", dimmer_1_dimming_enabled: "true", dimmer_2_enabled: "true", dimmer_2_dimming_enabled: "true", dimmer_3_enabled: "true", dimmer_3_dimming_enabled: "true", dimmer_4_enabled: "true", dimmer_4_dimming_enabled: "true", cover_1_enabled: "true", cover_1_tilt_enabled: "true", cover_2_enabled: "true", cover_2_tilt_enabled: "true", }, "0x0017880104e44559": { friendly_name: "3157100_thermostat", }, "0x0017880104a44559": { friendly_name: "J1_cover", }, "0x0017882104a44559": { friendly_name: "TS0601_thermostat", }, "0x0017882104a44560": { friendly_name: "TS0601_switch", }, "0x0017882104a44562": { friendly_name: "TS0601_cover_switch", }, "0x0017882194e45543": { friendly_name: "QS-Zigbee-D02-TRIAC-2C-LN", }, "0x0017880104e45724": { friendly_name: "GLEDOPTO_2ID", }, "0x0017880104e45561": { friendly_name: "temperature_sensor", }, "0x0017880104e45562": { friendly_name: "heating_actuator", }, "0x000b57cdfec6a5b3": { friendly_name: "hue_twilight", }, "0x00124b00cfcf3298": { friendly_name: "fanbee", retain: true, }, }, groups: { 1: { friendly_name: "group_1", retain: false, }, 2: { friendly_name: "group_2", retain: false, }, 15071: { friendly_name: "group_tradfri_remote", retain: false, }, 11: { friendly_name: "group_with_tradfri", retain: false, }, 12: { friendly_name: "thermostat_group", retain: false, }, 14: { friendly_name: "switch_group", retain: false, }, 21: { friendly_name: "gledopto_group", }, 9: { friendly_name: "ha_discovery_group", }, 19: { friendly_name: "hue_twilight_group", }, }, }; export function writeDefaultConfiguration(config: unknown = undefined): void { config = config || DEFAULT_CONFIGURATION; yaml.writeIfChanged(configFile, config); } export function read(): ReturnType { return yaml.read(configFile); } export function removeConfiguration(): void { fs.rmSync(configFile, {force: true}); } export function writeEmptyState(): void { fs.writeFileSync(stateFile, stringify({})); } export function removeState(): void { fs.rmSync(stateFile, {force: true}); } export function stateExists(): boolean { return fs.existsSync(stateFile); } export function readState(): Record { return JSON.parse(fs.readFileSync(stateFile, "utf8")); } const defaultState = { "0x000b57fffec6a5b2": { state: "ON", brightness: 50, color_temp: 370, linkquality: 99, }, "0x0017880104e45517": { brightness: 255, }, 1: { state: "ON", }, }; export function getDefaultState(): typeof defaultState { return defaultState; } export function writeDefaultState(data: Record = defaultState): void { fs.writeFileSync(stateFile, stringify(data)); } export function writeEmptyDatabase(): void { fs.writeFileSync(databaseFile, ""); } export function removeDatabase(): void { fs.rmSync(databaseFile, {force: true}); } vi.mock("../../lib/util/data", async () => { const nodePath = await vi.importActual("node:path"); return { default: { joinPath: (file: string): string => nodePath.join(mockDir, file), getPath: (): string => mockDir, }, }; }); writeDefaultConfiguration(); writeDefaultState();