Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions application/tests/cheatsheets_parser_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,23 +34,33 @@ class Repo:
repo.working_dir = loc
cre = defs.CRE(name="blah", id="223-780")
self.collection.add_cre(cre)
with open(os.path.join(os.path.join(loc, "cheatsheets"), "cs.md"), "w") as mdf:
with open(
os.path.join(
os.path.join(loc, "cheatsheets"),
"Secrets_Management_Cheat_Sheet.md",
),
"w",
) as mdf:
mdf.write(cs)
mock_clone.return_value = repo
entries = cheatsheets_parser.Cheatsheets().parse(
cache=self.collection, ph=PromptHandler(database=self.collection)
)
expected = defs.Standard(
name="OWASP Cheat Sheets",
hyperlink="https://github.com/foo/bar/tree/master/cs.md",
hyperlink="https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html",
section="Secrets Management Cheat Sheet",
links=[defs.Link(document=cre, ltype=defs.LinkTypes.LinkedTo)],
links=[
defs.Link(
document=cre, ltype=defs.LinkTypes.AutomaticallyLinkedTo
)
],
)
self.maxDiff = None
for name, nodes in entries.results.items():
self.assertEqual(name, cheatsheets_parser.Cheatsheets().name)
self.assertEqual(len(nodes), 1)
self.assertCountEqual(expected.todict(), nodes[0].todict())
self.assertEqual(expected.todict(), nodes[0].todict())

