diff --git a/webapp/src/components/kanban/__snapshots__/kanbanCard.test.tsx.snap b/webapp/src/components/kanban/__snapshots__/kanbanCard.test.tsx.snap
new file mode 100644
index 000000000..b6a7cfedc
--- /dev/null
+++ b/webapp/src/components/kanban/__snapshots__/kanbanCard.test.tsx.snap
@@ -0,0 +1,509 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`src/components/kanban/kanbanCard return kanbanCard and click on copy link menu 1`] = `
+
+`;
+
+exports[`src/components/kanban/kanbanCard return kanbanCard and click on delete menu 1`] = `
+
+`;
+
+exports[`src/components/kanban/kanbanCard return kanbanCard and click on duplicate menu 1`] = `
+
+`;
+
+exports[`src/components/kanban/kanbanCard should match snapshot 1`] = `
+
+`;
+
+exports[`src/components/kanban/kanbanCard should match snapshot with readonly 1`] = `
+
+`;
diff --git a/webapp/src/components/kanban/kanbanCard.test.tsx b/webapp/src/components/kanban/kanbanCard.test.tsx
new file mode 100644
index 000000000..340ba7171
--- /dev/null
+++ b/webapp/src/components/kanban/kanbanCard.test.tsx
@@ -0,0 +1,166 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See LICENSE.txt for license information.
+import React from 'react'
+import {render, screen, within} from '@testing-library/react'
+import '@testing-library/jest-dom'
+
+import {Provider as ReduxProvider} from 'react-redux'
+
+import userEvent from '@testing-library/user-event'
+
+import {mocked} from 'ts-jest/utils'
+
+import Mutator from '../../mutator'
+import {Utils} from '../../utils'
+
+import {TestBlockFactory} from '../../test/testBlockFactory'
+import {IPropertyTemplate} from '../../blocks/board'
+import {mockStateStore, wrapDNDIntl} from '../../testUtils'
+
+import KanbanCard from './kanbanCard'
+
+jest.mock('../../mutator')
+jest.mock('../../utils')
+jest.mock('../../telemetry/telemetryClient')
+const mockedUtils = mocked(Utils, true)
+const mockedMutator = mocked(Mutator, true)
+
+describe('src/components/kanban/kanbanCard', () => {
+ const board = TestBlockFactory.createBoard()
+ const card = TestBlockFactory.createCard(board)
+ const propertyTemplate: IPropertyTemplate = {
+ id: 'id',
+ name: 'name',
+ type: 'text',
+ options: [
+ {
+ color: 'propColorOrange',
+ id: 'property_value_id_1',
+ value: 'Q1',
+ },
+ {
+ color: 'propColorBlue',
+ id: 'property_value_id_2',
+ value: 'Q2',
+ },
+ ],
+ }
+ const state = {
+ cards: {
+ cards: [card],
+ },
+ contents: {},
+ comments: {
+ comments: {},
+ },
+ }
+ const store = mockStateStore([], state)
+ beforeEach(jest.clearAllMocks)
+ test('should match snapshot', () => {
+ const {container} = render(wrapDNDIntl(
+
+
+ ,
+ ))
+ expect(container).toMatchSnapshot()
+ })
+ test('should match snapshot with readonly', () => {
+ const {container} = render(wrapDNDIntl(
+
+
+ ,
+ ))
+ expect(container).toMatchSnapshot()
+ })
+ test('return kanbanCard and click on delete menu ', () => {
+ const {container} = render(wrapDNDIntl(
+
+
+ ,
+ ))
+ const elementMenuWrapper = screen.getByRole('button', {name: 'menuwrapper'})
+ expect(elementMenuWrapper).not.toBeNull()
+ userEvent.click(elementMenuWrapper)
+ expect(container).toMatchSnapshot()
+ const elementButtonDelete = within(elementMenuWrapper).getByRole('button', {name: 'Delete'})
+ expect(elementButtonDelete).not.toBeNull()
+ userEvent.click(elementButtonDelete)
+ expect(mockedMutator.deleteBlock).toBeCalledWith(card, 'delete card')
+ })
+ test('return kanbanCard and click on duplicate menu ', () => {
+ const {container} = render(wrapDNDIntl(
+
+
+ ,
+ ))
+ const elementMenuWrapper = screen.getByRole('button', {name: 'menuwrapper'})
+ expect(elementMenuWrapper).not.toBeNull()
+ userEvent.click(elementMenuWrapper)
+ expect(container).toMatchSnapshot()
+ const elementButtonDuplicate = within(elementMenuWrapper).getByRole('button', {name: 'Duplicate'})
+ expect(elementButtonDuplicate).not.toBeNull()
+ userEvent.click(elementButtonDuplicate)
+ expect(mockedMutator.duplicateCard).toBeCalledTimes(1)
+ })
+
+ test('return kanbanCard and click on copy link menu ', () => {
+ const {container} = render(wrapDNDIntl(
+
+
+ ,
+ ))
+ const elementMenuWrapper = screen.getByRole('button', {name: 'menuwrapper'})
+ expect(elementMenuWrapper).not.toBeNull()
+ userEvent.click(elementMenuWrapper)
+ expect(container).toMatchSnapshot()
+ const elementButtonCopyLink = within(elementMenuWrapper).getByRole('button', {name: 'Copy link'})
+ expect(elementButtonCopyLink).not.toBeNull()
+ userEvent.click(elementButtonCopyLink)
+ expect(mockedUtils.copyTextToClipboard).toBeCalledTimes(1)
+ })
+})