@@ -4,7 +4,9 @@ namespace Microsoft.ComponentDetection.Common.Tests;
44using System ;
55using AwesomeAssertions ;
66using Microsoft . ComponentDetection . Contracts ;
7+ using Microsoft . ComponentDetection . Contracts . BcdeModels ;
78using Microsoft . VisualStudio . TestTools . UnitTesting ;
9+ using Moq ;
810
911[ TestClass ]
1012[ TestCategory ( "Governance/All" ) ]
@@ -268,4 +270,97 @@ public void ParseAll_ParsesFamiliarNames()
268270 result . Should ( ) . NotBeNull ( ) ;
269271 result . Should ( ) . BeAssignableTo < RepositoryReference > ( ) ;
270272 }
273+
274+ [ TestMethod ]
275+ public void HasUnresolvedVariables_ReturnsTrueForDollarSign ( )
276+ {
277+ DockerReferenceUtility . HasUnresolvedVariables ( "${MY_IMAGE}:latest" ) . Should ( ) . BeTrue ( ) ;
278+ }
279+
280+ [ TestMethod ]
281+ public void HasUnresolvedVariables_ReturnsTrueForBraces ( )
282+ {
283+ DockerReferenceUtility . HasUnresolvedVariables ( "{{ .Values.image }}" ) . Should ( ) . BeTrue ( ) ;
284+ }
285+
286+ [ TestMethod ]
287+ public void HasUnresolvedVariables_ReturnsFalseForPlainReference ( )
288+ {
289+ DockerReferenceUtility . HasUnresolvedVariables ( "docker.io/library/nginx:latest" ) . Should ( ) . BeFalse ( ) ;
290+ }
291+
292+ [ TestMethod ]
293+ public void TryParseImageReference_ReturnsNullForUnresolvedVariables ( )
294+ {
295+ DockerReferenceUtility . TryParseImageReference ( "${IMAGE}:latest" ) . Should ( ) . BeNull ( ) ;
296+ }
297+
298+ [ TestMethod ]
299+ public void TryParseImageReference_ReturnsNullForInvalidReference ( )
300+ {
301+ DockerReferenceUtility . TryParseImageReference ( "docker.io/library/Nginx" ) . Should ( ) . BeNull ( ) ;
302+ }
303+
304+ [ TestMethod ]
305+ public void TryParseImageReference_ReturnsParsedReferenceForValidInput ( )
306+ {
307+ var result = DockerReferenceUtility . TryParseImageReference ( "nginx:latest" ) ;
308+
309+ result . Should ( ) . NotBeNull ( ) ;
310+ result . Should ( ) . BeAssignableTo < TaggedReference > ( ) ;
311+ }
312+
313+ [ TestMethod ]
314+ public void TryParseImageReference_ReturnsParsedReferenceForDigest ( )
315+ {
316+ var digest = $ "sha256:{ new string ( 'a' , 64 ) } ";
317+ var result = DockerReferenceUtility . TryParseImageReference ( $ "nginx@{ digest } ") ;
318+
319+ result . Should ( ) . NotBeNull ( ) ;
320+ result . Should ( ) . BeAssignableTo < CanonicalReference > ( ) ;
321+ ( ( CanonicalReference ) result ) . Digest . Should ( ) . Be ( digest ) ;
322+ }
323+
324+ [ TestMethod ]
325+ public void TryParseImageReference_ReturnsParsedReferenceForTagAndDigest ( )
326+ {
327+ var digest = $ "sha256:{ new string ( 'a' , 64 ) } ";
328+ var result = DockerReferenceUtility . TryParseImageReference ( $ "nginx:latest@{ digest } ") ;
329+
330+ result . Should ( ) . NotBeNull ( ) ;
331+ result . Should ( ) . BeAssignableTo < DualReference > ( ) ;
332+ var dualRef = ( DualReference ) result ;
333+ dualRef . Tag . Should ( ) . Be ( "latest" ) ;
334+ dualRef . Digest . Should ( ) . Be ( digest ) ;
335+ }
336+
337+ [ TestMethod ]
338+ public void TryRegisterImageReference_RegistersValidReference ( )
339+ {
340+ var recorder = new Mock < ISingleFileComponentRecorder > ( ) ;
341+
342+ DockerReferenceUtility . TryRegisterImageReference ( "nginx:latest" , recorder . Object ) ;
343+
344+ recorder . Verify ( r => r . RegisterUsage ( It . IsAny < DetectedComponent > ( ) , It . IsAny < bool > ( ) , It . IsAny < string > ( ) , It . IsAny < bool ? > ( ) , It . IsAny < DependencyScope ? > ( ) , It . IsAny < string > ( ) ) , Times . Once ) ;
345+ }
346+
347+ [ TestMethod ]
348+ public void TryRegisterImageReference_SkipsUnresolvedVariables ( )
349+ {
350+ var recorder = new Mock < ISingleFileComponentRecorder > ( ) ;
351+
352+ DockerReferenceUtility . TryRegisterImageReference ( "${IMAGE}" , recorder . Object ) ;
353+
354+ recorder . Verify ( r => r . RegisterUsage ( It . IsAny < DetectedComponent > ( ) , It . IsAny < bool > ( ) , It . IsAny < string > ( ) , It . IsAny < bool ? > ( ) , It . IsAny < DependencyScope ? > ( ) , It . IsAny < string > ( ) ) , Times . Never ) ;
355+ }
356+
357+ [ TestMethod ]
358+ public void TryRegisterImageReference_SkipsInvalidReference ( )
359+ {
360+ var recorder = new Mock < ISingleFileComponentRecorder > ( ) ;
361+
362+ DockerReferenceUtility . TryRegisterImageReference ( "docker.io/library/Nginx" , recorder . Object ) ;
363+
364+ recorder . Verify ( r => r . RegisterUsage ( It . IsAny < DetectedComponent > ( ) , It . IsAny < bool > ( ) , It . IsAny < string > ( ) , It . IsAny < bool ? > ( ) , It . IsAny < DependencyScope ? > ( ) , It . IsAny < string > ( ) ) , Times . Never ) ;
365+ }
271366}
0 commit comments