github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/flag/remote_flags_test.go (about)

     1  package flag_test
     2  
     3  import (
     4  	"net/http"
     5  	"testing"
     6  
     7  	"github.com/spf13/viper"
     8  	"github.com/stretchr/testify/assert"
     9  	"go.uber.org/zap"
    10  	"go.uber.org/zap/zaptest/observer"
    11  
    12  	"github.com/devseccon/trivy/pkg/flag"
    13  	"github.com/devseccon/trivy/pkg/log"
    14  )
    15  
    16  func TestRemoteFlagGroup_ToOptions(t *testing.T) {
    17  	type fields struct {
    18  		Server        string
    19  		CustomHeaders []string
    20  		Token         string
    21  		TokenHeader   string
    22  	}
    23  	tests := []struct {
    24  		name     string
    25  		fields   fields
    26  		want     flag.RemoteOptions
    27  		wantLogs []string
    28  	}{
    29  		{
    30  			name: "happy",
    31  			fields: fields{
    32  				Server: "http://localhost:4954",
    33  				CustomHeaders: []string{
    34  					"x-api-token:foo bar",
    35  					"Authorization:user:password",
    36  				},
    37  				Token:       "token",
    38  				TokenHeader: "Trivy-Token",
    39  			},
    40  			want: flag.RemoteOptions{
    41  				ServerAddr: "http://localhost:4954",
    42  				CustomHeaders: http.Header{
    43  					"X-Api-Token":   []string{"foo bar"},
    44  					"Authorization": []string{"user:password"},
    45  					"Trivy-Token":   []string{"token"},
    46  				},
    47  				Token:       "token",
    48  				TokenHeader: "Trivy-Token",
    49  			},
    50  		},
    51  		{
    52  			name: "custom headers and no server",
    53  			fields: fields{
    54  				CustomHeaders: []string{
    55  					"Authorization:user:password",
    56  				},
    57  				TokenHeader: "Trivy-Token",
    58  			},
    59  			want: flag.RemoteOptions{
    60  				CustomHeaders: http.Header{
    61  					"Authorization": []string{"user:password"},
    62  				},
    63  				TokenHeader: "Trivy-Token",
    64  			},
    65  			wantLogs: []string{
    66  				`"--custom-header" can be used only with "--server"`,
    67  			},
    68  		},
    69  		{
    70  			name: "token and no server",
    71  			fields: fields{
    72  				Token: "token",
    73  			},
    74  			want: flag.RemoteOptions{
    75  				CustomHeaders: http.Header{},
    76  				Token:         "token",
    77  			},
    78  			wantLogs: []string{
    79  				`"--token" can be used only with "--server"`,
    80  			},
    81  		},
    82  		{
    83  			name: "token header and no token",
    84  			fields: fields{
    85  				Server:      "http://localhost:4954",
    86  				TokenHeader: "Non-Default",
    87  			},
    88  			want: flag.RemoteOptions{
    89  				CustomHeaders: http.Header{},
    90  				ServerAddr:    "http://localhost:4954",
    91  				TokenHeader:   "Non-Default",
    92  			},
    93  			wantLogs: []string{
    94  				`"--token-header" should be used with "--token"`,
    95  			},
    96  		},
    97  	}
    98  	for _, tt := range tests {
    99  		t.Run(tt.name, func(t *testing.T) {
   100  			level := zap.WarnLevel
   101  			core, obs := observer.New(level)
   102  			log.Logger = zap.New(core).Sugar()
   103  
   104  			viper.Set(flag.ServerAddrFlag.ConfigName, tt.fields.Server)
   105  			viper.Set(flag.ServerCustomHeadersFlag.ConfigName, tt.fields.CustomHeaders)
   106  			viper.Set(flag.ServerTokenFlag.ConfigName, tt.fields.Token)
   107  			viper.Set(flag.ServerTokenHeaderFlag.ConfigName, tt.fields.TokenHeader)
   108  
   109  			// Assert options
   110  			f := &flag.RemoteFlagGroup{
   111  				ServerAddr:    &flag.ServerAddrFlag,
   112  				CustomHeaders: &flag.ServerCustomHeadersFlag,
   113  				Token:         &flag.ServerTokenFlag,
   114  				TokenHeader:   &flag.ServerTokenHeaderFlag,
   115  			}
   116  			got := f.ToOptions()
   117  			assert.Equalf(t, tt.want, got, "ToOptions()")
   118  
   119  			// Assert log messages
   120  			var gotMessages []string
   121  			for _, entry := range obs.AllUntimed() {
   122  				gotMessages = append(gotMessages, entry.Message)
   123  			}
   124  			assert.Equal(t, tt.wantLogs, gotMessages, tt.name)
   125  		})
   126  	}
   127  }