github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/analyzer/language/analyze_test.go (about)

     1  package language_test
     2  
     3  import (
     4  	"io"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  	"golang.org/x/xerrors"
    11  
    12  	dio "github.com/aquasecurity/go-dep-parser/pkg/io"
    13  	godeptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
    14  	"github.com/devseccon/trivy/pkg/fanal/analyzer"
    15  	"github.com/devseccon/trivy/pkg/fanal/analyzer/language"
    16  	"github.com/devseccon/trivy/pkg/fanal/types"
    17  )
    18  
    19  type mockParser struct {
    20  	t *testing.T
    21  }
    22  
    23  func (p *mockParser) Parse(r dio.ReadSeekerAt) ([]godeptypes.Library, []godeptypes.Dependency, error) {
    24  	b, err := io.ReadAll(r)
    25  	require.NoError(p.t, err)
    26  
    27  	switch string(b) {
    28  	case "happy":
    29  		return []godeptypes.Library{
    30  			{
    31  				Name:    "test",
    32  				Version: "1.2.3",
    33  			},
    34  		}, nil, nil
    35  	case "sad":
    36  		return nil, nil, xerrors.New("unexpected error")
    37  	}
    38  
    39  	return nil, nil, nil
    40  }
    41  
    42  func TestAnalyze(t *testing.T) {
    43  	type args struct {
    44  		fileType types.LangType
    45  		filePath string
    46  		content  dio.ReadSeekerAt
    47  	}
    48  	tests := []struct {
    49  		name    string
    50  		args    args
    51  		want    *analyzer.AnalysisResult
    52  		wantErr string
    53  	}{
    54  		{
    55  			name: "happy path",
    56  			args: args{
    57  				fileType: types.GoBinary,
    58  				filePath: "app/myweb",
    59  				content:  strings.NewReader("happy"),
    60  			},
    61  			want: &analyzer.AnalysisResult{
    62  				Applications: []types.Application{
    63  					{
    64  						Type:     types.GoBinary,
    65  						FilePath: "app/myweb",
    66  						Libraries: types.Packages{
    67  							{
    68  								Name:    "test",
    69  								Version: "1.2.3",
    70  							},
    71  						},
    72  					},
    73  				},
    74  			},
    75  		},
    76  		{
    77  			name: "empty",
    78  			args: args{
    79  				fileType: types.GoBinary,
    80  				filePath: "app/myweb",
    81  				content:  strings.NewReader(""),
    82  			},
    83  			want: nil,
    84  		},
    85  		{
    86  			name: "sad path",
    87  			args: args{
    88  				fileType: types.Jar,
    89  				filePath: "app/myweb",
    90  				content:  strings.NewReader("sad"),
    91  			},
    92  			wantErr: "unexpected error",
    93  		},
    94  	}
    95  	for _, tt := range tests {
    96  		t.Run(tt.name, func(t *testing.T) {
    97  			mp := &mockParser{t: t}
    98  
    99  			got, err := language.Analyze(tt.args.fileType, tt.args.filePath, tt.args.content, mp)
   100  			if tt.wantErr != "" {
   101  				require.NotNil(t, err)
   102  				assert.Contains(t, err.Error(), tt.wantErr)
   103  				return
   104  			}
   105  
   106  			require.NoError(t, err)
   107  			assert.Equal(t, tt.want, got)
   108  		})
   109  	}
   110  }