From 0965f629fbccd613a00c2e885daf5a66da656cd8 Mon Sep 17 00:00:00 2001 From: HitanshiThakar Date: Wed, 20 May 2026 00:01:46 +0530 Subject: [PATCH] test(plugins): add duplicate metadata validation --- plugins/waf_detector/metadata.json | 6 +-- testing/backend/unit/test_plugin_integrity.py | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/plugins/waf_detector/metadata.json b/plugins/waf_detector/metadata.json index 88906996..b642dcda 100644 --- a/plugins/waf_detector/metadata.json +++ b/plugins/waf_detector/metadata.json @@ -1,6 +1,6 @@ { "id": "waf_detector", - "name": "WAF Detector", + "name": "WAF Detection Scanner", "version": "1.0.0", "description": "Automatically identify Web Application Firewalls protecting targets.", "long_description": "Automatically identify Web Application Firewalls protecting targets.", @@ -10,7 +10,7 @@ "email": "dev@secuscan.local" }, "license": "MIT", - "icon": "\ud83d\udee0\ufe0f", + "icon": "🛠️", "engine": { "type": "cli", "binary": "wafw00f" @@ -54,5 +54,5 @@ "python_packages": [], "system_packages": [] }, - "checksum": "1e3dfcf6d4ba7847e398b9d9a4709dc275092f52a5f405e63d65cea0f8389cc0" + "checksum": "60b54af15ff7bad498a02cdbf08ee8611622e117944a3a65301cb3cae1582bb2" } diff --git a/testing/backend/unit/test_plugin_integrity.py b/testing/backend/unit/test_plugin_integrity.py index 3907d026..89d94a6e 100644 --- a/testing/backend/unit/test_plugin_integrity.py +++ b/testing/backend/unit/test_plugin_integrity.py @@ -1,7 +1,10 @@ import asyncio import json +from collections import defaultdict from pathlib import Path +import pytest + from backend.secuscan.plugins import PluginManager from backend.secuscan.config import settings @@ -18,3 +21,37 @@ def test_plugins_have_checksums(): for path in metadata_files: data = json.loads(path.read_text(encoding="utf-8")) assert data.get("checksum"), f"Missing checksum in {path}" + + +def test_plugin_metadata_ids_and_names_are_unique(): + metadata_files = list(Path(settings.plugins_dir).glob("*/metadata.json")) + assert metadata_files, "Expected plugin metadata files" + + ids = defaultdict(list) + names = defaultdict(list) + + for path in metadata_files: + data = json.loads(path.read_text(encoding="utf-8")) + plugin_id = data.get("id") + plugin_name = data.get("name") + assert plugin_id, f"Missing plugin id in {path}" + assert plugin_name, f"Missing plugin name in {path}" + + ids[plugin_id].append(path.parent.name) + names[plugin_name].append(path.parent.name) + + duplicate_ids = {plugin_id: folders for plugin_id, folders in ids.items() if len(folders) > 1} + duplicate_names = {plugin_name: folders for plugin_name, folders in names.items() if len(folders) > 1} + + if duplicate_ids or duplicate_names: + messages = [] + if duplicate_ids: + messages.append("Duplicate plugin IDs found:") + for plugin_id, folders in sorted(duplicate_ids.items()): + messages.append(f" {plugin_id}: {', '.join(sorted(folders))}") + if duplicate_names: + messages.append("Duplicate plugin display names found:") + for plugin_name, folders in sorted(duplicate_names.items()): + messages.append(f" {plugin_name}: {', '.join(sorted(folders))}") + + pytest.fail("\n".join(messages))