using System.IO; using System.Xml.Linq; using StellaOps.Concelier.Connector.Ru.Bdu.Internal; using Xunit; using StellaOps.TestKit; namespace StellaOps.Concelier.Connector.Ru.Bdu.Tests; public sealed class RuBduXmlParserTests { [Trait("Category", TestCategories.Unit)] [Fact] public void TryParse_ValidElement_ReturnsDto() { const string xml = """ BDU:2025-12345 Уязвимость тестового продукта Описание уязвимости Обновить продукт 2025-10-10 Высокий уровень опасности Существует эксплойт Устранена Подтверждена производителем 1 AV:N/AC:L/Au:N/C:P/I:P/A:P AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H ООО «Вендор» Продукт 1.2.3 Windows ics https://advisories.example/BDU-2025-12345 https://mirror.example/ru-bdu/BDU-2025-12345 CVE-2025-12345 GHSA-xxxx-yyyy-zzzz CWE-79 XSS """; var element = XElement.Parse(xml); var dto = RuBduXmlParser.TryParse(element); Assert.NotNull(dto); Assert.Equal("BDU:2025-12345", dto!.Identifier); Assert.Equal("Уязвимость тестового продукта", dto.Name); Assert.Equal("AV:N/AC:L/Au:N/C:P/I:P/A:P", dto.CvssVector); Assert.Equal(7.5, dto.CvssScore); Assert.Equal("AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", dto.Cvss3Vector); Assert.Equal(9.8, dto.Cvss3Score); Assert.Single(dto.Software); Assert.Single(dto.Cwes); Assert.Equal(2, dto.Sources.Length); Assert.Contains("https://advisories.example/BDU-2025-12345", dto.Sources); Assert.Equal(2, dto.Identifiers.Length); Assert.Contains(dto.Identifiers, identifier => identifier.Type == "CVE" && identifier.Value == "CVE-2025-12345"); Assert.Contains(dto.Identifiers, identifier => identifier.Type == "GHSA" && identifier.Link == "https://github.com/advisories/GHSA-xxxx-yyyy-zzzz"); } [Trait("Category", TestCategories.Unit)] [Fact] public void TryParse_SampleArchiveEntries_ReturnDtos() { var path = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "Fixtures", "export-sample.xml")); var document = XDocument.Load(path); var vulnerabilities = document.Root?.Elements("vul"); Assert.NotNull(vulnerabilities); foreach (var element in vulnerabilities!) { var dto = RuBduXmlParser.TryParse(element); Assert.NotNull(dto); Assert.False(string.IsNullOrWhiteSpace(dto!.Identifier)); } } }