@@ -27,7 +27,7 @@ const TEST_BROWSER_ENV = "T3CODE_TEST_HEADLESS_SHELL";
2727
2828const layerHtmlRender = (
2929 executable ?: string ,
30- installed : Effect . Effect < Option . Option < string > > = Effect . succeed (
30+ installed : PreviewBrowser . PreviewBrowser [ "Service" ] [ "installed" ] = Effect . succeed (
3131 Option . fromUndefinedOr ( executable ) ,
3232 ) ,
3333) =>
@@ -258,6 +258,27 @@ describe("HtmlRender", () => {
258258 } ) . pipe ( Effect . provide ( layerTest ) ) ,
259259 ) ;
260260
261+ it . effect ( "rejects an invalid browser configuration without retaining the published page" , ( ) =>
262+ Effect . gen ( function * ( ) {
263+ const error = new PreviewBrowser . PreviewBrowserInstallError ( {
264+ detail : "T3CODE_SERVER_BROWSER_EXECUTABLE must be an absolute path to an executable file." ,
265+ } ) ;
266+ yield * Effect . gen ( function * ( ) {
267+ const fileSystem = yield * FileSystem . FileSystem ;
268+ const config = yield * ServerConfig . ServerConfig ;
269+ const htmlRender = yield * HtmlRender . HtmlRender ;
270+ const mcpSessions = yield * McpProviderSessions . McpProviderSessions ;
271+ const threadId = ThreadId . make ( "thread-html-invalid-browser" ) ;
272+ const page = { html : "<p>x</p>" , title : "X" , height : 200 } ;
273+
274+ expect ( yield * htmlRender . publish ( { threadId, ...page } ) . pipe ( Effect . flip ) ) . toEqual ( error ) ;
275+ const stored = yield * fileSystem . readDirectory ( config . attachmentsDir , { recursive : true } ) ;
276+ expect ( stored . filter ( ( name ) => name . endsWith ( ".html" ) ) ) . toEqual ( [ ] ) ;
277+ expect ( yield * mcpSessions . takeHtmlRender ( threadId , page ) ) . toBe ( undefined ) ;
278+ } ) . pipe ( Effect . provide ( layerHtmlRender ( undefined , Effect . fail ( error ) ) ) ) ;
279+ } ) ,
280+ ) ;
281+
261282 it . effect ( "removes the page when publishing is interrupted" , ( ) =>
262283 Effect . gen ( function * ( ) {
263284 const threadId = ThreadId . make ( "thread-html-cancel" ) ;
0 commit comments