From e4213065ce420ba85e1315a5e1d72b4b2b47064f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 11:57:17 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=A7=B9=20[code=20health]=20Implement?= =?UTF-8?q?=20renderComponent=20component=20mounting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced the TODO stub in `renderComponent` (fsl/test/src/mocks.fx) to correctly mount the component by casting it to a function and evaluating it with the provided props. Added a unit test in `test.test.fx` to verify correct rendering behavior. Co-authored-by: Theaxiom <57013+Theaxiom@users.noreply.github.com> --- fsl/test/src/mocks.fx | 6 +++++- fsl/test/tests/test.test.fx | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/fsl/test/src/mocks.fx b/fsl/test/src/mocks.fx index a0c7323..ea04f8e 100644 --- a/fsl/test/src/mocks.fx +++ b/fsl/test/src/mocks.fx @@ -21,8 +21,12 @@ export async function renderComponent( component: unknown, props?: Record ): Promise { - // TODO: Mount the component using the Forge runtime in test mode const container = document.createElement('div') + + const componentFn = component as (props: Record) => Element + const element = componentFn(props ?? {}) + container.appendChild(element) + document.body.appendChild(container) return { diff --git a/fsl/test/tests/test.test.fx b/fsl/test/tests/test.test.fx index ffab7b5..5533da7 100644 --- a/fsl/test/tests/test.test.fx +++ b/fsl/test/tests/test.test.fx @@ -1,6 +1,6 @@ // forge:test self-tests // These tests verify the test runner's own assertion API. -import { describe, it, expect } from '../src/index.fx' +import { describe, it, expect, renderComponent } from '../src/index.fx' describe('expect().toBe', () => { it('passes for identical primitives', () => { @@ -28,3 +28,20 @@ describe('expect().toThrow', () => { expect(() => { throw new Error('boom') }).toThrow('boom') }) }) + +describe('renderComponent', () => { + it('mounts a component and renders its output', async () => { + // Dummy component function mimicking compiled Forge output + const MyComponent = (props: { title?: string } = {}) => { + const el = document.createElement('div') + el.textContent = props.title ?? 'Hello World' + return el + } + + const { getByText, unmount } = await renderComponent(MyComponent, { title: 'Test Component' }) + + expect(getByText('Test Component')).toBeDefined() + + unmount() + }) +}) From 800984ca2992a7f35b611eec8a136b917b2ed7b1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Apr 2026 01:15:43 +0000 Subject: [PATCH 2/2] fix: support Element and fn+props shapes in renderComponent; add Element test coverage Agent-Logs-Url: https://github.com/100monkeys-ai/forgejs/sessions/eebfc62a-52d9-4ec4-8f25-85fd59f1961f Co-authored-by: Theaxiom <57013+Theaxiom@users.noreply.github.com> --- fsl/test/src/mocks.fx | 10 ++++++++-- fsl/test/tests/test.test.fx | 11 +++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/fsl/test/src/mocks.fx b/fsl/test/src/mocks.fx index ea04f8e..be0a42f 100644 --- a/fsl/test/src/mocks.fx +++ b/fsl/test/src/mocks.fx @@ -23,8 +23,14 @@ export async function renderComponent( ): Promise { const container = document.createElement('div') - const componentFn = component as (props: Record) => Element - const element = componentFn(props ?? {}) + let element: Element + if (component instanceof Element) { + element = component + } else if (typeof component === 'function') { + element = (component as (props: Record) => Element)(props ?? {}) + } else { + throw new TypeError(`renderComponent: expected a component function or an Element, got ${typeof component}`) + } container.appendChild(element) document.body.appendChild(container) diff --git a/fsl/test/tests/test.test.fx b/fsl/test/tests/test.test.fx index 5533da7..b638133 100644 --- a/fsl/test/tests/test.test.fx +++ b/fsl/test/tests/test.test.fx @@ -44,4 +44,15 @@ describe('renderComponent', () => { unmount() }) + + it('mounts a pre-constructed Element directly', async () => { + const element = document.createElement('p') + element.textContent = 'Pre-built element' + + const { getByText, unmount } = await renderComponent(element) + + expect(getByText('Pre-built element')).toBeDefined() + + unmount() + }) })