github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/pkg/relationships_test.go (about)

     1  package pkg
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/anchore/syft/syft/artifact"
     7  )
     8  
     9  func TestSortRelationships(t *testing.T) {
    10  	rxjs := Package{
    11  		Name:         "rxjs",
    12  		Version:      "7.5.0",
    13  		FoundBy:      "javascript-cataloger",
    14  		PURL:         "pkg:npm/rxjs@7.5.0",
    15  		Language:     JavaScript,
    16  		Type:         NpmPkg,
    17  		MetadataType: NpmPackageLockJSONMetadataType,
    18  	}
    19  	testApp := Package{
    20  		Name:         "test-app",
    21  		Version:      "0.0.0",
    22  		FoundBy:      "javascript-cataloger",
    23  		PURL:         "pkg:npm/test-app@0.0.0",
    24  		Language:     JavaScript,
    25  		Type:         NpmPkg,
    26  		MetadataType: NpmPackageLockJSONMetadataType,
    27  	}
    28  	tslib := Package{
    29  		Name:         "tslib",
    30  		Version:      "2.6.2",
    31  		FoundBy:      "javascript-cataloger",
    32  		PURL:         "pkg:npm/tslib@2.6.2",
    33  		Language:     JavaScript,
    34  		Type:         NpmPkg,
    35  		MetadataType: NpmPackageLockJSONMetadataType,
    36  	}
    37  	typescript := Package{
    38  		Name:         "typescript",
    39  		Version:      "4.7.4",
    40  		FoundBy:      "javascript-cataloger",
    41  		PURL:         "pkg:npm/typescript@4.7.4",
    42  		Language:     JavaScript,
    43  		Type:         NpmPkg,
    44  		MetadataType: NpmPackageLockJSONMetadataType,
    45  	}
    46  	zonejs := Package{
    47  		Name:         "zone.js",
    48  		Version:      "0.11.8",
    49  		FoundBy:      "javascript-cataloger",
    50  		PURL:         "pkg:npm/zone.js@0.11.8",
    51  		Language:     JavaScript,
    52  		Type:         NpmPkg,
    53  		MetadataType: NpmPackageLockJSONMetadataType,
    54  	}
    55  
    56  	tests := []struct {
    57  		name     string
    58  		input    []artifact.Relationship
    59  		expected []artifact.Relationship
    60  	}{
    61  		{
    62  			name: "basic sort",
    63  			input: []artifact.Relationship{
    64  				{
    65  					From: testApp,
    66  					To:   zonejs,
    67  					Type: artifact.DependencyOfRelationship,
    68  					Data: nil,
    69  				},
    70  				{
    71  					From: testApp,
    72  					To:   rxjs,
    73  					Type: artifact.DependencyOfRelationship,
    74  					Data: nil,
    75  				},
    76  				{
    77  					From: testApp,
    78  					To:   tslib,
    79  					Type: artifact.DependencyOfRelationship,
    80  					Data: nil,
    81  				},
    82  				{
    83  					From: testApp,
    84  					To:   typescript,
    85  					Type: artifact.DependencyOfRelationship,
    86  					Data: nil,
    87  				},
    88  				{
    89  					From: zonejs,
    90  					To:   tslib,
    91  					Type: artifact.DependencyOfRelationship,
    92  					Data: nil,
    93  				},
    94  				{
    95  					From: rxjs,
    96  					To:   tslib,
    97  					Type: artifact.DependencyOfRelationship,
    98  					Data: nil,
    99  				},
   100  			},
   101  			expected: []artifact.Relationship{
   102  				{
   103  					From: rxjs,
   104  					To:   tslib,
   105  					Type: artifact.DependencyOfRelationship,
   106  					Data: nil,
   107  				},
   108  				{
   109  					From: testApp,
   110  					To:   rxjs,
   111  					Type: artifact.DependencyOfRelationship,
   112  					Data: nil,
   113  				},
   114  				{
   115  					From: testApp,
   116  					To:   tslib,
   117  					Type: artifact.DependencyOfRelationship,
   118  					Data: nil,
   119  				},
   120  				{
   121  					From: testApp,
   122  					To:   typescript,
   123  					Type: artifact.DependencyOfRelationship,
   124  					Data: nil,
   125  				},
   126  				{
   127  					From: testApp,
   128  					To:   zonejs,
   129  					Type: artifact.DependencyOfRelationship,
   130  					Data: nil,
   131  				},
   132  				{
   133  					From: zonejs,
   134  					To:   tslib,
   135  					Type: artifact.DependencyOfRelationship,
   136  					Data: nil,
   137  				},
   138  			},
   139  		},
   140  	}
   141  
   142  	for _, tt := range tests {
   143  		t.Run(tt.name, func(t *testing.T) {
   144  			SortRelationships(tt.input)
   145  			for i, got := range tt.input {
   146  				if !compareRelationships(got, tt.expected[i]) {
   147  					t.Errorf("Expected %v, got %v", tt.expected[i], got)
   148  				}
   149  			}
   150  		})
   151  	}
   152  }
   153  
   154  func compareRelationships(a, b artifact.Relationship) bool {
   155  	aFrom, ok1 := a.From.(Package)
   156  	bFrom, ok2 := b.From.(Package)
   157  	aTo, ok3 := a.To.(Package)
   158  	bTo, ok4 := b.To.(Package)
   159  
   160  	if !(ok1 && ok2 && ok3 && ok4) {
   161  		return false
   162  	}
   163  
   164  	return aFrom.Name == bFrom.Name &&
   165  		aFrom.Version == bFrom.Version &&
   166  		aTo.Name == bTo.Name &&
   167  		aTo.Version == bTo.Version &&
   168  		a.Type == b.Type
   169  }