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_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])
80 changes: 80 additions & 0 deletions application/tests/owasp_top10_2025_parser_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
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_top10_2025


class TestOwaspTop10_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:
self.collection.add_cre(
defs.CRE(id="177-260", name="Session management", description="")
)
self.collection.add_cre(
defs.CRE(
id="117-371",
name="Use a centralized access control mechanism",
description="",
)
)
self.collection.add_cre(
defs.CRE(
id="724-770",
name="Technical application access control",
description="",
)
)
self.collection.add_cre(
defs.CRE(
id="031-447", name="Whitelist all external (HTTP) input", description=""
)
)
self.collection.add_cre(
defs.CRE(
id="064-808", name="Encode output context-specifically", description=""
)
)
self.collection.add_cre(
defs.CRE(id="760-764", name="Injection protection", description="")
)
self.collection.add_cre(
defs.CRE(id="513-183", name="Error handling", description="")
)

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

entries = result.results["OWASP Top 10 2025"]
self.assertEqual(10, len(entries))
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,
)
self.assertEqual(
["117-371", "177-260", "724-770"],
[link.document.id for link in entries[0].links],
)
self.assertEqual(
["031-447", "064-808", "760-764"],
[link.document.id for link in entries[4].links],
)
self.assertEqual("A10", entries[-1].sectionID)
self.assertEqual(["513-183"], [link.document.id for link in entries[-1].links])
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
[
{
"section_id": "AISVS1",
"section": "Training Data Governance & Bias Management",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C01-Training-Data-Governance.md",
"cre_ids": ["227-045", "307-507"]
},
{
"section_id": "AISVS2",
"section": "User Input Validation",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C02-User-Input-Validation.md",
"cre_ids": ["031-447", "760-764"]
},
{
"section_id": "AISVS3",
"section": "Model Lifecycle Management & Change Control",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C03-Model-Lifecycle-Management.md",
"cre_ids": ["148-853", "613-285"]
},
{
"section_id": "AISVS4",
"section": "Infrastructure, Configuration & Deployment Security",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C04-Infrastructure.md",
"cre_ids": ["233-748", "486-813"]
},
{
"section_id": "AISVS5",
"section": "Access Control & Identity for AI Components & Users",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C05-Access-Control-and-Identity.md",
"cre_ids": ["633-428", "724-770"]
},
{
"section_id": "AISVS6",
"section": "Supply Chain Security for Models, Frameworks & Data",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C06-Supply-Chain.md",
"cre_ids": ["613-285", "613-287", "863-521"]
},
{
"section_id": "AISVS7",
"section": "Model Behavior, Output Control & Safety Assurance",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C07-Model-Behavior.md",
"cre_ids": ["064-808", "141-555"]
},
{
"section_id": "AISVS8",
"section": "Memory, Embeddings & Vector Database Security",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C08-Memory-Embeddings-and-Vector-Database.md",
"cre_ids": ["126-668", "538-770"]
},
{
"section_id": "AISVS9",
"section": "Autonomous Orchestration & Agentic Action Security",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C09-Orchestration-and-Agentic-Action.md",
"cre_ids": ["117-371", "650-560"]
},
{
"section_id": "AISVS10",
"section": "Model Context Protocol (MCP) Security",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C10-MCP-Security.md",
"cre_ids": ["307-507", "715-223"]
},
{
"section_id": "AISVS11",
"section": "Adversarial Robustness & Privacy Defense",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C11-Adversarial-Robustness.md",
"cre_ids": ["141-555", "623-550"]
},
{
"section_id": "AISVS12",
"section": "Privacy Protection & Personal Data Management",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C12-Privacy.md",
"cre_ids": ["126-668", "227-045", "482-866"]
},
{
"section_id": "AISVS13",
"section": "Monitoring, Logging & Anomaly Detection",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C13-Monitoring-and-Logging.md",
"cre_ids": ["058-083", "148-420", "402-706", "843-841"]
},
{
"section_id": "AISVS14",
"section": "Human Oversight, Accountability & Governance",
"hyperlink": "https://github.com/OWASP/AISVS/tree/main/1.0/en/0x10-C14-Human-Oversight.md",
"cre_ids": ["162-655", "766-162"]
}
]
Loading