// Copyright 2026 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package jupyter import ( "fmt" "strings" "testing" "gitea.dev/modules/markup" "gitea.dev/modules/test" "github.com/stretchr/testify/assert" ) func TestRender(t *testing.T) { r := renderer{} t.Run("Basic notebook", func(t *testing.T) { input := `{ "cells": [ { "cell_type": "code", "execution_count": 1, "source": ["print('hello')"], "outputs": [ { "output_type": "stream", "name": "stdout", "text": ["hello\n"] } ] } ], "metadata": {}, "nbformat": 4 }` var output strings.Builder ctx := &markup.RenderContext{} err := r.Render(ctx, strings.NewReader(input), &output) assert.NoError(t, err) result := output.String() assert.Contains(t, result, `
`) assert.Contains(t, result, `
`) assert.Contains(t, result, `In [1]:`) assert.Contains(t, result, `print`) assert.Contains(t, result, `hello`) assert.Contains(t, result, `stream-stdout`) }) t.Run("Markdown cell with XSS Protection", func(t *testing.T) { input := `{ "cells": [ { "cell_type": "markdown", "source": [ "# Title\n", "Some text\n", "[click me](javascript:alert(1))\n", "" ] } ], "metadata": {}, "nbformat": 4 }` var output strings.Builder ctx := markup.NewRenderContext(t.Context()) err := r.Render(ctx, strings.NewReader(input), &output) assert.NoError(t, err) result := output.String() // Assert normal markup still renders correctly assert.Contains(t, result, `
`) assert.Contains(t, result, `Title`) assert.Contains(t, result, `Some text`) assert.Contains(t, result, `click me`) // CRITICAL SECURITY ASSERTIONS: Ensure XSS vectors are completely stripped assert.NotContains(t, result, `javascript:alert`) assert.NotContains(t, result, `
Safe Content
" ] }, "metadata": {} } ] } ] }` var output strings.Builder ctx := markup.NewRenderContext(t.Context()) ctx.RenderOptions.MarkupType = "jupyter-render" err := markup.Render(ctx, strings.NewReader(maliciousNotebook), &output) assert.NoError(t, err) const expected = `
In [1]:

					a=1
				
Out [1]:
Safe Content
` assert.Equal(t, test.NormalizeHTMLSpaces(expected), test.NormalizeHTMLSpaces(output.String())) }