diff --git a/sphinx_togglebutton/_static/togglebutton.js b/sphinx_togglebutton/_static/togglebutton.js index 4b822bb..3c5fc8f 100644 --- a/sphinx_togglebutton/_static/togglebutton.js +++ b/sphinx_togglebutton/_static/togglebutton.js @@ -8,9 +8,15 @@ let toggleChevron = ` `; +var togglebuttonLog = (...args) => { + if (typeof togglebuttonDebug !== "undefined" && togglebuttonDebug) { + console.log(...args); + } +}; + var initToggleItems = () => { var itemsToToggle = document.querySelectorAll(togglebuttonSelector); - console.log( + togglebuttonLog( `[togglebutton]: Adding toggle buttons to ${itemsToToggle.length} items` ); // Add the button to each admonition and hook up a callback to toggle visibility @@ -163,7 +169,7 @@ var toggleClickHandler = (click) => { // We've clicked the button itself and so don't need to do anything button = click.target; } else { - console.log(`[togglebutton]: Couldn't find button for ${click.target}`); + togglebuttonLog(`[togglebutton]: Couldn't find button for ${click.target}`); } target = document.getElementById(button.dataset["button"]); toggleHidden(target); @@ -234,7 +240,7 @@ if (toggleOpenOnPrint == "true") { document .querySelectorAll(".admonition.toggle.toggle-hidden") .forEach((el) => { - console.log(el); + togglebuttonLog(el); el.querySelector("button.toggle-button").click(); el.dataset["toggle_after_print"] = "true"; }); diff --git a/tests/test_togglebutton_console.js b/tests/test_togglebutton_console.js new file mode 100644 index 0000000..03d89ca --- /dev/null +++ b/tests/test_togglebutton_console.js @@ -0,0 +1,66 @@ +/** + * Regression for executablebooks/sphinx-togglebutton#56: + * initToggleItems must not write to the console unless a debug flag is on. + */ +const { test } = require("node:test"); +const assert = require("node:assert/strict"); +const fs = require("fs"); +const path = require("path"); +const vm = require("vm"); + +const JS_PATH = path.join( + __dirname, + "..", + "sphinx_togglebutton", + "_static", + "togglebutton.js" +); + +function loadTogglebutton({ togglebuttonDebug } = {}) { + const logs = []; + const sandbox = { + console: { + log: (...args) => { + logs.push(args); + }, + }, + document: { + // Stay in "loading" so DOMContentLoaded hooks are not flushed on import. + readyState: "loading", + querySelectorAll: () => [], + addEventListener: () => {}, + getElementById: () => null, + }, + window: { + addEventListener: () => {}, + }, + CSS: { escape: (s) => s }, + togglebuttonSelector: ".toggle", + toggleHintShow: "Click to show", + toggleHintHide: "Click to hide", + toggleOpenOnPrint: "false", + }; + if (togglebuttonDebug !== undefined) { + sandbox.togglebuttonDebug = togglebuttonDebug; + } + vm.createContext(sandbox); + vm.runInContext(fs.readFileSync(JS_PATH, "utf8"), sandbox); + return { sandbox, logs }; +} + +test("initToggleItems does not log to the console by default", () => { + const { sandbox, logs } = loadTogglebutton(); + sandbox.initToggleItems(); + assert.equal( + logs.length, + 0, + `unconditional console.log: ${JSON.stringify(logs)}` + ); +}); + +test("initToggleItems logs when togglebuttonDebug is enabled", () => { + const { sandbox, logs } = loadTogglebutton({ togglebuttonDebug: true }); + sandbox.initToggleItems(); + assert.equal(logs.length, 1); + assert.match(String(logs[0]), /\[togglebutton\]: Adding toggle buttons to 0 items/); +});