120 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
MIT License
 | 
						|
 | 
						|
Copyright (c) 2025 lerentis, https://git.uploadfilter24.eu/lerentis
 | 
						|
 | 
						|
 | 
						|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
 | 
						|
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
						|
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 | 
						|
 | 
						|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 | 
						|
 | 
						|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 | 
						|
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | 
						|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 | 
						|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
						|
*/
 | 
						|
 | 
						|
package controller
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	. "github.com/onsi/ginkgo/v2"
 | 
						|
	. "github.com/onsi/gomega"
 | 
						|
 | 
						|
	"k8s.io/client-go/kubernetes/scheme"
 | 
						|
	"k8s.io/client-go/rest"
 | 
						|
	"sigs.k8s.io/controller-runtime/pkg/client"
 | 
						|
	"sigs.k8s.io/controller-runtime/pkg/envtest"
 | 
						|
	logf "sigs.k8s.io/controller-runtime/pkg/log"
 | 
						|
	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 | 
						|
 | 
						|
	lerentisuploadfilter24euv1 "github.com/lerentis/bitwarden-crd-operator/api/v1"
 | 
						|
	// +kubebuilder:scaffold:imports
 | 
						|
)
 | 
						|
 | 
						|
// These tests use Ginkgo (BDD-style Go testing framework). Refer to
 | 
						|
// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
 | 
						|
 | 
						|
var (
 | 
						|
	ctx       context.Context
 | 
						|
	cancel    context.CancelFunc
 | 
						|
	testEnv   *envtest.Environment
 | 
						|
	cfg       *rest.Config
 | 
						|
	k8sClient client.Client
 | 
						|
)
 | 
						|
 | 
						|
func TestControllers(t *testing.T) {
 | 
						|
	RegisterFailHandler(Fail)
 | 
						|
 | 
						|
	RunSpecs(t, "Controller Suite")
 | 
						|
}
 | 
						|
 | 
						|
var _ = BeforeSuite(func() {
 | 
						|
	logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
 | 
						|
 | 
						|
	ctx, cancel = context.WithCancel(context.TODO())
 | 
						|
 | 
						|
	var err error
 | 
						|
	err = lerentisuploadfilter24euv1.AddToScheme(scheme.Scheme)
 | 
						|
	Expect(err).NotTo(HaveOccurred())
 | 
						|
 | 
						|
	// +kubebuilder:scaffold:scheme
 | 
						|
 | 
						|
	By("bootstrapping test environment")
 | 
						|
	testEnv = &envtest.Environment{
 | 
						|
		CRDDirectoryPaths:     []string{filepath.Join("..", "..", "config", "crd", "bases")},
 | 
						|
		ErrorIfCRDPathMissing: true,
 | 
						|
	}
 | 
						|
 | 
						|
	// Retrieve the first found binary directory to allow running tests from IDEs
 | 
						|
	if getFirstFoundEnvTestBinaryDir() != "" {
 | 
						|
		testEnv.BinaryAssetsDirectory = getFirstFoundEnvTestBinaryDir()
 | 
						|
	}
 | 
						|
 | 
						|
	// cfg is defined in this file globally.
 | 
						|
	cfg, err = testEnv.Start()
 | 
						|
	Expect(err).NotTo(HaveOccurred())
 | 
						|
	Expect(cfg).NotTo(BeNil())
 | 
						|
 | 
						|
	k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
 | 
						|
	Expect(err).NotTo(HaveOccurred())
 | 
						|
	Expect(k8sClient).NotTo(BeNil())
 | 
						|
})
 | 
						|
 | 
						|
var _ = AfterSuite(func() {
 | 
						|
	By("tearing down the test environment")
 | 
						|
	cancel()
 | 
						|
	err := testEnv.Stop()
 | 
						|
	Expect(err).NotTo(HaveOccurred())
 | 
						|
})
 | 
						|
 | 
						|
// getFirstFoundEnvTestBinaryDir locates the first binary in the specified path.
 | 
						|
// ENVTEST-based tests depend on specific binaries, usually located in paths set by
 | 
						|
// controller-runtime. When running tests directly (e.g., via an IDE) without using
 | 
						|
// Makefile targets, the 'BinaryAssetsDirectory' must be explicitly configured.
 | 
						|
//
 | 
						|
// This function streamlines the process by finding the required binaries, similar to
 | 
						|
// setting the 'KUBEBUILDER_ASSETS' environment variable. To ensure the binaries are
 | 
						|
// properly set up, run 'make setup-envtest' beforehand.
 | 
						|
func getFirstFoundEnvTestBinaryDir() string {
 | 
						|
	basePath := filepath.Join("..", "..", "bin", "k8s")
 | 
						|
	entries, err := os.ReadDir(basePath)
 | 
						|
	if err != nil {
 | 
						|
		logf.Log.Error(err, "Failed to read directory", "path", basePath)
 | 
						|
		return ""
 | 
						|
	}
 | 
						|
	for _, entry := range entries {
 | 
						|
		if entry.IsDir() {
 | 
						|
			return filepath.Join(basePath, entry.Name())
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return ""
 | 
						|
}
 |