]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] WebUI: keep classifiers list when request is skipped 5666/head
authorAlexander Moisseev <moiseev@mezonplus.ru>
Mon, 6 Oct 2025 12:39:26 +0000 (15:39 +0300)
committerAlexander Moisseev <moiseev@mezonplus.ru>
Mon, 6 Oct 2025 12:39:26 +0000 (15:39 +0300)
interface/js/app/upload.js
test/playwright/tests/scan.spec.mjs

index 9f6c6e7a50e727e045710fa337ef453102117a7d..a3bb973634d83339b166f27d1fd134df090262fa 100644 (file)
@@ -329,16 +329,16 @@ define(["jquery", "app/common", "app/libft"],
         }
 
         ui.getClassifiers = function () {
-            const server = common.getServer();
-
             if (!common.read_only) {
-                const hadOptions = $("#classifier").children().length > 0; // remember pre-state
-
-                const sel = $("#classifier").empty().append($("<option>", {value: "", text: "All classifiers"}));
+                const server = common.getServer();
+                const sel = $("#classifier");
+                const hadOptions = sel.children().length > 0; // remember pre-state
 
                 // Skip request only if we already had options populated for this config/server
                 if (shouldSkipRequest(server, "classifiers") && hadOptions) return;
 
+                sel.empty().append($("<option>", {value: "", text: "All classifiers"}));
+
                 common.query("bayes/classifiers", {
                     success: function (data) {
                         data[0].data.forEach((c) => sel.append($("<option>", {value: c, text: c})));
index 0e27a74ac92c8806420296ddeaf5353e90ab4efb..26bdb3f601758eefc38afe235ee41b051ddaa34f 100644 (file)
@@ -197,6 +197,32 @@ test.describe.serial("Scan flow across WebUI tabs", () => {
             const optionCount = await classifier.locator("option").count();
             expect(optionCount).toBeGreaterThan(1);
 
+            // Verify that a subsequent getClassifiers call under the same config is skipped
+            let reqCount = 0;
+            function reqListener(r) {
+                if (r.url().includes("/bayes/classifiers")) {
+                    reqCount += 1;
+                }
+            }
+            page2.on("request", reqListener);
+
+            await page2.evaluate(() => new Promise((resolve) => {
+                // AMD require is available in the UI
+                // eslint-disable-next-line no-undef
+                require(["app/upload"], (u) => {
+                    u.getClassifiers();
+                    resolve();
+                });
+            }));
+
+            await page2.waitForTimeout(250);
+            page2.off("request", reqListener);
+            expect(reqCount).toBe(0);
+
+            // Options must remain populated (not reset to just default)
+            const finalCount = await classifier.locator("option").count();
+            expect(finalCount).toBeGreaterThan(1);
+
             await page2.close();
             await context.close();
         });