diff --git a/.changeset/petite-zebras-read.md b/.changeset/petite-zebras-read.md
new file mode 100644
index 0000000..9412ec3
--- /dev/null
+++ b/.changeset/petite-zebras-read.md
@@ -0,0 +1,3 @@
+---
+---
+Add integration tests for inspector, logs-react, and json-schema-to-react-tree packages.
diff --git a/packages/inspector/__mocks__/logs-react.ts b/packages/inspector/__mocks__/logs-react.ts
new file mode 100644
index 0000000..c9f09b1
--- /dev/null
+++ b/packages/inspector/__mocks__/logs-react.ts
@@ -0,0 +1 @@
+export const JSONRPCLogger = () => null;
diff --git a/packages/inspector/__mocks__/monaco-editor.ts b/packages/inspector/__mocks__/monaco-editor.ts
new file mode 100644
index 0000000..1046dfe
--- /dev/null
+++ b/packages/inspector/__mocks__/monaco-editor.ts
@@ -0,0 +1 @@
+export default {} as unknown;
diff --git a/packages/inspector/__mocks__/monaco.ts b/packages/inspector/__mocks__/monaco.ts
new file mode 100644
index 0000000..42b1ed8
--- /dev/null
+++ b/packages/inspector/__mocks__/monaco.ts
@@ -0,0 +1,2 @@
+export const MonacoEditor = () => null;
+export const addDiagnostics = () => {};
diff --git a/packages/inspector/__mocks__/worker.ts b/packages/inspector/__mocks__/worker.ts
new file mode 100644
index 0000000..ff8b4c5
--- /dev/null
+++ b/packages/inspector/__mocks__/worker.ts
@@ -0,0 +1 @@
+export default {};
diff --git a/packages/inspector/package.json b/packages/inspector/package.json
index cd5c6c8..d9d134e 100644
--- a/packages/inspector/package.json
+++ b/packages/inspector/package.json
@@ -24,7 +24,7 @@
},
"scripts": {
"start": "vite",
- "test": "",
+ "test": "vitest run",
"build:package": "vite build && tsc --emitDeclarationOnly",
"clean:package": "rm -rf dist && rm -rf tsconfig.tsbuildinfo",
"lint": "eslint 'src/**/*.{ts,tsx}'"
diff --git a/packages/inspector/src/Inspector.integration.test.tsx b/packages/inspector/src/Inspector.integration.test.tsx
new file mode 100644
index 0000000..daea51b
--- /dev/null
+++ b/packages/inspector/src/Inspector.integration.test.tsx
@@ -0,0 +1,50 @@
+import { render, screen, fireEvent, waitFor } from '@testing-library/react';
+import React from 'react';
+import { vi, expect, test } from 'vitest';
+
+// Stub monaco-editor and workers
+vi.mock('monaco-editor', () => ({}), { virtual: true });
+vi.mock('monaco-editor/esm/vs/editor/editor.worker?worker', () => ({}), { virtual: true });
+vi.mock('monaco-editor/esm/vs/language/json/json.worker?worker', () => ({}), { virtual: true });
+vi.mock('monaco-editor/esm/vs/language/css/css.worker?worker', () => ({}), { virtual: true });
+vi.mock('monaco-editor/esm/vs/language/html/html.worker?worker', () => ({}), { virtual: true });
+vi.mock('monaco-editor/esm/vs/language/typescript/ts.worker?worker', () => ({}), { virtual: true });
+vi.mock('../src/containers/userWorker.ts', () => ({}), { virtual: true });
+vi.mock('react-resizable-panels', () => ({
+ PanelGroup: ({ children }: { children: React.ReactNode }) =>
{children}
,
+ Panel: ({ children }: { children: React.ReactNode }) => {children}
,
+ PanelResizeHandle: () => ,
+ ImperativePanelGroupHandle: class {},
+}));
+
+import Inspector from './containers/Inspector';
+
+// Mock useTransport to avoid real network calls
+vi.mock('@open-rpc/monaco-editor-react', () => ({
+ MonacoEditor: () => null,
+ addDiagnostics: () => null,
+}));
+vi.mock('./hooks/useTransport', () => {
+ const sendData = vi.fn().mockResolvedValue({ foo: 'bar' });
+ const transport = {
+ sendData,
+ subscribe: vi.fn(),
+ unsubscribe: vi.fn(),
+ close: vi.fn(),
+ connect: vi.fn(),
+ };
+ return { default: () => [transport, vi.fn(), undefined, true] };
+});
+
+test('play button sends request and displays log', async () => {
+ render(
+
+ );
+ const playButton = screen.getByRole('button', { name: /play/i });
+ fireEvent.click(playButton);
+ await waitFor(() => screen.getByText('foo'));
+ expect(screen.getByText('foo')).toBeInTheDocument();
+});
diff --git a/packages/inspector/src/test/setup.ts b/packages/inspector/src/test/setup.ts
new file mode 100644
index 0000000..7b0828b
--- /dev/null
+++ b/packages/inspector/src/test/setup.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/packages/inspector/vitest.config.ts b/packages/inspector/vitest.config.ts
new file mode 100644
index 0000000..b60c242
--- /dev/null
+++ b/packages/inspector/vitest.config.ts
@@ -0,0 +1,28 @@
+import { defineConfig } from 'vitest/config';
+import { resolve } from 'path';
+
+export default defineConfig({
+ resolve: {
+ alias: {
+ '@open-rpc/monaco-editor-react': resolve(__dirname, './__mocks__/monaco.ts'),
+ '@open-rpc/logs-react': resolve(__dirname, './__mocks__/logs-react.ts'),
+ 'monaco-editor': resolve(__dirname, './__mocks__/monaco-editor.ts'),
+ 'monaco-editor/esm/vs/editor/editor.worker?worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/editor/editor.worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/json/json.worker?worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/json/json.worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/css/css.worker?worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/css/css.worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/html/html.worker?worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/html/html.worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/typescript/ts.worker?worker': resolve(__dirname, './__mocks__/worker.ts'),
+ 'monaco-editor/esm/vs/language/typescript/ts.worker': resolve(__dirname, './__mocks__/worker.ts'),
+ './containers/userWorker': resolve(__dirname, './__mocks__/worker.ts'),
+ },
+ },
+ test: {
+ environment: 'jsdom',
+ globals: true,
+ setupFiles: ['./src/test/setup.ts'],
+ },
+});
diff --git a/packages/json-schema-to-react-tree/package.json b/packages/json-schema-to-react-tree/package.json
index 106e403..2253f56 100644
--- a/packages/json-schema-to-react-tree/package.json
+++ b/packages/json-schema-to-react-tree/package.json
@@ -22,7 +22,7 @@
"scripts": {
"start": "vite",
"build": "vite build",
- "test": "",
+ "test": "vitest run",
"clean:package": "rm -rf dist && rm -rf tsconfig.tsbuildinfo",
"build:package": "vite build && tsc --emitDeclarationOnly",
"lint": "eslint 'src/**/*.{ts,tsx}'"
diff --git a/packages/json-schema-to-react-tree/src/JSONSchemaTree.integration.test.tsx b/packages/json-schema-to-react-tree/src/JSONSchemaTree.integration.test.tsx
new file mode 100644
index 0000000..a03eb77
--- /dev/null
+++ b/packages/json-schema-to-react-tree/src/JSONSchemaTree.integration.test.tsx
@@ -0,0 +1,9 @@
+import { render, screen } from '@testing-library/react';
+import React from 'react';
+import { expect, test } from 'vitest';
+import JSONSchemaTree from './containers/JSONSchemaTree';
+
+test('renders properties from schema', () => {
+ render();
+ expect(screen.getByText('Object')).toBeInTheDocument();
+});
diff --git a/packages/json-schema-to-react-tree/src/test/setup.ts b/packages/json-schema-to-react-tree/src/test/setup.ts
new file mode 100644
index 0000000..7b0828b
--- /dev/null
+++ b/packages/json-schema-to-react-tree/src/test/setup.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/packages/json-schema-to-react-tree/vitest.config.ts b/packages/json-schema-to-react-tree/vitest.config.ts
new file mode 100644
index 0000000..5fc850c
--- /dev/null
+++ b/packages/json-schema-to-react-tree/vitest.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ environment: 'jsdom',
+ globals: true,
+ setupFiles: ['./src/test/setup.ts'],
+ },
+});
diff --git a/packages/logs-react/__mocks__/monaco-editor.ts b/packages/logs-react/__mocks__/monaco-editor.ts
new file mode 100644
index 0000000..1046dfe
--- /dev/null
+++ b/packages/logs-react/__mocks__/monaco-editor.ts
@@ -0,0 +1 @@
+export default {} as unknown;
diff --git a/packages/logs-react/__mocks__/monaco.ts b/packages/logs-react/__mocks__/monaco.ts
new file mode 100644
index 0000000..42b1ed8
--- /dev/null
+++ b/packages/logs-react/__mocks__/monaco.ts
@@ -0,0 +1,2 @@
+export const MonacoEditor = () => null;
+export const addDiagnostics = () => {};
diff --git a/packages/logs-react/__mocks__/worker.ts b/packages/logs-react/__mocks__/worker.ts
new file mode 100644
index 0000000..ff8b4c5
--- /dev/null
+++ b/packages/logs-react/__mocks__/worker.ts
@@ -0,0 +1 @@
+export default {};
diff --git a/packages/logs-react/package.json b/packages/logs-react/package.json
index 8768b14..90bb07b 100644
--- a/packages/logs-react/package.json
+++ b/packages/logs-react/package.json
@@ -25,6 +25,7 @@
},
"scripts": {
"start": "vite",
+ "test": "vitest run",
"build:package": "vite build && tsc --emitDeclarationOnly",
"clean:package": "rm -rf dist && rm -rf tsconfig.tsbuildinfo",
"lint": "eslint 'src/**/*.{ts,tsx}'"
diff --git a/packages/logs-react/src/JSONRPCLogger.integration.test.tsx b/packages/logs-react/src/JSONRPCLogger.integration.test.tsx
new file mode 100644
index 0000000..37e2087
--- /dev/null
+++ b/packages/logs-react/src/JSONRPCLogger.integration.test.tsx
@@ -0,0 +1,24 @@
+import { render, screen } from '@testing-library/react';
+import React from 'react';
+import { expect, test } from 'vitest';
+import JSONRPCLogger, { JSONRPCLog } from './exports';
+
+const logs: JSONRPCLog[] = [
+ {
+ type: 'request',
+ method: 'foo',
+ timestamp: new Date(),
+ payload: { jsonrpc: '2.0', method: 'foo', id: 1 },
+ },
+ {
+ type: 'response',
+ method: 'foo',
+ timestamp: new Date(),
+ payload: { jsonrpc: '2.0', result: 'bar', id: 1 },
+ },
+];
+
+test('renders logs with method names', () => {
+ render();
+ expect(screen.getAllByText('foo').length).toBeGreaterThan(0);
+});
diff --git a/packages/logs-react/src/test/setup.ts b/packages/logs-react/src/test/setup.ts
new file mode 100644
index 0000000..886d4b2
--- /dev/null
+++ b/packages/logs-react/src/test/setup.ts
@@ -0,0 +1,4 @@
+import '@testing-library/jest-dom';
+
+// JSDOM doesn't implement scrollIntoView
+HTMLElement.prototype.scrollIntoView = function () {};
diff --git a/packages/logs-react/vitest.config.ts b/packages/logs-react/vitest.config.ts
new file mode 100644
index 0000000..3e868f5
--- /dev/null
+++ b/packages/logs-react/vitest.config.ts
@@ -0,0 +1,17 @@
+import { defineConfig } from 'vitest/config';
+import { resolve } from 'path';
+
+export default defineConfig({
+ resolve: {
+ alias: {
+ 'monaco-editor': resolve(__dirname, './__mocks__/monaco-editor.ts'),
+ 'monaco-editor/esm/vs/editor/editor.worker?worker': resolve(__dirname, './__mocks__/worker.ts'),
+ '@open-rpc/monaco-editor-react': resolve(__dirname, './__mocks__/monaco.ts'),
+ },
+ },
+ test: {
+ environment: 'jsdom',
+ globals: true,
+ setupFiles: ['./src/test/setup.ts'],
+ },
+});