diff --git a/web/app/components/app/configuration/base/group-name/index.spec.tsx b/web/app/components/app/configuration/base/group-name/index.spec.tsx
new file mode 100644
index 0000000000..ac504247f2
--- /dev/null
+++ b/web/app/components/app/configuration/base/group-name/index.spec.tsx
@@ -0,0 +1,21 @@
+import { render, screen } from '@testing-library/react'
+import GroupName from './index'
+
+describe('GroupName', () => {
+ beforeEach(() => {
+ jest.clearAllMocks()
+ })
+
+ describe('Rendering', () => {
+ it('should render name when provided', () => {
+ // Arrange
+ const title = 'Inputs'
+
+ // Act
+ render()
+
+ // Assert
+ expect(screen.getByText(title)).toBeInTheDocument()
+ })
+ })
+})
diff --git a/web/app/components/app/configuration/base/operation-btn/index.spec.tsx b/web/app/components/app/configuration/base/operation-btn/index.spec.tsx
new file mode 100644
index 0000000000..b504bdcfe7
--- /dev/null
+++ b/web/app/components/app/configuration/base/operation-btn/index.spec.tsx
@@ -0,0 +1,76 @@
+import { fireEvent, render, screen } from '@testing-library/react'
+import OperationBtn from './index'
+
+jest.mock('react-i18next', () => ({
+ useTranslation: () => ({
+ t: (key: string) => key,
+ }),
+}))
+
+jest.mock('@remixicon/react', () => ({
+ RiAddLine: (props: { className?: string }) => (
+
+ ),
+ RiEditLine: (props: { className?: string }) => (
+
+ ),
+}))
+
+describe('OperationBtn', () => {
+ beforeEach(() => {
+ jest.clearAllMocks()
+ })
+
+ // Rendering icons and translation labels
+ describe('Rendering', () => {
+ it('should render passed custom class when provided', () => {
+ // Arrange
+ const customClass = 'custom-class'
+
+ // Act
+ render()
+
+ // Assert
+ expect(screen.getByText('common.operation.add').parentElement).toHaveClass(customClass)
+ })
+ it('should render add icon when type is add', () => {
+ // Arrange
+ const onClick = jest.fn()
+
+ // Act
+ render()
+
+ // Assert
+ expect(screen.getByTestId('add-icon')).toBeInTheDocument()
+ expect(screen.getByText('common.operation.add')).toBeInTheDocument()
+ })
+
+ it('should render edit icon when provided', () => {
+ // Arrange
+ const actionName = 'Rename'
+
+ // Act
+ render()
+
+ // Assert
+ expect(screen.getByTestId('edit-icon')).toBeInTheDocument()
+ expect(screen.queryByTestId('add-icon')).toBeNull()
+ expect(screen.getByText(actionName)).toBeInTheDocument()
+ })
+ })
+
+ // Click handling
+ describe('Interactions', () => {
+ it('should execute click handler when button is clicked', () => {
+ // Arrange
+ const onClick = jest.fn()
+ render()
+
+ // Act
+ fireEvent.click(screen.getByText('common.operation.add'))
+
+ // Assert
+ expect(onClick).toHaveBeenCalledTimes(1)
+ })
+ })
+})
diff --git a/web/app/components/app/configuration/base/var-highlight/index.spec.tsx b/web/app/components/app/configuration/base/var-highlight/index.spec.tsx
new file mode 100644
index 0000000000..9e84aa09ac
--- /dev/null
+++ b/web/app/components/app/configuration/base/var-highlight/index.spec.tsx
@@ -0,0 +1,62 @@
+import { render, screen } from '@testing-library/react'
+import VarHighlight, { varHighlightHTML } from './index'
+
+describe('VarHighlight', () => {
+ beforeEach(() => {
+ jest.clearAllMocks()
+ })
+
+ // Rendering highlighted variable tags
+ describe('Rendering', () => {
+ it('should render braces around the variable name with default styles', () => {
+ // Arrange
+ const props = { name: 'userInput' }
+
+ // Act
+ const { container } = render()
+
+ // Assert
+ expect(screen.getByText('userInput')).toBeInTheDocument()
+ expect(screen.getAllByText('{{')[0]).toBeInTheDocument()
+ expect(screen.getAllByText('}}')[0]).toBeInTheDocument()
+ expect(container.firstChild).toHaveClass('item')
+ })
+
+ it('should apply custom class names when provided', () => {
+ // Arrange
+ const props = { name: 'custom', className: 'mt-2' }
+
+ // Act
+ const { container } = render()
+
+ // Assert
+ expect(container.firstChild).toHaveClass('mt-2')
+ })
+ })
+
+ // Escaping HTML via helper
+ describe('varHighlightHTML', () => {
+ it('should escape dangerous characters before returning HTML string', () => {
+ // Arrange
+ const props = { name: '' }
+
+ // Act
+ const html = varHighlightHTML(props)
+
+ // Assert
+ expect(html).toContain('<script>alert('xss')</script>')
+ expect(html).not.toContain('