@@ -24,7 +24,7 @@ describe("CodeEditor", () => {
24
24
} ) ;
25
25
} ) ;
26
26
27
- it ( "calls onChange when content is modified" , async ( ) => {
27
+ it ( "calls onChange on blur after content is modified" , async ( ) => {
28
28
const handleChange = vi . fn ( ) ;
29
29
const user = userEvent . setup ( ) ;
30
30
@@ -41,16 +41,22 @@ describe("CodeEditor", () => {
41
41
await user . click ( editor ) ;
42
42
await user . type ( editor , "test" ) ;
43
43
44
+ // onChange shouldn't be called yet
45
+ expect ( handleChange ) . not . toHaveBeenCalled ( ) ;
46
+
47
+ // Blur the editor
48
+ await user . tab ( ) ;
49
+
44
50
await waitFor ( ( ) => {
45
- expect ( handleChange ) . toHaveBeenCalled ( ) ;
51
+ expect ( handleChange ) . toHaveBeenCalledWith ( "test" ) ;
46
52
} ) ;
47
53
} ) ;
48
54
49
55
it ( "respects readOnly prop" , async ( ) => {
50
56
const handleChange = vi . fn ( ) ;
51
57
52
58
render (
53
- < CodeEditor value = "readonly content" readOnly onChange = { handleChange } />
59
+ < CodeEditor value = "readonly content" readOnly onChange = { handleChange } /> ,
54
60
) ;
55
61
56
62
await waitFor ( ( ) => {
@@ -73,7 +79,7 @@ describe("CodeEditor", () => {
73
79
74
80
it ( "applies custom className" , ( ) => {
75
81
const { container } = render (
76
- < CodeEditor className = "custom-editor-class" />
82
+ < CodeEditor className = "custom-editor-class" /> ,
77
83
) ;
78
84
79
85
expect ( container . firstChild ) . toHaveClass ( "custom-editor-class" ) ;
@@ -140,6 +146,26 @@ describe("CodeEditor", () => {
140
146
} ) ;
141
147
} ) ;
142
148
149
+ it ( "exposes an imperative API to get the current value" , async ( ) => {
150
+ const ref = { current : null } as React . MutableRefObject < any > ;
151
+ const user = userEvent . setup ( ) ;
152
+
153
+ render ( < CodeEditor ref = { ref } /> ) ;
154
+
155
+ await waitFor ( ( ) => {
156
+ const editor = document . querySelector ( ".cm-content" ) ;
157
+ expect ( editor ) . toBeInTheDocument ( ) ;
158
+ } ) ;
159
+
160
+ const editor = document . querySelector ( ".cm-content" ) as HTMLElement ;
161
+ await user . click ( editor ) ;
162
+ await user . type ( editor , "value" ) ;
163
+
164
+ await user . tab ( ) ;
165
+
166
+ expect ( ref . current ?. getValue ( ) ) . toBe ( "value" ) ;
167
+ } ) ;
168
+
143
169
it ( "renders loading state during SSR" , ( ) => {
144
170
// The component should render during SSR with loading state
145
171
const { container } = render ( < CodeEditor /> ) ;
0 commit comments