github.com/google/osv-scalibr@v0.4.1/enricher/packagedeprecation/packagedeprecation_test.go (about)

     1  // Copyright 2025 Google LLC
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package packagedeprecation_test
    16  
    17  import (
    18  	"testing"
    19  
    20  	grpcpb "deps.dev/api/v3alpha"
    21  	"github.com/google/go-cmp/cmp"
    22  	"github.com/google/osv-scalibr/enricher"
    23  	"github.com/google/osv-scalibr/enricher/packagedeprecation"
    24  	"github.com/google/osv-scalibr/extractor"
    25  	"github.com/google/osv-scalibr/inventory"
    26  	"github.com/google/osv-scalibr/purl"
    27  )
    28  
    29  func TestEnrich(t *testing.T) {
    30  	deprecationMap := map[packagedeprecation.VersionKey]bool{
    31  		packagedeprecation.VersionKey{System: grpcpb.System_CARGO, Name: "url", Version: "2.5.3"}: true,
    32  		packagedeprecation.VersionKey{System: grpcpb.System_CARGO, Name: "url", Version: "2.5.4"}: false,
    33  	}
    34  
    35  	fakeClient := newFakeClient(deprecationMap)
    36  	e := mustNew(t, &fakeClient)
    37  
    38  	tests := []struct {
    39  		name    string
    40  		client  packagedeprecation.Client
    41  		inv     *inventory.Inventory
    42  		want    *inventory.Inventory
    43  		wantErr error
    44  	}{
    45  		{
    46  			name: "empty_inventory",
    47  			inv:  &inventory.Inventory{},
    48  			want: &inventory.Inventory{},
    49  		},
    50  		{
    51  			name: "unsupported_purl_type",
    52  			inv: &inventory.Inventory{
    53  				Packages: []*extractor.Package{
    54  					&extractor.Package{
    55  						PURLType: "invalid",
    56  						Name:     "invalid",
    57  						Version:  "invalid",
    58  					},
    59  				},
    60  			},
    61  			want: &inventory.Inventory{
    62  				Packages: []*extractor.Package{
    63  					&extractor.Package{
    64  						PURLType:   "invalid",
    65  						Name:       "invalid",
    66  						Version:    "invalid",
    67  						Deprecated: false,
    68  					},
    69  				},
    70  			},
    71  		},
    72  		{
    73  			name: "package_version_not_found_in_depsdev",
    74  			inv: &inventory.Inventory{
    75  				Packages: []*extractor.Package{
    76  					&extractor.Package{
    77  						PURLType: purl.TypePyPi,
    78  						Name:     "pip",
    79  						Version:  "invalid",
    80  					},
    81  				}},
    82  			want: &inventory.Inventory{
    83  				Packages: []*extractor.Package{
    84  					&extractor.Package{
    85  						PURLType:   purl.TypePyPi,
    86  						Name:       "pip",
    87  						Version:    "invalid",
    88  						Deprecated: false,
    89  					},
    90  				},
    91  			},
    92  		},
    93  		{
    94  			name: "package_version_deprecated",
    95  			inv: &inventory.Inventory{
    96  				Packages: []*extractor.Package{
    97  					&extractor.Package{
    98  						PURLType: purl.TypeCargo,
    99  						Name:     "url",
   100  						Version:  "2.5.3",
   101  					},
   102  				},
   103  			},
   104  			want: &inventory.Inventory{
   105  				Packages: []*extractor.Package{
   106  					&extractor.Package{
   107  						PURLType:   purl.TypeCargo,
   108  						Name:       "url",
   109  						Version:    "2.5.3",
   110  						Deprecated: true,
   111  					},
   112  				},
   113  			},
   114  		},
   115  		{
   116  			name: "package_version_not_deprecated",
   117  			inv: &inventory.Inventory{
   118  				Packages: []*extractor.Package{
   119  					&extractor.Package{
   120  						PURLType: purl.TypeCargo,
   121  						Name:     "url",
   122  						Version:  "2.5.4",
   123  					},
   124  				},
   125  			},
   126  			want: &inventory.Inventory{
   127  				Packages: []*extractor.Package{
   128  					&extractor.Package{
   129  						PURLType:   purl.TypeCargo,
   130  						Name:       "url",
   131  						Version:    "2.5.4",
   132  						Deprecated: false,
   133  					},
   134  				},
   135  			},
   136  		},
   137  	}
   138  
   139  	for _, tc := range tests {
   140  		t.Run(tc.name, func(t *testing.T) {
   141  			enrichErr := e.Enrich(t.Context(), nil, tc.inv)
   142  			if enrichErr != nil {
   143  				t.Errorf("Enrich() returned error %v, want %v", enrichErr, tc.wantErr)
   144  			}
   145  			if diff := cmp.Diff(tc.want, tc.inv); diff != "" {
   146  				t.Errorf("Enrich() returned diff (-want +got):\n%s", diff)
   147  			}
   148  		})
   149  	}
   150  }
   151  
   152  func mustNew(t *testing.T, client packagedeprecation.Client) enricher.Enricher {
   153  	t.Helper()
   154  	e := packagedeprecation.New().(*packagedeprecation.Enricher)
   155  	e.SetClient(client)
   156  	return e
   157  }