From e66dd8b2adc7ebf06814b7f6bd50ca6700d69cb7 Mon Sep 17 00:00:00 2001 From: Michael Czechowski Date: Sun, 11 Jan 2026 15:06:58 +0100 Subject: [PATCH] auto-claude: 6.1 - Add tests to verify concept section renders correc --- tests/unit/renderer.test.js | 252 ++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) diff --git a/tests/unit/renderer.test.js b/tests/unit/renderer.test.js index 8f3b755..45b631c 100644 --- a/tests/unit/renderer.test.js +++ b/tests/unit/renderer.test.js @@ -122,6 +122,258 @@ describe("Renderer Module", () => { }); }); + describe("renderLesson - Concept Section", () => { + beforeEach(() => { + // Add concept section elements to the DOM + document.body.innerHTML += ` + + `; + }); + + test("should render concept section with all fields", () => { + const lesson = { + title: "Test Lesson with Concept", + description: "Description", + task: "Task", + concept: { + explanation: "This is why flexbox works the way it does.", + diagram: "
Container -> Items
", + containerVsItem: "display: flex is a container property" + } + }; + + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lesson + ); + + const conceptSection = document.getElementById("concept-section"); + const conceptExplanation = document.getElementById("concept-explanation"); + const conceptDiagram = document.getElementById("concept-diagram"); + const conceptContainerVsItem = document.getElementById("concept-container-vs-item"); + + // Concept section should be visible + expect(conceptSection.style.display).toBe(""); + + // All fields should be populated + expect(conceptExplanation.textContent).toBe("This is why flexbox works the way it does."); + expect(conceptDiagram.innerHTML).toBe("
Container -> Items
"); + expect(conceptContainerVsItem.textContent).toBe("display: flex is a container property"); + }); + + test("should render concept section with only required explanation field", () => { + const lesson = { + title: "Test Lesson", + concept: { + explanation: "This explains the concept." + } + }; + + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lesson + ); + + const conceptSection = document.getElementById("concept-section"); + const conceptExplanation = document.getElementById("concept-explanation"); + const conceptDiagram = document.getElementById("concept-diagram"); + const conceptContainerVsItem = document.getElementById("concept-container-vs-item"); + + // Concept section should be visible + expect(conceptSection.style.display).toBe(""); + + // Explanation should be populated + expect(conceptExplanation.textContent).toBe("This explains the concept."); + + // Optional fields should be empty + expect(conceptDiagram.innerHTML).toBe(""); + expect(conceptContainerVsItem.textContent).toBe(""); + }); + + test("should hide concept section when lesson has no concept", () => { + const lesson = { + title: "Test Lesson Without Concept", + description: "Description", + task: "Task" + }; + + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lesson + ); + + const conceptSection = document.getElementById("concept-section"); + + // Concept section should be hidden + expect(conceptSection.style.display).toBe("none"); + }); + + test("should hide concept section when concept has no explanation", () => { + const lesson = { + title: "Test Lesson", + concept: { + diagram: "
Diagram only
" + } + }; + + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lesson + ); + + const conceptSection = document.getElementById("concept-section"); + + // Concept section should be hidden when explanation is missing + expect(conceptSection.style.display).toBe("none"); + }); + + test("should clear optional fields when switching to lesson without them", () => { + // First lesson with all concept fields + const lessonWithFullConcept = { + title: "Lesson 1", + concept: { + explanation: "First explanation", + diagram: "
First diagram
", + containerVsItem: "First container vs item" + } + }; + + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lessonWithFullConcept + ); + + const conceptDiagram = document.getElementById("concept-diagram"); + const conceptContainerVsItem = document.getElementById("concept-container-vs-item"); + + expect(conceptDiagram.innerHTML).toBe("
First diagram
"); + expect(conceptContainerVsItem.textContent).toBe("First container vs item"); + + // Second lesson with only explanation + const lessonWithMinimalConcept = { + title: "Lesson 2", + concept: { + explanation: "Second explanation" + } + }; + + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lessonWithMinimalConcept + ); + + // Optional fields should be cleared + expect(conceptDiagram.innerHTML).toBe(""); + expect(conceptContainerVsItem.textContent).toBe(""); + }); + + test("should handle concept section collapse/expand", () => { + const lesson = { + title: "Test Lesson", + concept: { + explanation: "Test explanation" + } + }; + + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lesson + ); + + const conceptSection = document.getElementById("concept-section"); + + // Details element should use native collapse/expand behavior + expect(conceptSection.tagName).toBe("DETAILS"); + + // Initially closed (default browser behavior) + expect(conceptSection.open).toBeFalsy(); + + // Simulate user opening the details element + conceptSection.open = true; + expect(conceptSection.open).toBeTruthy(); + + // Simulate user closing the details element + conceptSection.open = false; + expect(conceptSection.open).toBeFalsy(); + }); + + test("should handle missing concept section elements gracefully", () => { + // Remove concept section from DOM + const conceptSection = document.getElementById("concept-section"); + if (conceptSection) { + conceptSection.remove(); + } + + const lesson = { + title: "Test Lesson", + concept: { + explanation: "Test explanation" + } + }; + + // Should not throw error when elements are missing + expect(() => { + renderLesson( + document.getElementById("title"), + document.getElementById("description"), + document.getElementById("task"), + document.getElementById("preview"), + document.getElementById("prefix"), + document.getElementById("input"), + document.getElementById("suffix"), + lesson + ); + }).not.toThrow(); + }); + }); + describe("renderLevelIndicator", () => { test("should update level indicator text", () => { const element = document.getElementById("level-indicator");