diff --git a/pkg/secret/secret_test.go b/pkg/secret/secret_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..574a54f6d23e4afe81d2b4872b08cbf4dc2b27d8
--- /dev/null
+++ b/pkg/secret/secret_test.go
@@ -0,0 +1,141 @@
+package secret_test
+
+import (
+	"errors"
+	"testing"
+
+	"github.com/ankitrgadiya/operatorlib/pkg/interfaces"
+	"github.com/ankitrgadiya/operatorlib/pkg/interfaces/mocks"
+	"github.com/ankitrgadiya/operatorlib/pkg/secret"
+
+	"github.com/golang/mock/gomock"
+	"github.com/stretchr/testify/assert"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/client-go/kubernetes/scheme"
+	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+)
+
+func mockSetup(ctrl *gomock.Controller) (i *mocks.MockObject, r *mocks.MockReconcile) {
+	i = mocks.NewMockObject(ctrl)
+	i.EXPECT().GetName().Return("test").AnyTimes()
+	i.EXPECT().GetUID().Return(types.UID("199bd7a8-b72a-4411-b55e-91096769e58f")).AnyTimes()
+
+	secret := &corev1.Secret{
+		ObjectMeta: metav1.ObjectMeta{Name: "test-existing-secret", Namespace: "test"},
+		Data: map[string][]byte{
+			"key1": []byte("value1"),
+			"key2": []byte("value2"),
+		},
+	}
+	r = mocks.NewMockReconcile(ctrl)
+
+	c := fake.NewFakeClient([]runtime.Object{secret}...)
+	s := scheme.Scheme
+	s.AddKnownTypes(schema.GroupVersion{Group: "test", Version: "v1"}, i)
+
+	r.EXPECT().GetClient().Return(c).AnyTimes()
+	r.EXPECT().GetScheme().Return(s).AnyTimes()
+
+	return i, r
+}
+
+func TestGenerateSecret(t *testing.T) {
+	t.Run("generate empty secret", func(t *testing.T) {
+		expected := &corev1.Secret{TypeMeta: metav1.TypeMeta{
+			Kind:       "Secret",
+			APIVersion: "v1",
+		}}
+
+		result, err := secret.GenerateSecret(secret.Conf{})
+		assert.NoError(t, err)
+
+		assert.Equal(t, expected, result)
+	})
+	t.Run("failed to generate objectmeta", func(t *testing.T) {
+		result, err := secret.GenerateSecret(secret.Conf{
+			GenLabelsFunc: func(interfaces.Object) (map[string]string, error) { return nil, errors.New("test error") },
+		})
+		assert.Error(t, err)
+		assert.Nil(t, result)
+	})
+	t.Run("failed to generate data", func(t *testing.T) {
+		result, err := secret.GenerateSecret(secret.Conf{
+			GenDataFunc: func(interfaces.Object) (map[string][]byte, error) { return nil, errors.New("test error") },
+		})
+		assert.Error(t, err)
+		assert.Nil(t, result)
+	})
+	t.Run("failed to generate string data", func(t *testing.T) {
+		result, err := secret.GenerateSecret(secret.Conf{
+			GenStringDataFunc: func(interfaces.Object) (map[string]string, error) { return nil, errors.New("test error") },
+		})
+		assert.Error(t, err)
+		assert.Nil(t, result)
+	})
+	t.Run("generate secret with only string data", func(t *testing.T) {
+		expected := &corev1.Secret{
+			TypeMeta: metav1.TypeMeta{Kind: "Secret", APIVersion: "v1"},
+			Data:     map[string][]byte{"key": []byte("value")},
+		}
+
+		result, err := secret.GenerateSecret(secret.Conf{
+			GenStringDataFunc: func(interfaces.Object) (map[string]string, error) {
+				return map[string]string{"key": "value"}, nil
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, expected, result)
+	})
+	t.Run("generate secret with only data", func(t *testing.T) {
+		expected := &corev1.Secret{
+			TypeMeta: metav1.TypeMeta{Kind: "Secret", APIVersion: "v1"},
+			Data:     map[string][]byte{"key": []byte("value")},
+		}
+
+		result, err := secret.GenerateSecret(secret.Conf{
+			GenDataFunc: func(interfaces.Object) (map[string][]byte, error) {
+				return map[string][]byte{"key": []byte("value")}, nil
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, expected, result)
+	})
+	t.Run("generate secret with data and string data", func(t *testing.T) {
+		expected := &corev1.Secret{
+			TypeMeta: metav1.TypeMeta{Kind: "Secret", APIVersion: "v1"},
+			Data:     map[string][]byte{"key1": []byte("value1"), "key2": []byte("value2")},
+		}
+
+		result, err := secret.GenerateSecret(secret.Conf{
+			GenDataFunc: func(interfaces.Object) (map[string][]byte, error) {
+				return map[string][]byte{"key1": []byte("value1")}, nil
+			},
+			GenStringDataFunc: func(interfaces.Object) (map[string]string, error) {
+				return map[string]string{"key2": "value2"}, nil
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, expected, result)
+	})
+	t.Run("generate secret with data and string data with same keys", func(t *testing.T) {
+		expected := &corev1.Secret{
+			TypeMeta: metav1.TypeMeta{Kind: "Secret", APIVersion: "v1"},
+			Data:     map[string][]byte{"key": []byte("value")},
+		}
+
+		result, err := secret.GenerateSecret(secret.Conf{
+			GenDataFunc: func(interfaces.Object) (map[string][]byte, error) {
+				return map[string][]byte{"key": []byte("value")}, nil
+			},
+			GenStringDataFunc: func(interfaces.Object) (map[string]string, error) {
+				return map[string]string{"key": "new-value"}, nil
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, expected, result)
+	})
+}