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

     1  package process
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/grafana/tanka/pkg/kubernetes/manifest"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestSort(t *testing.T) {
    11  	cases := []struct {
    12  		raw   manifest.List
    13  		state manifest.List
    14  		err   error
    15  	}{
    16  		{
    17  			// sorting by kinds in the `kindOrder` list
    18  			raw: manifest.List{
    19  				mkobj("Service", "service", "default"),
    20  				mkobj("Deployment", "deployment", "default"),
    21  				mkobj("CustomResourceDefinition", "crd", ""),
    22  			},
    23  			state: manifest.List{
    24  				mkobj("CustomResourceDefinition", "crd", ""),
    25  				mkobj("Service", "service", "default"),
    26  				mkobj("Deployment", "deployment", "default"),
    27  			},
    28  		},
    29  		{
    30  			// alphabtical sorting by kinds outside `kindOrder` list
    31  			raw: manifest.List{
    32  				mkobj("B", "b", "default"),
    33  				mkobj("C", "c", "default"),
    34  				mkobj("A", "a", "default"),
    35  			},
    36  			state: manifest.List{
    37  				mkobj("A", "a", "default"),
    38  				mkobj("B", "b", "default"),
    39  				mkobj("C", "c", "default"),
    40  			},
    41  		},
    42  		{
    43  			// sorting by the namespace if kinds match
    44  			raw: manifest.List{
    45  				mkobj("Service", "service", "default2"),
    46  				mkobj("Service", "service", "default"),
    47  				mkobj("Service", "service", "default1"),
    48  			},
    49  			state: manifest.List{
    50  				mkobj("Service", "service", "default"),
    51  				mkobj("Service", "service", "default1"),
    52  				mkobj("Service", "service", "default2"),
    53  			},
    54  		},
    55  		{
    56  			// sorting by the names if both kinds and namespaces match
    57  			raw: manifest.List{
    58  				mkobj("Service", "service2", "default"),
    59  				mkobj("Service", "service", "default"),
    60  				mkobj("Service", "service1", "default"),
    61  			},
    62  			state: manifest.List{
    63  				mkobj("Service", "service", "default"),
    64  				mkobj("Service", "service1", "default"),
    65  				mkobj("Service", "service2", "default"),
    66  			},
    67  		},
    68  		{
    69  			// sorting by the names if both kinds match and there are no namespaces
    70  			raw: manifest.List{
    71  				mkobj("CustomResourceDefinition", "crd2", ""),
    72  				mkobj("CustomResourceDefinition", "crd", ""),
    73  				mkobj("CustomResourceDefinition", "crd1", ""),
    74  			},
    75  			state: manifest.List{
    76  				mkobj("CustomResourceDefinition", "crd", ""),
    77  				mkobj("CustomResourceDefinition", "crd1", ""),
    78  				mkobj("CustomResourceDefinition", "crd2", ""),
    79  			},
    80  		},
    81  		{
    82  			raw: manifest.List{
    83  				mkobj("Deployment", "b", "a"),
    84  				mkobj("ConfigMap", "a", "a"),
    85  				mkobj("Issuer", "a", "a"),
    86  				mkobj("Service", "b", "a"),
    87  				mkobj("Service", "a", "a"),
    88  				mkobj("Deployment", "a", "a"),
    89  				mkobj("ConfigMap", "a", "b"),
    90  				mkobj("Issuer", "b", "a"),
    91  				mkobj("Service", "b", "b"),
    92  				mkobj("Deployment", "a", "b"),
    93  				mkobj("ConfigMap", "b", "a"),
    94  				mkobj("Issuer", "a", "b"),
    95  			},
    96  			state: manifest.List{
    97  				mkobj("ConfigMap", "a", "a"),
    98  				mkobj("ConfigMap", "b", "a"),
    99  				mkobj("ConfigMap", "a", "b"),
   100  				mkobj("Service", "a", "a"),
   101  				mkobj("Service", "b", "a"),
   102  				mkobj("Service", "b", "b"),
   103  				mkobj("Deployment", "a", "a"),
   104  				mkobj("Deployment", "b", "a"),
   105  				mkobj("Deployment", "a", "b"),
   106  				mkobj("Issuer", "a", "a"),
   107  				mkobj("Issuer", "b", "a"),
   108  				mkobj("Issuer", "a", "b"),
   109  			},
   110  		},
   111  	}
   112  
   113  	for _, c := range cases {
   114  		Sort(c.raw)
   115  		require.Equal(t, c.state, c.raw)
   116  	}
   117  }
   118  
   119  func mkobj(kind string, name string, ns string) map[string]interface{} {
   120  	ret := map[string]interface{}{
   121  		"kind":       kind,
   122  		"apiVersion": "apiversion",
   123  		"metadata": map[string]interface{}{
   124  			"name": name,
   125  		},
   126  	}
   127  	if ns != "" {
   128  		ret["metadata"].(map[string]interface{})["namespace"] = ns
   129  	}
   130  
   131  	return ret
   132  }