@@ -99,6 +99,65 @@ func TestLicenseRiskArtifactAssociation(t *testing.T) {
9999 })
100100}
101101
102+ func TestLicenseRiskClosedByRefresh (t * testing.T ) {
103+ mockOpenSourceInsightService := mocks .NewOpenSourceInsightService (t )
104+
105+ WithTestAppOptions (t , "../initdb.sql" , TestAppOptions {
106+ SuppressLogs : true ,
107+ ExtraOptions : []fx.Option {
108+ fx .Decorate (func () shared.OpenSourceInsightService {
109+ return mockOpenSourceInsightService
110+ }),
111+ },
112+ }, func (f * TestFixture ) {
113+ _ , _ , asset , assetVersion := f .CreateOrgProjectAssetAndVersion ()
114+
115+ // Component starts with an invalid license
116+ comp := models.Component {
117+ ID : "pkg:npm/bad-license-package@1.0.0" ,
118+ License : utils .Ptr ("PROPRIETARY" ),
119+ }
120+ assert .NoError (t , f .DB .Create (& comp ).Error )
121+
122+ artifact := models.Artifact {
123+ ArtifactName : "test-artifact" ,
124+ AssetVersionName : assetVersion .Name ,
125+ AssetID : assetVersion .AssetID ,
126+ }
127+ assert .NoError (t , f .DB .Create (& artifact ).Error )
128+
129+ // Wire the component into the SBOM graph so GetAndSaveLicenseInformation can find it
130+ artifactRoot := "artifact:" + artifact .ArtifactName
131+ infoSourceID := "sbom:DEFAULT@" + artifact .ArtifactName
132+ assert .NoError (t , f .DB .Create (& models.Component {ID : artifactRoot }).Error )
133+ assert .NoError (t , f .DB .Create (& models.Component {ID : infoSourceID }).Error )
134+ assert .NoError (t , f .DB .Create (& models.ComponentDependency {AssetID : assetVersion .AssetID , AssetVersionName : assetVersion .Name , ComponentID : "ROOT" , DependencyID : artifactRoot }).Error )
135+ assert .NoError (t , f .DB .Create (& models.ComponentDependency {AssetID : assetVersion .AssetID , AssetVersionName : assetVersion .Name , ComponentID : artifactRoot , DependencyID : infoSourceID }).Error )
136+ assert .NoError (t , f .DB .Create (& models.ComponentDependency {AssetID : assetVersion .AssetID , AssetVersionName : assetVersion .Name , ComponentID : infoSourceID , DependencyID : comp .ID }).Error )
137+
138+ // Open the license risk
139+ err := f .App .LicenseRiskService .FindLicenseRisksInComponents (context .Background (), nil , "system" , nil , assetVersion , []models.Component {comp }, artifact .ArtifactName )
140+ assert .NoError (t , err )
141+
142+ risks , err := f .App .LicenseRiskRepository .GetByAssetID (context .Background (), nil , asset .ID )
143+ assert .NoError (t , err )
144+ assert .Len (t , risks , 1 )
145+ assert .Equal (t , dtos .VulnStateOpen , risks [0 ].State )
146+
147+ // Refresh returns a valid license now
148+ mockOpenSourceInsightService .On ("GetVersion" , mock .Anything , mock .Anything , mock .Anything , mock .Anything ).
149+ Return (dtos.OpenSourceInsightsVersionResponse {Licenses : []string {"MIT" }}, nil )
150+
151+ _ , err = f .App .ComponentService .GetAndSaveLicenseInformation (context .Background (), nil , assetVersion , nil , true )
152+ assert .NoError (t , err )
153+
154+ risks , err = f .App .LicenseRiskRepository .GetByAssetID (context .Background (), nil , asset .ID )
155+ assert .NoError (t , err )
156+ assert .Len (t , risks , 1 )
157+ assert .Equal (t , dtos .VulnStateFixed , risks [0 ].State , "license risk should be closed after refresh returns a valid license" )
158+ })
159+ }
160+
102161func getSBOMWithWithLicenseRisk () io.Reader {
103162 file , err := os .Open ("testdata/sbom-with-license-risk.json" )
104163 if err != nil {
0 commit comments