Skip to content

Commit 7f73f93

Browse files
authored
Fix parser bug & add tests (#1147)
1 parent 93bc7f7 commit 7f73f93

File tree

2 files changed

+120
-1
lines changed

2 files changed

+120
-1
lines changed

src/Microsoft.Sbom.Parsers.Spdx22SbomParser/Utils/SPDXToSbomFormatConverterExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public static SbomReference ToSbomReference(this SpdxExternalDocumentReference s
102102
/// <param name="externalReference"></param>
103103
internal static string ToPurl(this IList<ExternalReference> externalReference)
104104
{
105-
var packageManagerReference = externalReference?.Where(e => e.ReferenceCategory.Replace("_", "-", System.StringComparison.Ordinal) == "PACKAGE-MANAGER")?.First();
105+
var packageManagerReference = externalReference?.Where(e => e.ReferenceCategory.Replace("_", "-", System.StringComparison.Ordinal) == "PACKAGE-MANAGER")?.FirstOrDefault();
106106
return packageManagerReference?.Locator;
107107
}
108108

test/Microsoft.Sbom.Parsers.Spdx22SbomParser.Tests/Utils/SbomFormatConverterTests.cs

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,123 @@ public void ToSbomChecksum_NullChecksum_ReturnsNull()
5858
var sbomChecksum = spdxChecksum.ToSbomChecksum();
5959
Assert.IsNull(sbomChecksum, "ToSbomChecksum should return null when the input checksum is null.");
6060
}
61+
62+
[TestMethod]
63+
public void ToPurl_EmptyExternalReferences_ReturnsNull()
64+
{
65+
var emptyExternalReferences = new List<ExternalReference>();
66+
var result = emptyExternalReferences.ToPurl();
67+
Assert.IsNull(result, "ToPurl should return null when external references list is empty.");
68+
}
69+
70+
[TestMethod]
71+
public void ToPurl_NullExternalReferences_ReturnsNull()
72+
{
73+
IList<ExternalReference> nullExternalReferences = null;
74+
var result = nullExternalReferences.ToPurl();
75+
Assert.IsNull(result, "ToPurl should return null when external references list is null.");
76+
}
77+
78+
[TestMethod]
79+
public void ToPurl_NoPackageManagerReferences_ReturnsNull()
80+
{
81+
var externalReferences = new List<ExternalReference>
82+
{
83+
new ExternalReference
84+
{
85+
ReferenceCategory = "SECURITY",
86+
Type = "cpe23Type",
87+
Locator = "cpe:2.3:a:antlr4_runtime_standard:antlr4_runtime_standard_.net:4.13.1:*:*:*:*:*:*:*"
88+
},
89+
new ExternalReference
90+
{
91+
ReferenceCategory = "OTHER",
92+
Type = "website",
93+
Locator = "https://example.com"
94+
}
95+
};
96+
97+
var result = externalReferences.ToPurl();
98+
Assert.IsNull(result, "ToPurl should return null when no PACKAGE-MANAGER references exist.");
99+
}
100+
101+
[TestMethod]
102+
public void ToPurl_WithPackageManagerReference_ReturnsCorrectPurl()
103+
{
104+
var externalReferences = new List<ExternalReference>
105+
{
106+
new ExternalReference
107+
{
108+
ReferenceCategory = "SECURITY",
109+
Type = "cpe23Type",
110+
Locator = "cpe:2.3:a:antlr4_runtime_standard:antlr4_runtime_standard_.net:4.13.1:*:*:*:*:*:*:*"
111+
},
112+
new ExternalReference
113+
{
114+
ReferenceCategory = "PACKAGE-MANAGER",
115+
Type = "purl",
116+
Locator = "pkg:nuget/Antlr4.Runtime.Standard@4.13.1"
117+
}
118+
};
119+
120+
var result = externalReferences.ToPurl();
121+
Assert.AreEqual("pkg:nuget/Antlr4.Runtime.Standard@4.13.1", result, "ToPurl should return the package manager locator value.");
122+
}
123+
124+
[TestMethod]
125+
public void ToPurl_WithUnderscoreInReferenceCategory_ReturnsCorrectPurl()
126+
{
127+
var externalReferences = new List<ExternalReference>
128+
{
129+
new ExternalReference
130+
{
131+
ReferenceCategory = "PACKAGE_MANAGER", // Using underscore format that gets converted to hyphen
132+
Type = "purl",
133+
Locator = "pkg:npm/test-package@1.0.0"
134+
}
135+
};
136+
137+
var result = externalReferences.ToPurl();
138+
Assert.AreEqual("pkg:npm/test-package@1.0.0", result, "ToPurl should handle underscore to hyphen conversion correctly.");
139+
}
140+
141+
[TestMethod]
142+
public void ToPurl_MultiplePackageManagerReferences_ReturnsFirst()
143+
{
144+
var externalReferences = new List<ExternalReference>
145+
{
146+
new ExternalReference
147+
{
148+
ReferenceCategory = "PACKAGE-MANAGER",
149+
Type = "purl",
150+
Locator = "pkg:nuget/FirstPackage@1.0.0"
151+
},
152+
new ExternalReference
153+
{
154+
ReferenceCategory = "PACKAGE-MANAGER",
155+
Type = "purl",
156+
Locator = "pkg:nuget/SecondPackage@2.0.0"
157+
}
158+
};
159+
160+
var result = externalReferences.ToPurl();
161+
Assert.AreEqual("pkg:nuget/FirstPackage@1.0.0", result, "ToPurl should return the first PACKAGE-MANAGER reference when multiple exist.");
162+
}
163+
164+
[TestMethod]
165+
public void ToPurl_PackageManagerReferenceWithNullLocator_ReturnsNull()
166+
{
167+
var externalReferences = new List<ExternalReference>
168+
{
169+
new ExternalReference
170+
{
171+
ReferenceCategory = "PACKAGE-MANAGER",
172+
Type = "purl",
173+
Locator = null
174+
}
175+
};
176+
177+
var result = externalReferences.ToPurl();
178+
Assert.IsNull(result, "ToPurl should return null when package manager reference has null locator.");
179+
}
61180
}

0 commit comments

Comments
 (0)