{"_id":"@avimate/msfs-jest-utils","_rev":"2-d1690dc162b151fb3b428e531f976d54","name":"@avimate/msfs-jest-utils","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@avimate/msfs-jest-utils","version":"1.0.0","keywords":["msfs","testing","unit-test","jsdom","simvar","coherent"],"author":"","license":"MIT","_id":"@avimate/msfs-jest-utils@1.0.0","maintainers":[{"name":"ivan.slepchenko","email":"ivan.slepchenko@zettech.com"}],"homepage":"https://github.com/ivan-slepchenko/msfs-unit-test-framework#readme","bugs":{"url":"https://github.com/ivan-slepchenko/msfs-unit-test-framework/issues"},"dist":{"shasum":"e0802211f9387dfbbd8c53fc7bf780b4f894e826","tarball":"https://registry.npmjs.org/@avimate/msfs-jest-utils/-/msfs-jest-utils-1.0.0.tgz","fileCount":29,"integrity":"sha512-X1MhnZV6nCvzJWQfK0EIw2SBrbRofUAVAQJwMa1XKEP2euCxLxtGhVBDEg71ywke2zEH6zUv5hUDykBHa1zUnw==","signatures":[{"sig":"MEQCIH/BmjTMKWvHwoScHJo33p0aqxzz0DQs9GZfqDYE+tBmAiBDtwdSt4SVVtYQlEAWP4jJnpHoiuzC62nwx07wbtsbAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149339},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":"./dist/index.js","./setupTests":"./dist/setupTests.js","./mocks/SDKAdapter":"./dist/mocks/SDKAdapter.js","./mocks/SimVarMock":"./dist/mocks/SimVarMock.js","./mocks/MSFSGlobals":"./dist/mocks/MSFSGlobals.js","./mocks/CoherentMock":"./dist/mocks/CoherentMock.js","./mocks/GarminSDKAdapter":"./dist/mocks/GarminSDKAdapter.js","./test-utils/TestEnvironment":"./dist/test-utils/TestEnvironment.js","./test-utils/ComponentTestHelper":"./dist/test-utils/ComponentTestHelper.js","./test-utils/ObservableTestHelper":"./dist/test-utils/ObservableTestHelper.js"},"scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch"},"_npmUser":{"name":"ivan.slepchenko","email":"ivan.slepchenko@zettech.com"},"repository":{"url":"git+https://github.com/ivan-slepchenko/msfs-unit-test-framework.git","type":"git"},"_npmVersion":"10.9.0","description":"Unit testing framework for MSFS instruments with DOM support via jsdom","directories":{},"_nodeVersion":"22.12.0","dependencies":{"@microsoft/msfs-sdk":"^2.2.3","@microsoft/msfs-types":"^1.14.6","@microsoft/msfs-garminsdk":"^2.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","jsdom":"^23.0.0","ts-jest":"^29.1.0","typescript":"^5.8.3","@types/jest":"^29.5.0","@types/node":"^18.11.18","jest-environment-jsdom":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/msfs-jest-utils_1.0.0_1767306052892_0.3381318259277799","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@avimate/msfs-jest-utils","version":"1.0.1","description":"Unit testing framework for MSFS instruments with DOM support via jsdom","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":"./dist/index.js","./setupTests":"./dist/setupTests.js","./mocks/SDKAdapter":"./dist/mocks/SDKAdapter.js","./mocks/GarminSDKAdapter":"./dist/mocks/GarminSDKAdapter.js","./mocks/MSFSGlobals":"./dist/mocks/MSFSGlobals.js","./mocks/SimVarMock":"./dist/mocks/SimVarMock.js","./mocks/CoherentMock":"./dist/mocks/CoherentMock.js","./test-utils/ComponentTestHelper":"./dist/test-utils/ComponentTestHelper.js","./test-utils/TestEnvironment":"./dist/test-utils/TestEnvironment.js","./test-utils/ObservableTestHelper":"./dist/test-utils/ObservableTestHelper.js"},"scripts":{"build":"tsc","test":"jest","test:watch":"jest --watch"},"keywords":["msfs","testing","unit-test","jsdom","simvar","coherent"],"author":"","license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/ivan-slepchenko/msfs-unit-test-framework.git"},"bugs":{"url":"https://github.com/ivan-slepchenko/msfs-unit-test-framework/issues"},"homepage":"https://github.com/ivan-slepchenko/msfs-unit-test-framework#readme","dependencies":{"@microsoft/msfs-garminsdk":"^2.2.3","@microsoft/msfs-sdk":"^2.2.3","@microsoft/msfs-types":"^1.14.6"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^18.11.18","jest":"^29.5.0","jest-environment-jsdom":"^29.5.0","jsdom":"^23.0.0","ts-jest":"^29.1.0","typescript":"^5.8.3"},"_id":"@avimate/msfs-jest-utils@1.0.1","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-2nW5Xwe1o6DVr2RxSXl/V/ed9XT0WXSJlRcW0J0H3pA+GyS+FKAFisCUhMzrrt+goast797Sq/4VQwPIkfQYaQ==","shasum":"9ed74cf26006d7290705347833a6f9d9a44ce60d","tarball":"https://registry.npmjs.org/@avimate/msfs-jest-utils/-/msfs-jest-utils-1.0.1.tgz","fileCount":29,"unpackedSize":148534,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGAFdYVfT3b8ywoHv9HEwWxah4Tfe+vpnfXIaJ5BSES6AiBvyX+Bk7qOF1TreVOnz5Rw+5WYK6d+rI7UE3TJZpv71g=="}]},"_npmUser":{"name":"ivan.slepchenko","email":"ivan.slepchenko@zettech.com"},"directories":{},"maintainers":[{"name":"ivan.slepchenko","email":"ivan.slepchenko@zettech.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/msfs-jest-utils_1.0.1_1767306569218_0.28943607146967354"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-01T22:20:52.764Z","modified":"2026-01-01T22:29:29.585Z","1.0.0":"2026-01-01T22:20:53.054Z","1.0.1":"2026-01-01T22:29:29.356Z"},"bugs":{"url":"https://github.com/ivan-slepchenko/msfs-unit-test-framework/issues"},"license":"MIT","homepage":"https://github.com/ivan-slepchenko/msfs-unit-test-framework#readme","keywords":["msfs","testing","unit-test","jsdom","simvar","coherent"],"repository":{"type":"git","url":"git+https://github.com/ivan-slepchenko/msfs-unit-test-framework.git"},"description":"Unit testing framework for MSFS instruments with DOM support via jsdom","maintainers":[{"name":"ivan.slepchenko","email":"ivan.slepchenko@zettech.com"}],"readme":"# MSFS Unit Test Framework\r\n\r\nUnit testing framework for MSFS HTML/JS instruments (Jest + JSDOM).\r\n\r\n## Features\r\n\r\n- ✅ **Full DOM support** - uses jsdom for component rendering\r\n- ✅ **FSComponent.render()** - render components and test DOM elements\r\n- ✅ **SimVar and Coherent mocks** - complete simulator API emulation\r\n- ✅ **Jest integration** - ready-to-use testing utilities\r\n- ✅ **TypeScript support** - full type safety\r\n\r\n## Installation\r\n\r\n### As a library (recommended)\r\n\r\n```bash\r\nnpm install --save-dev @avimate/msfs-jest-utils\r\n```\r\n\r\n### Local development\r\n\r\n```bash\r\nnpm install\r\nnpm run build\r\n```\r\n\r\n## Usage\r\n\r\n### Basic Example\r\n\r\n```typescript\r\nimport { TestEnvironment, ComponentTestHelper } from '@avimate/msfs-jest-utils';\r\nimport { MyComponent } from '../html_ui/MyComponent';\r\n\r\ndescribe('MyComponent', () => {\r\n  let env: TestEnvironment;\r\n  let helper: ComponentTestHelper;\r\n\r\n  beforeEach(() => {\r\n    env = new TestEnvironment();\r\n    env.setup();\r\n    helper = new ComponentTestHelper(env);\r\n  });\r\n\r\n  afterEach(() => {\r\n    helper.cleanup();\r\n    env.teardown();\r\n  });\r\n\r\n  test('should render component', () => {\r\n    const { element } = helper.renderComponent(MyComponent, {\r\n      value: 42\r\n    });\r\n\r\n    expect(element).toBeTruthy();\r\n    expect(element.textContent).toContain('42');\r\n  });\r\n\r\n  test('should update when SimVar changes', () => {\r\n    env.setSimVar('L:MY_VALUE', 'number', 10);\r\n    \r\n    const { element } = helper.renderComponent(MyComponent, {\r\n      valueSource: env.getSubject('L:MY_VALUE', 'number')\r\n    });\r\n\r\n    expect(helper.getTextContent('.value')).toBe('10');\r\n    \r\n    env.setSimVar('L:MY_VALUE', 'number', 20);\r\n    // Wait for subscription update\r\n    await helper.waitForUpdate(50);\r\n    \r\n    expect(helper.getTextContent('.value')).toBe('20');\r\n  });\r\n});\r\n```\r\n\r\n### Testing DOM Elements\r\n\r\n```typescript\r\ntest('should have correct CSS classes', () => {\r\n  const { element } = helper.renderComponent(MyComponent, {});\r\n  \r\n  expect(helper.hasClass('.my-component', 'active')).toBe(true);\r\n  expect(helper.getAttribute('.my-component', 'data-state')).toBe('ready');\r\n});\r\n\r\ntest('should apply styles correctly', () => {\r\n  const { element } = helper.renderComponent(MyComponent, {\r\n    width: 100,\r\n    height: 200\r\n  });\r\n  \r\n  expect(helper.getStyle('.my-component', 'width')).toBe('100px');\r\n});\r\n```\r\n\r\n### Working with SimVar\r\n\r\n```typescript\r\ntest('should read SimVar values', () => {\r\n  env.setSimVar('L:TEST_VALUE', 'number', 42);\r\n  \r\n  const value = env.getSimVar('L:TEST_VALUE', 'number');\r\n  expect(value).toBe(42);\r\n});\r\n\r\ntest('should track SimVar access', () => {\r\n  env.setSimVar('L:TEST', 'number', 10);\r\n  SimVar.GetSimVarValue('L:TEST', 'number');\r\n  \r\n  const log = env.getSimVarAccessLog();\r\n  expect(log).toHaveLength(1);\r\n  expect(log[0].operation).toBe('get');\r\n});\r\n```\r\n\r\n## API\r\n\r\n### TestEnvironment\r\n\r\n- `setup()` - initialize test environment\r\n- `teardown()` - cleanup after tests\r\n- `reset()` - reset mocks\r\n- `setSimVar(name, unit, value)` - set SimVar value\r\n- `getSimVar(name, unit)` - get SimVar value\r\n- `getDocument()` - get jsdom document\r\n- `getWindow()` - get jsdom window\r\n\r\n### ComponentTestHelper\r\n\r\n- `renderComponent(ComponentClass, props)` - render component\r\n- `querySelector(selector)` - find element\r\n- `getTextContent(selector)` - get text content\r\n- `hasClass(selector, className)` - check class\r\n- `getAttribute(selector, attrName)` - get attribute\r\n- `getStyle(selector, property)` - get style\r\n- `waitForUpdate(ms)` - wait for update\r\n- `cleanup()` - cleanup\r\n\r\n## Structure\r\n\r\n```\r\nmsfs-unit-test-framework/\r\n├── src/\r\n│   ├── mocks/\r\n│   │   ├── SimVarMock.ts      # SimVar API mock\r\n│   │   ├── CoherentMock.ts     # Coherent API mock\r\n│   │   └── index.ts\r\n│   ├── test-utils/\r\n│   │   ├── TestEnvironment.ts  # Environment setup\r\n│   │   ├── ComponentTestHelper.ts # Component utilities\r\n│   │   └── index.ts\r\n│   ├── setupTests.ts           # Jest setup\r\n│   └── index.ts                # Main export\r\n├── tests/                      # Test examples\r\n├── jest.config.js\r\n├── tsconfig.json\r\n└── package.json\r\n```\r\n\r\n## Examples\r\n\r\nSee the `tests/` folder for usage examples.\r\n\r\n\r\n\r\n\r\n","readmeFilename":"README.md"}