github.com/redhat-appstudio/release-service@v0.0.0-20240507045911-a8558ef3422a/api/v1alpha1/webhooks/author/suite_test.go (about)

     1  /*
     2  Copyright 2022.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package author
    18  
    19  import (
    20  	"context"
    21  	"crypto/tls"
    22  	"fmt"
    23  	"github.com/redhat-appstudio/release-service/api/v1alpha1"
    24  	"net"
    25  	"path/filepath"
    26  	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
    27  	crwebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
    28  	"testing"
    29  	"time"
    30  
    31  	. "github.com/onsi/ginkgo/v2"
    32  	. "github.com/onsi/gomega"
    33  
    34  	admissionv1beta1 "k8s.io/api/admission/v1beta1"
    35  	//+kubebuilder:scaffold:imports
    36  	"k8s.io/apimachinery/pkg/runtime"
    37  	ctrl "sigs.k8s.io/controller-runtime"
    38  	"sigs.k8s.io/controller-runtime/pkg/client"
    39  	"sigs.k8s.io/controller-runtime/pkg/envtest"
    40  	logf "sigs.k8s.io/controller-runtime/pkg/log"
    41  	"sigs.k8s.io/controller-runtime/pkg/log/zap"
    42  	"sigs.k8s.io/controller-runtime/pkg/manager"
    43  )
    44  
    45  // These tests use Ginkgo (BDD-style Go testing framework). Refer to
    46  // http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
    47  
    48  var (
    49  	cancel    context.CancelFunc
    50  	ctx       context.Context
    51  	k8sClient client.Client
    52  	mgr       manager.Manager
    53  	testEnv   *envtest.Environment
    54  	webhook   *Webhook
    55  )
    56  
    57  func TestAuthorWebhook(t *testing.T) {
    58  	RegisterFailHandler(Fail)
    59  	RunSpecs(t, "Author Webhook Suite")
    60  }
    61  
    62  var _ = BeforeSuite(func() {
    63  	logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
    64  	ctx, cancel = context.WithCancel(context.TODO())
    65  
    66  	By("bootstrapping test environment")
    67  	testEnv = &envtest.Environment{
    68  		CRDDirectoryPaths:     []string{filepath.Join("..", "..", "..", "..", "config", "crd", "bases")},
    69  		ErrorIfCRDPathMissing: false,
    70  		WebhookInstallOptions: envtest.WebhookInstallOptions{
    71  			Paths: []string{filepath.Join("..", "..", "..", "..", "config", "webhook")},
    72  		},
    73  	}
    74  
    75  	cfg, err := testEnv.Start()
    76  	Expect(err).NotTo(HaveOccurred())
    77  	Expect(cfg).NotTo(BeNil())
    78  
    79  	scheme := runtime.NewScheme()
    80  	Expect(v1alpha1.AddToScheme(scheme)).To(Succeed())
    81  	Expect(admissionv1beta1.AddToScheme(scheme)).To(Succeed())
    82  
    83  	k8sClient, err = client.New(cfg, client.Options{Scheme: scheme})
    84  	Expect(err).NotTo(HaveOccurred())
    85  	Expect(k8sClient).NotTo(BeNil())
    86  
    87  	// start webhook server using Manager
    88  	webhookInstallOptions := &testEnv.WebhookInstallOptions
    89  	mgr, err = ctrl.NewManager(cfg, ctrl.Options{
    90  		LeaderElection: false,
    91  		Metrics: server.Options{
    92  			BindAddress: "0",
    93  		},
    94  		WebhookServer: crwebhook.NewServer(crwebhook.Options{
    95  			CertDir: webhookInstallOptions.LocalServingCertDir,
    96  			Host:    webhookInstallOptions.LocalServingHost,
    97  			Port:    webhookInstallOptions.LocalServingPort,
    98  		}),
    99  		Scheme: scheme,
   100  	})
   101  	Expect(err).NotTo(HaveOccurred())
   102  
   103  	logger := ctrl.Log.WithName("webhook")
   104  	webhook = &Webhook{}
   105  	Expect(webhook.Register(mgr, &logger)).To(Succeed())
   106  
   107  	//+kubebuilder:scaffold:webhook
   108  
   109  	go func() {
   110  		defer GinkgoRecover()
   111  		err = mgr.Start(ctx)
   112  		Expect(err).NotTo(HaveOccurred())
   113  	}()
   114  
   115  	// wait for the webhook server to get ready
   116  	dialer := &net.Dialer{Timeout: time.Second}
   117  	addrPort := fmt.Sprintf("%s:%d", webhookInstallOptions.LocalServingHost, webhookInstallOptions.LocalServingPort)
   118  	Eventually(func() error {
   119  		conn, err := tls.DialWithDialer(dialer, "tcp", addrPort, &tls.Config{InsecureSkipVerify: true})
   120  		if err != nil {
   121  			return err
   122  		}
   123  		_ = conn.Close()
   124  		return nil
   125  	}).Should(Succeed())
   126  
   127  })
   128  
   129  var _ = AfterSuite(func() {
   130  	cancel()
   131  	By("tearing down the test environment")
   132  	err := testEnv.Stop()
   133  	Expect(err).NotTo(HaveOccurred())
   134  })