github.com/grafana/tanka@v0.26.1-0.20240506093700-c22cfc35c21a/pkg/process/extract_test.go (about)

     1  package process
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  var extractTestCases = []struct {
    11  	name       string
    12  	data       testData
    13  	errMessage string
    14  }{
    15  	{
    16  		name: "regular",
    17  		data: testDataRegular(),
    18  	},
    19  	{
    20  		name: "flat",
    21  		data: testDataFlat(),
    22  	},
    23  	{
    24  		name: "primitive",
    25  		data: testDataPrimitive(),
    26  		errMessage: `found invalid Kubernetes object (at .service): missing attribute "apiVersion"
    27  
    28  note: invalid because apiVersion and kind are missing
    29  `,
    30  	},
    31  	{
    32  		name: "missing kind",
    33  		data: testMissingAttribute(),
    34  		errMessage: `found invalid Kubernetes object (at .service): missing attribute "kind"
    35  
    36  apiVersion: v1
    37  spec:
    38      ports:
    39          - port: 80
    40            protocol: TCP
    41            targetPort: 8080
    42      selector:
    43          app: deep
    44  `,
    45  	},
    46  	{
    47  		name: "bad kind",
    48  		data: testBadKindType(),
    49  		errMessage: `found invalid Kubernetes object (at .deployment): attribute "kind" is not a string, it is a float64
    50  
    51  apiVersion: apps/v1
    52  kind: 3000
    53  metadata:
    54      name: grafana
    55  spec:
    56      replicas: 1
    57      template:
    58          containers:
    59              - image: grafana/grafana
    60                name: grafana
    61          metadata:
    62              labels:
    63                  app: grafana
    64  `,
    65  	},
    66  	{
    67  		name: "deep",
    68  		data: testDataDeep(),
    69  	},
    70  	{
    71  		name: "array",
    72  		data: testDataArray(),
    73  	},
    74  	{
    75  		name: "nil",
    76  		data: func() testData {
    77  			d := testDataRegular()
    78  			d.Deep.(map[string]interface{})["disabledObject"] = nil
    79  			return d
    80  		}(),
    81  		errMessage: "", // we expect no error, just the result of testDataRegular
    82  	},
    83  }
    84  
    85  func TestExtract(t *testing.T) {
    86  	for _, c := range extractTestCases {
    87  		t.Run(c.name, func(t *testing.T) {
    88  			extracted, err := Extract(c.data.Deep)
    89  
    90  			if c.errMessage != "" {
    91  				require.Error(t, err)
    92  				assert.Equal(t, c.errMessage, err.Error())
    93  				return
    94  			}
    95  
    96  			require.NoError(t, err)
    97  			assert.EqualValues(t, c.data.Flat, extracted)
    98  		})
    99  	}
   100  }
   101  
   102  func BenchmarkExtract(b *testing.B) {
   103  	for _, c := range extractTestCases {
   104  		if c.errMessage != "" {
   105  			continue
   106  		}
   107  		b.Run(c.name, func(b *testing.B) {
   108  			for i := 0; i < b.N; i++ {
   109  				// nolint:errcheck
   110  				Extract(c.data.Deep)
   111  			}
   112  		})
   113  	}
   114  }