cheatsheets_md = """ # Secrets Management Cheat Sheet

Expand Down
62 changes: 62 additions & 0 deletions application/tests/owasp_aisvs_parser_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import unittest

from application import create_app, sqla # type: ignore
from application.database import db
from application.defs import cre_defs as defs
from application.prompt_client import prompt_client
from application.utils.external_project_parsers.parsers import owasp_aisvs


class TestOwaspAisvsParser(unittest.TestCase):
def tearDown(self) -> None:
sqla.session.remove()
sqla.drop_all()
self.app_context.pop()

def setUp(self) -> None:
self.app = create_app(mode="test")
self.app_context = self.app.app_context()
self.app_context.push()
sqla.create_all()
self.collection = db.Node_collection()

def test_parse(self) -> None:
for cre_id, name in [
("227-045", "Identify sensitive data and subject it to a policy"),
(
"307-507",
"Allow only trusted sources both build time and runtime; therefore perform integrity checks on all resources and code",
),
(
"162-655",
"Documentation of all components' business or security function",
),
]:
self.collection.add_cre(defs.CRE(id=cre_id, name=name, description=""))

result = owasp_aisvs.OwaspAisvs().parse(
self.collection, prompt_client.PromptHandler(database=self.collection)
)

entries = result.results["OWASP AI Security Verification Standard (AISVS)"]
self.assertEqual(14, len(entries))
self.assertEqual("AISVS1", entries[0].sectionID)
self.assertEqual(
"Training Data Governance & Bias Management", entries[0].section
)
self.assertEqual(
"https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C01-Training-Data-Governance.md",
entries[0].hyperlink,
)
self.assertEqual(
["227-045", "307-507"], [l.document.id for l in entries[0].links]
)
self.assertEqual("AISVS14", entries[-1].sectionID)
self.assertEqual(
"Human Oversight, Accountability & Governance", entries[-1].section
)
self.assertEqual(
"https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C14-Human-Oversight.md",
entries[-1].hyperlink,
)
self.assertEqual(["162-655"], [l.document.id for l in entries[-1].links])
43 changes: 43 additions & 0 deletions application/tests/owasp_api_top10_2023_parser_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import unittest

from application import create_app, sqla # type: ignore
from application.database import db
from application.defs import cre_defs as defs
from application.prompt_client import prompt_client
from application.utils.external_project_parsers.parsers import owasp_api_top10_2023


class TestOwaspApiTop10_2023Parser(unittest.TestCase):
def tearDown(self) -> None:
sqla.session.remove()
sqla.drop_all()
self.app_context.pop()

def setUp(self) -> None:
self.app = create_app(mode="test")
self.app_context = self.app.app_context()
self.app_context.push()
sqla.create_all()
self.collection = db.Node_collection()

def test_parse(self) -> None:
for cre_id, name in [
("304-667", "Protect API against unauthorized access/modification (IDOR)"),
("724-770", "Technical application access control"),
("715-223", "Ensure trusted origin of third party resources"),
]:
self.collection.add_cre(defs.CRE(id=cre_id, name=name, description=""))

result = owasp_api_top10_2023.OwaspApiTop10_2023().parse(
self.collection, prompt_client.PromptHandler(database=self.collection)
)

entries = result.results["OWASP API Security Top 10 2023"]
self.assertEqual(10, len(entries))
self.assertEqual("API1", entries[0].sectionID)
self.assertEqual("Broken Object Level Authorization", entries[0].section)
self.assertEqual(
["304-667", "724-770"], [l.document.id for l in entries[0].links]
)
self.assertEqual("API10", entries[-1].sectionID)
self.assertEqual(["715-223"], [l.document.id for l in entries[-1].links])
45 changes: 45 additions & 0 deletions application/tests/owasp_kubernetes_top10_2022_parser_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import unittest

from application import create_app, sqla # type: ignore
from application.database import db
from application.defs import cre_defs as defs
from application.prompt_client import prompt_client
from application.utils.external_project_parsers.parsers import (
owasp_kubernetes_top10_2022,
)


class TestOwaspKubernetesTop10_2022Parser(unittest.TestCase):
def tearDown(self) -> None:
sqla.session.remove()
sqla.drop_all()
self.app_context.pop()

def setUp(self) -> None:
self.app = create_app(mode="test")
self.app_context = self.app.app_context()
self.app_context.push()
sqla.create_all()
self.collection = db.Node_collection()

def test_parse(self) -> None:
for cre_id, name in [
("233-748", "Configuration hardening"),
("486-813", "Configuration"),
("053-751", "Force build pipeline to check outdated/insecure components"),
]:
self.collection.add_cre(defs.CRE(id=cre_id, name=name, description=""))

result = owasp_kubernetes_top10_2022.OwaspKubernetesTop10_2022().parse(
self.collection, prompt_client.PromptHandler(database=self.collection)
)

entries = result.results["OWASP Kubernetes Top Ten 2022"]
self.assertEqual(10, len(entries))
self.assertEqual("K01", entries[0].sectionID)
self.assertEqual("Insecure Workload Configurations", entries[0].section)
self.assertEqual(
["233-748", "486-813"], [l.document.id for l in entries[0].links]
)
self.assertEqual("K10", entries[-1].sectionID)
self.assertEqual(["053-751"], [l.document.id for l in entries[-1].links])
102 changes: 102 additions & 0 deletions application/tests/owasp_kubernetes_top10_2025_parser_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import unittest
import tempfile
from pathlib import Path

from application import create_app, sqla # type: ignore
from application.database import db
from application.defs import cre_defs as defs
from application.prompt_client import prompt_client
from application.utils.external_project_parsers.parsers import (
owasp_kubernetes_top10_2025,
)


class TestOwaspKubernetesTop10_2025Parser(unittest.TestCase):
def tearDown(self) -> None:
sqla.session.remove()
sqla.drop_all()
self.app_context.pop()

def setUp(self) -> None:
self.app = create_app(mode="test")
self.app_context = self.app.app_context()
self.app_context.push()
sqla.create_all()
self.collection = db.Node_collection()

def test_parse(self) -> None:
for cre_id, name in [
("233-748", "Configuration hardening"),
("486-813", "Configuration"),
("148-420", "Log integrity"),
("402-706", "Log relevant"),
("843-841", "Log discretely"),
]:
self.collection.add_cre(defs.CRE(id=cre_id, name=name, description=""))

result = owasp_kubernetes_top10_2025.OwaspKubernetesTop10_2025().parse(
self.collection, prompt_client.PromptHandler(database=self.collection)
)

entries = result.results["OWASP Kubernetes Top Ten 2025 (Draft)"]
self.assertEqual(10, len(entries))
self.assertEqual("K01", entries[0].sectionID)
self.assertEqual("Insecure Workload Configurations", entries[0].section)
self.assertEqual(
["233-748", "486-813"], [l.document.id for l in entries[0].links]
)
self.assertEqual("K10", entries[-1].sectionID)
self.assertEqual(
["148-420", "402-706", "843-841"],
[l.document.id for l in entries[-1].links],
)

def test_parse_falls_back_to_2022_mapping_when_2025_links_missing(self) -> None:
self.collection.add_cre(
defs.CRE(id="148-420", name="Log integrity", description="")
)

with tempfile.TemporaryDirectory() as tmpdir:
tmp_path = Path(tmpdir)
current_file = tmp_path / "k8s_2025.json"
fallback_file = tmp_path / "k8s_2022.json"
current_file.write_text(
"""
[
{
"section_id": "K10",
"section": "Inadequate Logging And Monitoring",
"hyperlink": "https://example.com/k10",
"cre_ids": ["999-999"],
"fallback_section_ids": ["K05"]
}
]
""".strip(),
encoding="utf-8",
)
fallback_file.write_text(
"""
[
{
"section_id": "K05",
"section": "Inadequate Logging and Monitoring",
"hyperlink": "https://example.com/k05",
"cre_ids": ["148-420"]
}
]
""".strip(),
encoding="utf-8",
)

parser = owasp_kubernetes_top10_2025.OwaspKubernetesTop10_2025()
parser.data_file = current_file
parser.fallback_data_file = fallback_file

result = parser.parse(
self.collection,
prompt_client.PromptHandler(database=self.collection),
)

entries = result.results["OWASP Kubernetes Top Ten 2025 (Draft)"]
self.assertEqual(1, len(entries))
self.assertEqual(["148-420"], [link.document.id for link in entries[0].links])
45 changes: 45 additions & 0 deletions application/tests/owasp_llm_top10_2025_parser_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import unittest

from application import create_app, sqla # type: ignore
from application.database import db
from application.defs import cre_defs as defs
from application.prompt_client import prompt_client
from application.utils.external_project_parsers.parsers import owasp_llm_top10_2025


class TestOwaspLlmTop10_2025Parser(unittest.TestCase):
def tearDown(self) -> None:
sqla.session.remove()
sqla.drop_all()
self.app_context.pop()

def setUp(self) -> None:
self.app = create_app(mode="test")
self.app_context = self.app.app_context()
self.app_context.push()
sqla.create_all()
self.collection = db.Node_collection()

def test_parse(self) -> None:
for cre_id, name in [
("161-451", "Output encoding and injection prevention"),
("064-808", "Encode output context-specifically"),
("760-764", "Injection protection"),
("623-550", "Denial Of Service protection"),
]:
self.collection.add_cre(defs.CRE(id=cre_id, name=name, description=""))

result = owasp_llm_top10_2025.OwaspLlmTop10_2025().parse(
self.collection, prompt_client.PromptHandler(database=self.collection)
)

entries = result.results["OWASP Top 10 for LLM and Gen AI Apps 2025"]
self.assertEqual(10, len(entries))
self.assertEqual("LLM01", entries[0].sectionID)
self.assertEqual("Prompt Injection", entries[0].section)
self.assertEqual(
["161-451", "760-764"], [l.document.id for l in entries[0].links]
)
self.assertEqual(["064-808"], [l.document.id for l in entries[4].links])
self.assertEqual("LLM10", entries[-1].sectionID)
self.assertEqual(["623-550"], [l.document.id for l in entries[-1].links])
Loading