"""Tests for stix.ExternalReference""" import re import pytest import stix2 VERIS = """{ "source_name": "veris", "url": "https://github.com/vz-risk/VCDB/blob/master/data/json/0001AA7F-C601-424A-B2B8-BE6C9F5164E7.json", "hashes": { "SHA-256": "6db12788c37247f2316052e142f42f4b259d6561751e5f401a1ae2a6df9c674b" }, "external_id": "0001AA7F-C601-424A-B2B8-BE6C9F5164E7" }""" def test_external_reference_veris(): ref = stix2.v20.ExternalReference( source_name="veris", external_id="0001AA7F-C601-424A-B2B8-BE6C9F5164E7", hashes={ "SHA-256": "6db12788c37247f2316052e142f42f4b259d6561751e5f401a1ae2a6df9c674b", }, url="https://github.com/vz-risk/VCDB/blob/master/data/json/0001AA7F-C601-424A-B2B8-BE6C9F5164E7.json", ) assert str(ref) == VERIS CAPEC = """{ "source_name": "capec", "external_id": "CAPEC-550" }""" def test_external_reference_capec(): ref = stix2.v20.ExternalReference( source_name="capec", external_id="CAPEC-550", ) assert str(ref) == CAPEC assert re.match("ExternalReference\\(source_name=u?'capec', external_id=u?'CAPEC-550'\\)", repr(ref)) CAPEC_URL = """{ "source_name": "capec", "url": "http://capec.mitre.org/data/definitions/550.html", "external_id": "CAPEC-550" }""" def test_external_reference_capec_url(): ref = stix2.v20.ExternalReference( source_name="capec", external_id="CAPEC-550", url="http://capec.mitre.org/data/definitions/550.html", ) assert str(ref) == CAPEC_URL THREAT_REPORT = """{ "source_name": "ACME Threat Intel", "description": "Threat report", "url": "http://www.example.com/threat-report.pdf" }""" def test_external_reference_threat_report(): ref = stix2.v20.ExternalReference( source_name="ACME Threat Intel", description="Threat report", url="http://www.example.com/threat-report.pdf", ) assert str(ref) == THREAT_REPORT BUGZILLA = """{ "source_name": "ACME Bugzilla", "url": "https://www.example.com/bugs/1370", "external_id": "1370" }""" def test_external_reference_bugzilla(): ref = stix2.v20.ExternalReference( source_name="ACME Bugzilla", external_id="1370", url="https://www.example.com/bugs/1370", ) assert str(ref) == BUGZILLA OFFLINE = """{ "source_name": "ACME Threat Intel", "description": "Threat report" }""" def test_external_reference_offline(): ref = stix2.v20.ExternalReference( source_name="ACME Threat Intel", description="Threat report", ) assert str(ref) == OFFLINE assert re.match("ExternalReference\\(source_name=u?'ACME Threat Intel', description=u?'Threat report'\\)", repr(ref)) # Yikes! This works assert eval("stix2." + repr(ref)) == ref def test_external_reference_source_required(): with pytest.raises(stix2.exceptions.MissingPropertiesError) as excinfo: stix2.v20.ExternalReference() assert excinfo.value.cls == stix2.v20.ExternalReference assert excinfo.value.properties == ["source_name"]