diff --git a/src/components/__tests__/PromptNode.test.tsx b/src/components/__tests__/PromptNode.test.tsx
new file mode 100644
index 00000000..c82c5232
--- /dev/null
+++ b/src/components/__tests__/PromptNode.test.tsx
@@ -0,0 +1,104 @@
+import { describe, it, expect, vi, beforeEach } from "vitest";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { PromptNode } from "@/components/nodes/PromptNode";
+import { ReactFlowProvider } from "@xyflow/react";
+
+// Mock the workflow store
+const mockUpdateNodeData = vi.fn();
+const mockIncrementModalCount = vi.fn();
+const mockDecrementModalCount = vi.fn();
+
+vi.mock("@/store/workflowStore", () => ({
+ useWorkflowStore: vi.fn((selector) => {
+ const state = {
+ updateNodeData: mockUpdateNodeData,
+ incrementModalCount: mockIncrementModalCount,
+ decrementModalCount: mockDecrementModalCount,
+ currentNodeId: null,
+ groups: {},
+ nodes: [],
+ };
+ return selector(state);
+ }),
+}));
+
+// Wrapper component for React Flow context
+function TestWrapper({ children }: { children: React.ReactNode }) {
+ return {children};
+}
+
+describe("PromptNode", () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ const defaultProps = {
+ id: "test-prompt-1",
+ type: "prompt" as const,
+ data: {
+ prompt: "",
+ },
+ selected: false,
+ isConnectable: true,
+ positionAbsoluteX: 0,
+ positionAbsoluteY: 0,
+ zIndex: 0,
+ dragging: false,
+ deletable: true,
+ selectable: true,
+ parentId: undefined,
+ dragHandle: undefined,
+ };
+
+ it("should render the textarea with placeholder", () => {
+ render(
+
+
+
+ );
+
+ const textarea = screen.getByPlaceholderText("Describe what to generate...");
+ expect(textarea).toBeInTheDocument();
+ });
+
+ it("should render with initial prompt value", () => {
+ const propsWithPrompt = {
+ ...defaultProps,
+ data: { prompt: "Initial prompt text" },
+ };
+
+ render(
+
+
+
+ );
+
+ const textarea = screen.getByDisplayValue("Initial prompt text");
+ expect(textarea).toBeInTheDocument();
+ });
+
+ it("should call updateNodeData when typing in textarea", () => {
+ render(
+
+
+
+ );
+
+ const textarea = screen.getByPlaceholderText("Describe what to generate...");
+ fireEvent.change(textarea, { target: { value: "New prompt text" } });
+
+ expect(mockUpdateNodeData).toHaveBeenCalledWith("test-prompt-1", {
+ prompt: "New prompt text",
+ });
+ });
+
+ it("should render the Prompt title", () => {
+ render(
+
+
+
+ );
+
+ expect(screen.getByText("Prompt")).toBeInTheDocument();
+ });
+});