diff --git a/application/tests/fixtures/owasp_mappings/owasp_aisvs_1_0.json b/application/tests/fixtures/owasp_mappings/owasp_aisvs_1_0.json index 1ea6dae97..691f617a2 100644 --- a/application/tests/fixtures/owasp_mappings/owasp_aisvs_1_0.json +++ b/application/tests/fixtures/owasp_mappings/owasp_aisvs_1_0.json @@ -155,7 +155,7 @@ { "section_id": "AISVS12", "section": "Monitoring, Logging & Anomaly Detection", - "hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C12-Monitoring-and-Logging.md", + "hyperlink": "https://github.com/OWASP/AISVS/blob/main/1.0/en/0x10-C12-Monitoring-and-Logging.md", "cre_ids": [ "058-083", "148-420", diff --git a/application/tests/fixtures/owasp_mappings/owasp_api_top10_2023.json b/application/tests/fixtures/owasp_mappings/owasp_api_top10_2023.json index 442475b97..87dafcac7 100644 --- a/application/tests/fixtures/owasp_mappings/owasp_api_top10_2023.json +++ b/application/tests/fixtures/owasp_mappings/owasp_api_top10_2023.json @@ -2,7 +2,7 @@ { "section_id": "API1", "section": "Broken Object Level Authorization", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa1-broken-object-level-authorization/", "cre_ids": [ "304-667", "724-770" @@ -11,7 +11,7 @@ { "section_id": "API2", "section": "Broken Authentication", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa2-broken-authentication/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa2-broken-authentication/", "cre_ids": [ "177-260", "586-842", @@ -21,7 +21,7 @@ { "section_id": "API3", "section": "Broken Object Property Level Authorization", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa3-broken-object-property-level-authorization/", "cre_ids": [ "538-770", "724-770", @@ -31,7 +31,7 @@ { "section_id": "API4", "section": "Unrestricted Resource Consumption", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa4-unrestricted-resource-consumption/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa4-unrestricted-resource-consumption/", "cre_ids": [ "623-550", "132-146", @@ -55,7 +55,7 @@ { "section_id": "API5", "section": "Broken Function Level Authorization", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa5-broken-function-level-authorization/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa5-broken-function-level-authorization/", "cre_ids": [ "650-560", "724-770" @@ -64,7 +64,7 @@ { "section_id": "API6", "section": "Unrestricted Access to Sensitive Business Flows", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa6-unrestricted-access-to-sensitive-business-flows/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa6-unrestricted-access-to-sensitive-business-flows/", "cre_ids": [ "534-605", "630-573" @@ -73,7 +73,7 @@ { "section_id": "API7", "section": "Server Side Request Forgery", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa7-server-side-request-forgery/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa7-server-side-request-forgery/", "cre_ids": [ "028-728", "657-084", @@ -90,7 +90,7 @@ { "section_id": "API8", "section": "Security Misconfiguration", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa8-security-misconfiguration/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa8-security-misconfiguration/", "cre_ids": [ "486-813", "124-564", @@ -112,7 +112,7 @@ { "section_id": "API9", "section": "Improper Inventory Management", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xa9-improper-inventory-management/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xa9-improper-inventory-management/", "cre_ids": [ "162-655", "863-521" @@ -121,7 +121,7 @@ { "section_id": "API10", "section": "Unsafe Consumption of APIs", - "hyperlink": "https://owasp.org/API-Security/editions/2023/en/0xaa-unsafe-consumption-of-apis/", + "hyperlink": "https://api-security.owasp.org/editions/2023/en/0xaa-unsafe-consumption-of-apis/", "cre_ids": [ "715-223" ] diff --git a/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2022.json b/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2022.json index 1a83e412b..e96fc869a 100644 --- a/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2022.json +++ b/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2022.json @@ -2,7 +2,7 @@ { "section_id": "K01", "section": "Insecure Workload Configurations", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K01-insecure-workload-configurations", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K01-insecure-workload-configurations", "cre_ids": [ "233-748", "486-813", @@ -25,7 +25,7 @@ { "section_id": "K02", "section": "Supply Chain Vulnerabilities", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K02-supply-chain-vulnerabilities", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K02-supply-chain-vulnerabilities", "cre_ids": [ "613-285", "613-287" @@ -34,7 +34,7 @@ { "section_id": "K03", "section": "Overly Permissive RBAC Configurations", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K03-overly-permissive-rbac-configurations", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K03-overly-permissive-rbac", "cre_ids": [ "128-128", "724-770" @@ -43,7 +43,7 @@ { "section_id": "K04", "section": "Lack of Centralized Policy Enforcement", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K04-lack-of-centralized-policy-enforcement", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K04-policy-enforcement", "cre_ids": [ "117-371" ] @@ -51,7 +51,7 @@ { "section_id": "K05", "section": "Inadequate Logging and Monitoring", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K05-inadequate-logging-and-monitoring", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K05-inadequate-logging", "cre_ids": [ "058-083", "148-420", @@ -71,7 +71,7 @@ { "section_id": "K06", "section": "Broken Authentication Mechanisms", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K06-broken-authentication-mechanisms", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K06-broken-authentication", "cre_ids": [ "177-260", "586-842", @@ -81,7 +81,7 @@ { "section_id": "K07", "section": "Missing Network Segmentation Controls", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K07-missing-network-segmentation-controls", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K07-network-segmentation", "cre_ids": [ "132-146", "467-784", @@ -91,7 +91,7 @@ { "section_id": "K08", "section": "Secrets Management Failures", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K08-secrets-management-failures", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K08-secrets-management", "cre_ids": [ "340-375", "774-888", @@ -101,7 +101,7 @@ { "section_id": "K09", "section": "Misconfigured Cluster Components", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K09-misconfigured-cluster-components", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K09-misconfigured-cluster-components", "cre_ids": [ "233-748", "486-813", @@ -124,7 +124,7 @@ { "section_id": "K10", "section": "Outdated and Vulnerable Kubernetes Components", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K10-outdated-and-vulnerable-kubernetes-components", + "hyperlink": "https://kubernetes-top10.owasp.org/2022/en/src/K10-vulnerable-components", "cre_ids": [ "053-751", "715-334", diff --git a/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2025.json b/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2025.json index 5a11a42a4..21bfba48c 100644 --- a/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2025.json +++ b/application/tests/fixtures/owasp_mappings/owasp_kubernetes_top10_2025.json @@ -2,7 +2,7 @@ { "section_id": "K01", "section": "Insecure Workload Configurations", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K01-Insecure-Workload-Configurations.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K01-Insecure-Workload-Configurations.html", "cre_ids": [ "233-748", "486-813", @@ -25,7 +25,7 @@ { "section_id": "K02", "section": "Overly Permissive Authorization Configurations", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K02-Overly-Permissive-Authorization-Configurations.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K02-Overly-Permissive-Authorization-Configurations.html", "cre_ids": [ "128-128", "724-770" @@ -37,7 +37,7 @@ { "section_id": "K03", "section": "Secrets Management Failures", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K03-Secrets-Management-Failures.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K03-Secrets-Management-Failures.html", "cre_ids": [ "340-375", "774-888", @@ -50,7 +50,7 @@ { "section_id": "K04", "section": "Lack Of Cluster Level Policy Enforcement", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K04-Lack-Of-Cluster-Level-Policy-Enforcement.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K04-Lack-Of-Cluster-Level-Policy-Enforcement.html", "cre_ids": [ "117-371" ] @@ -58,7 +58,7 @@ { "section_id": "K05", "section": "Missing Network Segmentation Controls", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K05-Missing-Network-Segmentation-Controls.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K05-Missing-Network-Segmentation-Controls.html", "cre_ids": [ "132-146", "467-784", @@ -71,7 +71,7 @@ { "section_id": "K06", "section": "Overly Exposed Kubernetes Components", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K06-Overly-Exposed-Kubernetes-Components.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K06-Overly-Exposed-Kubernetes-Components.html", "cre_ids": [ "152-725", "640-364" @@ -83,7 +83,7 @@ { "section_id": "K07", "section": "Misconfigured And Vulnerable Cluster Components", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K07-Misconfigured-And-Vulnerable-Cluster-Components.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K07-Misconfigured-And-Vulnerable-Cluster-Components.html", "cre_ids": [ "053-751", "233-748", @@ -114,7 +114,7 @@ { "section_id": "K08", "section": "Cluster To Cloud Lateral Movement", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K08-Cluster-To-Cloud-Lateral-Movement.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K08-Cluster-To-Cloud-Lateral-Movement.html", "cre_ids": [ "132-146", "640-364", @@ -128,7 +128,7 @@ { "section_id": "K09", "section": "Broken Authentication Mechanisms", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K09-Broken-Authentication-Mechanisms.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K09-Broken-Authentication-Mechanisms.html", "cre_ids": [ "177-260", "586-842", @@ -141,7 +141,7 @@ { "section_id": "K10", "section": "Inadequate Logging And Monitoring", - "hyperlink": "https://owasp.org/www-project-kubernetes-top-ten/2025/en/src/K10-Inadequate-Logging-And-Monitoring.html", + "hyperlink": "https://kubernetes-top10.owasp.org/2025/en/src/K10-Inadequate-Logging-And-Monitoring.html", "cre_ids": [ "058-083", "148-420", diff --git a/application/tests/fixtures/owasp_mappings/owasp_top10_2025.json b/application/tests/fixtures/owasp_mappings/owasp_top10_2025.json index cd51d1547..373322fdb 100644 --- a/application/tests/fixtures/owasp_mappings/owasp_top10_2025.json +++ b/application/tests/fixtures/owasp_mappings/owasp_top10_2025.json @@ -2,7 +2,7 @@ { "section_id": "A01", "section": "Broken Access Control", - "hyperlink": "https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/", + "hyperlink": "https://top10.owasp.org/2025/A01_2025-Broken_Access_Control/", "cre_ids": [ "117-371", "177-260", @@ -12,7 +12,7 @@ { "section_id": "A02", "section": "Security Misconfiguration", - "hyperlink": "https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/", + "hyperlink": "https://top10.owasp.org/2025/A02_2025-Security_Misconfiguration/", "cre_ids": [ "486-813", "124-564", @@ -34,7 +34,7 @@ { "section_id": "A03", "section": "Software Supply Chain Failures", - "hyperlink": "https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/", + "hyperlink": "https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/", "cre_ids": [ "613-286", "613-287", @@ -45,7 +45,7 @@ { "section_id": "A04", "section": "Cryptographic Failures", - "hyperlink": "https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/", + "hyperlink": "https://top10.owasp.org/2025/A04_2025-Cryptographic_Failures/", "cre_ids": [ "170-772", "227-045", @@ -78,7 +78,7 @@ { "section_id": "A05", "section": "Injection", - "hyperlink": "https://owasp.org/Top10/2025/A05_2025-Injection/", + "hyperlink": "https://top10.owasp.org/2025/A05_2025-Injection/", "cre_ids": [ "031-447", "064-808", @@ -102,7 +102,7 @@ { "section_id": "A06", "section": "Insecure Design", - "hyperlink": "https://owasp.org/Top10/2025/A06_2025-Insecure_Design/", + "hyperlink": "https://top10.owasp.org/2025/A06_2025-Insecure_Design/", "cre_ids": [ "126-668", "155-155", @@ -128,7 +128,7 @@ { "section_id": "A07", "section": "Authentication Failures", - "hyperlink": "https://owasp.org/Top10/2025/A07_2025-Authentication_Failures/", + "hyperlink": "https://top10.owasp.org/2025/A07_2025-Authentication_Failures/", "cre_ids": [ "002-630", "177-260", @@ -139,7 +139,7 @@ { "section_id": "A08", "section": "Software or Data Integrity Failures", - "hyperlink": "https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/", + "hyperlink": "https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/", "cre_ids": [ "613-287", "836-068" @@ -148,7 +148,7 @@ { "section_id": "A09", "section": "Security Logging and Alerting Failures", - "hyperlink": "https://owasp.org/Top10/2025/A09_2025-Security_Logging_and_Alerting_Failures/", + "hyperlink": "https://top10.owasp.org/2025/A09_2025-Security_Logging_and_Alerting_Failures/", "cre_ids": [ "067-050", "148-420", @@ -159,7 +159,7 @@ { "section_id": "A10", "section": "Mishandling of Exceptional Conditions", - "hyperlink": "https://owasp.org/Top10/2025/A10_2025-Mishandling_of_Exceptional_Conditions/", + "hyperlink": "https://top10.owasp.org/2025/A10_2025-Mishandling_of_Exceptional_Conditions/", "cre_ids": [ "513-183" ] diff --git a/application/tests/owasp_aisvs_parser_test.py b/application/tests/owasp_aisvs_parser_test.py index 633afeb17..28f60e6b9 100644 --- a/application/tests/owasp_aisvs_parser_test.py +++ b/application/tests/owasp_aisvs_parser_test.py @@ -57,7 +57,7 @@ def test_parse(self) -> None: self.assertEqual("AISVS12", entries[-1].sectionID) self.assertEqual("Monitoring, Logging & Anomaly Detection", entries[-1].section) self.assertEqual( - "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C12-Monitoring-and-Logging.md", + "https://github.com/OWASP/AISVS/blob/main/1.0/en/0x10-C12-Monitoring-and-Logging.md", entries[-1].hyperlink, ) self.assertEqual( diff --git a/application/tests/owasp_api_top10_2023_parser_test.py b/application/tests/owasp_api_top10_2023_parser_test.py index e6b54e0e4..2312d00b6 100644 --- a/application/tests/owasp_api_top10_2023_parser_test.py +++ b/application/tests/owasp_api_top10_2023_parser_test.py @@ -38,6 +38,21 @@ def test_parse(self) -> None: entries = result.results["OWASP API Security Top 10 2023"] self.assertEqual(10, len(entries)) + self.assertEqual( + [ + "https://api-security.owasp.org/editions/2023/en/0xa1-broken-object-level-authorization/", + "https://api-security.owasp.org/editions/2023/en/0xa2-broken-authentication/", + "https://api-security.owasp.org/editions/2023/en/0xa3-broken-object-property-level-authorization/", + "https://api-security.owasp.org/editions/2023/en/0xa4-unrestricted-resource-consumption/", + "https://api-security.owasp.org/editions/2023/en/0xa5-broken-function-level-authorization/", + "https://api-security.owasp.org/editions/2023/en/0xa6-unrestricted-access-to-sensitive-business-flows/", + "https://api-security.owasp.org/editions/2023/en/0xa7-server-side-request-forgery/", + "https://api-security.owasp.org/editions/2023/en/0xa8-security-misconfiguration/", + "https://api-security.owasp.org/editions/2023/en/0xa9-improper-inventory-management/", + "https://api-security.owasp.org/editions/2023/en/0xaa-unsafe-consumption-of-apis/", + ], + [entry.hyperlink for entry in entries], + ) self.assertEqual("API1", entries[0].sectionID) self.assertEqual("Broken Object Level Authorization", entries[0].section) self.assertEqual( diff --git a/application/tests/owasp_kubernetes_top10_2022_parser_test.py b/application/tests/owasp_kubernetes_top10_2022_parser_test.py index b57821d3e..ba2d00487 100644 --- a/application/tests/owasp_kubernetes_top10_2022_parser_test.py +++ b/application/tests/owasp_kubernetes_top10_2022_parser_test.py @@ -40,6 +40,21 @@ def test_parse(self) -> None: entries = result.results["OWASP Kubernetes Top Ten 2022"] self.assertEqual(10, len(entries)) + self.assertEqual( + [ + "https://kubernetes-top10.owasp.org/2022/en/src/K01-insecure-workload-configurations", + "https://kubernetes-top10.owasp.org/2022/en/src/K02-supply-chain-vulnerabilities", + "https://kubernetes-top10.owasp.org/2022/en/src/K03-overly-permissive-rbac", + "https://kubernetes-top10.owasp.org/2022/en/src/K04-policy-enforcement", + "https://kubernetes-top10.owasp.org/2022/en/src/K05-inadequate-logging", + "https://kubernetes-top10.owasp.org/2022/en/src/K06-broken-authentication", + "https://kubernetes-top10.owasp.org/2022/en/src/K07-network-segmentation", + "https://kubernetes-top10.owasp.org/2022/en/src/K08-secrets-management", + "https://kubernetes-top10.owasp.org/2022/en/src/K09-misconfigured-cluster-components", + "https://kubernetes-top10.owasp.org/2022/en/src/K10-vulnerable-components", + ], + [entry.hyperlink for entry in entries], + ) self.assertEqual("K01", entries[0].sectionID) self.assertEqual("Insecure Workload Configurations", entries[0].section) self.assertEqual( diff --git a/application/tests/owasp_kubernetes_top10_2025_parser_test.py b/application/tests/owasp_kubernetes_top10_2025_parser_test.py index 3ef2770d1..9907a2bac 100644 --- a/application/tests/owasp_kubernetes_top10_2025_parser_test.py +++ b/application/tests/owasp_kubernetes_top10_2025_parser_test.py @@ -44,6 +44,21 @@ def test_parse(self) -> None: entries = result.results["OWASP Kubernetes Top Ten 2025 (Draft)"] self.assertEqual(10, len(entries)) + self.assertEqual( + [ + "https://kubernetes-top10.owasp.org/2025/en/src/K01-Insecure-Workload-Configurations.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K02-Overly-Permissive-Authorization-Configurations.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K03-Secrets-Management-Failures.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K04-Lack-Of-Cluster-Level-Policy-Enforcement.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K05-Missing-Network-Segmentation-Controls.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K06-Overly-Exposed-Kubernetes-Components.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K07-Misconfigured-And-Vulnerable-Cluster-Components.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K08-Cluster-To-Cloud-Lateral-Movement.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K09-Broken-Authentication-Mechanisms.html", + "https://kubernetes-top10.owasp.org/2025/en/src/K10-Inadequate-Logging-And-Monitoring.html", + ], + [entry.hyperlink for entry in entries], + ) self.assertEqual("K01", entries[0].sectionID) self.assertEqual("Insecure Workload Configurations", entries[0].section) self.assertEqual( diff --git a/application/tests/owasp_top10_2025_parser_test.py b/application/tests/owasp_top10_2025_parser_test.py index 89d3722e6..b5e86ba02 100644 --- a/application/tests/owasp_top10_2025_parser_test.py +++ b/application/tests/owasp_top10_2025_parser_test.py @@ -69,8 +69,19 @@ def test_parse(self) -> None: self.assertEqual("A01", entries[0].sectionID) self.assertEqual("Broken Access Control", entries[0].section) self.assertEqual( - "https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/", - entries[0].hyperlink, + [ + "https://top10.owasp.org/2025/A01_2025-Broken_Access_Control/", + "https://top10.owasp.org/2025/A02_2025-Security_Misconfiguration/", + "https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/", + "https://top10.owasp.org/2025/A04_2025-Cryptographic_Failures/", + "https://top10.owasp.org/2025/A05_2025-Injection/", + "https://top10.owasp.org/2025/A06_2025-Insecure_Design/", + "https://top10.owasp.org/2025/A07_2025-Authentication_Failures/", + "https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/", + "https://top10.owasp.org/2025/A09_2025-Security_Logging_and_Alerting_Failures/", + "https://top10.owasp.org/2025/A10_2025-Mishandling_of_Exceptional_Conditions/", + ], + [entry.hyperlink for entry in entries], ) self.assertEqual( ["117-371", "177-260", "724-770"],