github.com/pluralsh/plural-cli@v0.9.5/cmd/plural/vpn_test.go (about) 1 package plural_test 2 3 import ( 4 "os" 5 "testing" 6 7 "github.com/pluralsh/plural-cli/cmd/plural" 8 "github.com/pluralsh/plural-cli/pkg/api" 9 "github.com/pluralsh/plural-cli/pkg/test/mocks" 10 vpnv1alpha1 "github.com/pluralsh/plural-operator/apis/vpn/v1alpha1" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/mock" 13 corev1 "k8s.io/api/core/v1" 14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 15 ) 16 17 func TestServerList(t *testing.T) { 18 tests := []struct { 19 name string 20 args []string 21 servers *vpnv1alpha1.WireguardServerList 22 expectedResponse string 23 installation *api.Installation 24 }{ 25 { 26 name: `test "vpn list servers"`, 27 args: []string{plural.ApplicationName, "vpn", "list", "servers"}, 28 servers: &vpnv1alpha1.WireguardServerList{ 29 Items: []vpnv1alpha1.WireguardServer{ 30 { 31 ObjectMeta: metav1.ObjectMeta{ 32 Name: "wireguard", 33 Namespace: "wireguard", 34 }, 35 Spec: vpnv1alpha1.WireguardServerSpec{ 36 WireguardImage: "dkr.plural.sh/bootstrap/wireguard-server:0.1.2", 37 }, 38 Status: vpnv1alpha1.WireguardServerStatus{ 39 Port: "51820", 40 Hostname: "k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com", 41 Ready: true, 42 }, 43 }, 44 }, 45 }, 46 installation: &api.Installation{ 47 Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}}, 48 }, 49 expectedResponse: `+-----------+-------------------------------------------------------------------------------+-------+-------+ 50 | NAME | HOSTNAME | PORT | READY | 51 +-----------+-------------------------------------------------------------------------------+-------+-------+ 52 | wireguard | k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com | 51820 | true | 53 +-----------+-------------------------------------------------------------------------------+-------+-------+ 54 `, 55 }, 56 } 57 for _, test := range tests { 58 t.Run(test.name, func(t *testing.T) { 59 client := mocks.NewClient(t) 60 kube := mocks.NewKube(t) 61 client.On("GetInstallation", "wireguard").Return(test.installation, nil) 62 kube.On("WireguardServerList", "wireguard").Return(test.servers, nil) 63 app := plural.CreateNewApp(&plural.Plural{Client: client, Kube: kube}) 64 app.HelpName = plural.ApplicationName 65 os.Args = test.args 66 res, err := captureStdout(app, os.Args) 67 assert.NoError(t, err) 68 assert.Equal(t, test.expectedResponse, res) 69 70 }) 71 } 72 } 73 74 func TestClientList(t *testing.T) { 75 tests := []struct { 76 name string 77 args []string 78 peers *vpnv1alpha1.WireguardPeerList 79 expectedResponse string 80 installation *api.Installation 81 }{ 82 { 83 name: `test "vpn list clients" without server flag`, 84 args: []string{plural.ApplicationName, "vpn", "list", "clients"}, 85 peers: &vpnv1alpha1.WireguardPeerList{ 86 Items: []vpnv1alpha1.WireguardPeer{ 87 { 88 ObjectMeta: metav1.ObjectMeta{ 89 Name: "test-client-1", 90 Namespace: "wireguard", 91 }, 92 Spec: vpnv1alpha1.WireguardPeerSpec{ 93 WireguardRef: "wireguard", 94 Address: "10.8.0.2", 95 PublicKey: "test-public-key", 96 }, 97 Status: vpnv1alpha1.WireguardPeerStatus{ 98 ConfigRef: corev1.SecretKeySelector{ 99 LocalObjectReference: corev1.LocalObjectReference{ 100 Name: "test-client-1-config", 101 }, 102 Key: "wg0.conf", 103 }, 104 Ready: true, 105 }, 106 }, 107 { 108 ObjectMeta: metav1.ObjectMeta{ 109 Name: "test-client-2", 110 Namespace: "wireguard", 111 }, 112 Spec: vpnv1alpha1.WireguardPeerSpec{ 113 WireguardRef: "wireguard2", 114 Address: "10.8.0.3", 115 PublicKey: "test-public-key", 116 }, 117 Status: vpnv1alpha1.WireguardPeerStatus{ 118 ConfigRef: corev1.SecretKeySelector{ 119 LocalObjectReference: corev1.LocalObjectReference{ 120 Name: "test-client-2-config", 121 }, 122 Key: "wg0.conf", 123 }, 124 Ready: false, 125 }, 126 }, 127 }, 128 }, 129 installation: &api.Installation{ 130 Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}}, 131 }, 132 expectedResponse: `+---------------+----------+----------------------+-----------------+-------+ 133 | NAME | ADDRESS | CONFIG SECRET | PUBLIC KEY | READY | 134 +---------------+----------+----------------------+-----------------+-------+ 135 | test-client-1 | 10.8.0.2 | test-client-1-config | test-public-key | true | 136 +---------------+----------+----------------------+-----------------+-------+ 137 `, 138 }, 139 { 140 name: `test "vpn list clients" with server flag`, 141 args: []string{plural.ApplicationName, "vpn", "list", "clients", "--server", "wireguard2"}, 142 peers: &vpnv1alpha1.WireguardPeerList{ 143 Items: []vpnv1alpha1.WireguardPeer{ 144 { 145 ObjectMeta: metav1.ObjectMeta{ 146 Name: "test-client-1", 147 Namespace: "wireguard", 148 }, 149 Spec: vpnv1alpha1.WireguardPeerSpec{ 150 WireguardRef: "wireguard", 151 Address: "10.8.0.2", 152 PublicKey: "test-public-key", 153 }, 154 Status: vpnv1alpha1.WireguardPeerStatus{ 155 ConfigRef: corev1.SecretKeySelector{ 156 LocalObjectReference: corev1.LocalObjectReference{ 157 Name: "test-client-1-config", 158 }, 159 Key: "wg0.conf", 160 }, 161 Ready: true, 162 }, 163 }, 164 { 165 ObjectMeta: metav1.ObjectMeta{ 166 Name: "test-client-2", 167 Namespace: "wireguard", 168 }, 169 Spec: vpnv1alpha1.WireguardPeerSpec{ 170 WireguardRef: "wireguard2", 171 Address: "10.8.0.3", 172 PublicKey: "test-public-key", 173 }, 174 Status: vpnv1alpha1.WireguardPeerStatus{ 175 ConfigRef: corev1.SecretKeySelector{ 176 LocalObjectReference: corev1.LocalObjectReference{ 177 Name: "test-client-2-config", 178 }, 179 Key: "wg0.conf", 180 }, 181 Ready: false, 182 }, 183 }, 184 }, 185 }, 186 installation: &api.Installation{ 187 Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}}, 188 }, 189 expectedResponse: `+---------------+----------+----------------------+-----------------+-------+ 190 | NAME | ADDRESS | CONFIG SECRET | PUBLIC KEY | READY | 191 +---------------+----------+----------------------+-----------------+-------+ 192 | test-client-2 | 10.8.0.3 | test-client-2-config | test-public-key | false | 193 +---------------+----------+----------------------+-----------------+-------+ 194 `, 195 }, 196 } 197 for _, test := range tests { 198 t.Run(test.name, func(t *testing.T) { 199 client := mocks.NewClient(t) 200 kube := mocks.NewKube(t) 201 client.On("GetInstallation", "wireguard").Return(test.installation, nil) 202 kube.On("WireguardPeerList", "wireguard").Return(test.peers, nil) 203 app := plural.CreateNewApp(&plural.Plural{Client: client, Kube: kube}) 204 app.HelpName = plural.ApplicationName 205 os.Args = test.args 206 res, err := captureStdout(app, os.Args) 207 assert.NoError(t, err) 208 assert.Equal(t, test.expectedResponse, res) 209 210 }) 211 } 212 } 213 214 func TestClientCreate(t *testing.T) { 215 tests := []struct { 216 name string 217 args []string 218 peer *vpnv1alpha1.WireguardPeer 219 expectedResponse string 220 installation *api.Installation 221 server *vpnv1alpha1.WireguardServer 222 expectedError string 223 }{ 224 { 225 name: `test "vpn create client" without specifying server`, 226 args: []string{plural.ApplicationName, "vpn", "create", "client", "test-client"}, 227 peer: &vpnv1alpha1.WireguardPeer{ 228 229 ObjectMeta: metav1.ObjectMeta{ 230 Name: "test-client", 231 Namespace: "wireguard", 232 }, 233 Spec: vpnv1alpha1.WireguardPeerSpec{ 234 WireguardRef: "wireguard", 235 Address: "10.8.0.2", 236 PublicKey: "test-public-key", 237 }, 238 Status: vpnv1alpha1.WireguardPeerStatus{ 239 ConfigRef: corev1.SecretKeySelector{ 240 LocalObjectReference: corev1.LocalObjectReference{ 241 Name: "test-client-config", 242 }, 243 Key: "wg0.conf", 244 }, 245 Ready: true, 246 }, 247 }, 248 installation: &api.Installation{ 249 Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}}, 250 }, 251 server: &vpnv1alpha1.WireguardServer{ 252 ObjectMeta: metav1.ObjectMeta{ 253 Name: "wireguard", 254 Namespace: "wireguard", 255 }, 256 Spec: vpnv1alpha1.WireguardServerSpec{ 257 WireguardImage: "dkr.plural.sh/bootstrap/wireguard-server:0.1.2", 258 }, 259 Status: vpnv1alpha1.WireguardServerStatus{ 260 Port: "51820", 261 Hostname: "k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com", 262 Ready: true, 263 }, 264 }, 265 expectedResponse: `+-------------+----------+-----------+--------------------+-----------------+-------+ 266 | NAME | ADDRESS | SERVER | CONFIG SECRET | PUBLIC KEY | READY | 267 +-------------+----------+-----------+--------------------+-----------------+-------+ 268 | test-client | 10.8.0.2 | wireguard | test-client-config | test-public-key | true | 269 +-------------+----------+-----------+--------------------+-----------------+-------+ 270 `, 271 }, 272 { 273 name: `test "vpn create client" with specifying server flag`, 274 args: []string{plural.ApplicationName, "vpn", "create", "client", "test-client", "--server", "wireguard2"}, 275 peer: &vpnv1alpha1.WireguardPeer{ 276 277 ObjectMeta: metav1.ObjectMeta{ 278 Name: "test-client", 279 Namespace: "wireguard", 280 }, 281 Spec: vpnv1alpha1.WireguardPeerSpec{ 282 WireguardRef: "wireguard2", 283 Address: "10.8.0.2", 284 PublicKey: "test-public-key", 285 }, 286 Status: vpnv1alpha1.WireguardPeerStatus{ 287 ConfigRef: corev1.SecretKeySelector{ 288 LocalObjectReference: corev1.LocalObjectReference{ 289 Name: "test-client-config", 290 }, 291 Key: "wg0.conf", 292 }, 293 Ready: true, 294 }, 295 }, 296 installation: &api.Installation{ 297 Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}}, 298 }, 299 server: &vpnv1alpha1.WireguardServer{ 300 ObjectMeta: metav1.ObjectMeta{ 301 Name: "wireguard2", 302 Namespace: "wireguard", 303 }, 304 Spec: vpnv1alpha1.WireguardServerSpec{ 305 WireguardImage: "dkr.plural.sh/bootstrap/wireguard-server:0.1.2", 306 }, 307 Status: vpnv1alpha1.WireguardServerStatus{ 308 Port: "51820", 309 Hostname: "k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com", 310 Ready: true, 311 }, 312 }, 313 expectedResponse: `+-------------+----------+------------+--------------------+-----------------+-------+ 314 | NAME | ADDRESS | SERVER | CONFIG SECRET | PUBLIC KEY | READY | 315 +-------------+----------+------------+--------------------+-----------------+-------+ 316 | test-client | 10.8.0.2 | wireguard2 | test-client-config | test-public-key | true | 317 +-------------+----------+------------+--------------------+-----------------+-------+ 318 `, 319 }, 320 } 321 for _, test := range tests { 322 t.Run(test.name, func(t *testing.T) { 323 client := mocks.NewClient(t) 324 kube := mocks.NewKube(t) 325 client.On("GetInstallation", "wireguard").Return(test.installation, nil) 326 if test.expectedError == "" { 327 kube.On("WireguardServer", "wireguard", mock.AnythingOfType("string")).Return(test.server, nil) 328 kube.On("WireguardPeerCreate", "wireguard", mock.AnythingOfType("*v1alpha1.WireguardPeer")).Return(test.peer, nil) 329 } 330 app := plural.CreateNewApp(&plural.Plural{Client: client, Kube: kube}) 331 app.HelpName = plural.ApplicationName 332 os.Args = test.args 333 res, err := captureStdout(app, os.Args) 334 if test.expectedError != "" { 335 assert.Equal(t, err.Error(), test.expectedError) 336 } else { 337 assert.NoError(t, err) 338 assert.Equal(t, test.expectedResponse, res) 339 } 340 }) 341 } 342 }