@@ -41,6 +41,39 @@ afterEach(() => {
4141} ) ;
4242
4343describe ( "imagePreviewPlugin" , ( ) => {
44+ it ( "waits for Enter before previewing a newly typed image" , ( ) => {
45+ const view = createView ( "" ) ;
46+ const markdown = "" ;
47+
48+ view . dispatch ( {
49+ changes : { from : 0 , insert : markdown } ,
50+ selection : { anchor : markdown . length } ,
51+ userEvent : "input" ,
52+ } ) ;
53+
54+ expect (
55+ view . dom . querySelector < HTMLInputElement > ( ".markra-image-node-source" )
56+ ?. value ,
57+ ) . toBe ( markdown ) ;
58+
59+ view . dispatch ( {
60+ changes : { from : markdown . length , insert : "\n" } ,
61+ selection : { anchor : markdown . length + 1 } ,
62+ userEvent : "input" ,
63+ } ) ;
64+
65+ expect ( view . dom . querySelector ( ".markra-image-node-source" ) ) . toBeNull ( ) ;
66+ expect ( view . dom . querySelector ( ".cm-markra-image" ) ) . not . toBeNull ( ) ;
67+ } ) ;
68+
69+ it ( "renders an existing image when the initial caret is at its end" , ( ) => {
70+ const doc = "" ;
71+ const view = createView ( doc ) ;
72+
73+ expect ( view . dom . querySelector ( ".markra-image-node-source" ) ) . toBeNull ( ) ;
74+ expect ( view . dom . querySelector ( ".cm-markra-image" ) ) . not . toBeNull ( ) ;
75+ } ) ;
76+
4477 it ( "renders a safe Markdown image without changing its source" , ( ) => {
4578 const doc =
4679 'Before  after\n\nEdit' ;
@@ -103,6 +136,7 @@ describe("imagePreviewPlugin", () => {
103136 expect ( source ) . not . toBeNull ( ) ;
104137 if ( ! source ) return ;
105138
139+ source . focus ( ) ;
106140 source . value = "" ;
107141 source . dispatchEvent ( new Event ( "input" , { bubbles : true } ) ) ;
108142 expect ( view . state . doc . toString ( ) ) . toBe (
@@ -145,6 +179,38 @@ describe("imagePreviewPlugin", () => {
145179 expect ( view . dom . querySelector ( ".markra-image-node-source" ) ) . toBeNull ( ) ;
146180 } ) ;
147181
182+ it ( "moves below a selected image when Enter comes from the editor" , ( ) => {
183+ const imageMarkdown = "" ;
184+ const doc = `${ imageMarkdown } \nFollowing` ;
185+ const view = createView ( doc ) ;
186+ view . dom . querySelector < HTMLImageElement > ( ".cm-markra-image" ) ?. dispatchEvent (
187+ new MouseEvent ( "click" , { bubbles : true , cancelable : true } ) ,
188+ ) ;
189+ const event = new KeyboardEvent ( "keydown" , {
190+ bubbles : true ,
191+ cancelable : true ,
192+ key : "Enter" ,
193+ } ) ;
194+
195+ expect ( view . state . selection . main . head ) . toBe ( 1 ) ;
196+ view . contentDOM . dispatchEvent ( event ) ;
197+
198+ expect ( event . defaultPrevented ) . toBe ( true ) ;
199+ expect ( view . state . doc . toString ( ) ) . toBe ( doc ) ;
200+ expect ( view . state . selection . main . head ) . toBe ( imageMarkdown . length + 1 ) ;
201+ expect ( view . dom . querySelector ( ".markra-image-node-source" ) ) . toBeNull ( ) ;
202+
203+ view . dispatch ( {
204+ changes : { from : imageMarkdown . length + 1 , insert : "Plain " } ,
205+ selection : { anchor : imageMarkdown . length + 7 } ,
206+ userEvent : "input" ,
207+ } ) ;
208+ expect ( view . state . doc . toString ( ) ) . toBe (
209+ `${ imageMarkdown } \nPlain Following` ,
210+ ) ;
211+ expect ( view . dom . querySelector ( ".cm-markra-link" ) ) . toBeNull ( ) ;
212+ } ) ;
213+
148214 it ( "rejects executable and local protocols by default" , ( ) => {
149215 const executable = createView (
150216 "\n\nEdit" ,
0 commit comments