github.com/shipa-corp/ketch@v0.6.0/cmd/ketch/app_test.go (about)

     1  package main
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  	apiv1 "k8s.io/api/core/v1"
     8  
     9  	ketchv1 "github.com/shipa-corp/ketch/internal/api/v1beta1"
    10  )
    11  
    12  func Test_appState(t *testing.T) {
    13  	tests := []struct {
    14  		name string
    15  		pods []apiv1.Pod
    16  		want string
    17  	}{
    18  		{
    19  			name: "app without pods",
    20  			pods: nil,
    21  			want: "created",
    22  		},
    23  		{
    24  			name: "1 pod for each state",
    25  			pods: []apiv1.Pod{
    26  				apiv1.Pod{
    27  					Status: apiv1.PodStatus{
    28  						Phase: apiv1.PodPending,
    29  					},
    30  				},
    31  				apiv1.Pod{
    32  					Status: apiv1.PodStatus{
    33  						Phase: apiv1.PodRunning,
    34  					},
    35  				},
    36  				apiv1.Pod{
    37  					Status: apiv1.PodStatus{
    38  						Phase: apiv1.PodSucceeded,
    39  					},
    40  				},
    41  				apiv1.Pod{
    42  					Status: apiv1.PodStatus{
    43  						Phase: apiv1.PodFailed,
    44  					},
    45  				},
    46  				apiv1.Pod{
    47  					Status: apiv1.PodStatus{
    48  						Phase: apiv1.PodUnknown,
    49  					},
    50  				},
    51  			},
    52  			want: "1 deploying, 1 running, 2 error, 1 succeeded",
    53  		},
    54  	}
    55  
    56  	for _, tt := range tests {
    57  		t.Run(tt.name, func(t *testing.T) {
    58  			state := appState(tt.pods)
    59  			require.Equal(t, tt.want, state)
    60  		})
    61  	}
    62  }
    63  
    64  func Test_podState(t *testing.T) {
    65  	tests := []struct {
    66  		name string
    67  		pod  apiv1.Pod
    68  		want ketchv1.PodState
    69  	}{
    70  		{
    71  			name: "pod without state",
    72  			pod:  apiv1.Pod{},
    73  			want: ketchv1.PodError,
    74  		},
    75  		{
    76  			name: "pod pending",
    77  			pod: apiv1.Pod{
    78  				Status: apiv1.PodStatus{
    79  					Phase: apiv1.PodPending,
    80  				},
    81  			},
    82  			want: ketchv1.PodDeploying,
    83  		},
    84  		{
    85  			name: "pod running",
    86  			pod: apiv1.Pod{
    87  				Status: apiv1.PodStatus{
    88  					Phase: apiv1.PodRunning,
    89  				},
    90  			},
    91  			want: ketchv1.PodRunning,
    92  		},
    93  		{
    94  			name: "pod running, but container in CrashLoopBackOff",
    95  			pod: apiv1.Pod{
    96  				Status: apiv1.PodStatus{
    97  					Phase: apiv1.PodRunning,
    98  					ContainerStatuses: []apiv1.ContainerStatus{
    99  						{
   100  							State: apiv1.ContainerState{
   101  								Waiting: &apiv1.ContainerStateWaiting{
   102  									Reason: "CrashLoopBackOff",
   103  								},
   104  							},
   105  						},
   106  					},
   107  				},
   108  			},
   109  			want: ketchv1.PodError,
   110  		},
   111  		{
   112  			name: "pod running, but container in Completed",
   113  			pod: apiv1.Pod{
   114  				Status: apiv1.PodStatus{
   115  					Phase: apiv1.PodRunning,
   116  					ContainerStatuses: []apiv1.ContainerStatus{
   117  						{
   118  							State: apiv1.ContainerState{
   119  								Terminated: &apiv1.ContainerStateTerminated{
   120  									Reason: "Completed",
   121  								},
   122  							},
   123  						},
   124  					},
   125  				},
   126  			},
   127  			want: ketchv1.PodSucceeded,
   128  		},
   129  		{
   130  			name: "pod succeeded",
   131  			pod: apiv1.Pod{
   132  				Status: apiv1.PodStatus{
   133  					Phase: apiv1.PodSucceeded,
   134  				},
   135  			},
   136  			want: ketchv1.PodSucceeded,
   137  		},
   138  		{
   139  			name: "pod failed",
   140  			pod: apiv1.Pod{
   141  				Status: apiv1.PodStatus{
   142  					Phase: apiv1.PodFailed,
   143  				},
   144  			},
   145  			want: ketchv1.PodError,
   146  		},
   147  		{
   148  			name: "pod unknown",
   149  			pod: apiv1.Pod{
   150  				Status: apiv1.PodStatus{
   151  					Phase: apiv1.PodUnknown,
   152  				},
   153  			},
   154  			want: ketchv1.PodError,
   155  		},
   156  	}
   157  
   158  	for _, tt := range tests {
   159  		t.Run(tt.name, func(t *testing.T) {
   160  			state := podState(tt.pod)
   161  			require.Equal(t, tt.want, state)
   162  		})
   163  	}
   164  }