11import { MockInstance } from "vitest" ;
22import { VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY } from "../constants" ;
3- import { handleFieldKeyDown } from "../handleFieldMouseDown" ;
3+ import { handleFieldInput , handleFieldKeyDown } from "../handleFieldMouseDown" ;
44import * as insertSpaceAtCursor from "../insertSpaceAtCursor" ;
5-
5+ import * as generateOverlay from "../../generators/generateOverlay" ;
6+ import { VisualBuilderPostMessageEvents } from "../types/postMessage.types" ;
7+ import { FieldDataType } from "../types/index.types" ;
8+ import userEvent from "@testing-library/user-event" ;
9+ import { waitFor , screen } from "@testing-library/preact" ;
10+
11+ vi . mock ( "lodash-es" , async ( ) => ( {
12+ ...( await import ( "lodash-es" ) ) ,
13+ throttle : vi . fn ( ( fn ) => fn ) ,
14+ } ) )
615describe ( "handle numeric field key down" , ( ) => {
716 let h1 : HTMLHeadingElement ;
817 let spiedPreventDefault : MockInstance < ( e : [ ] ) => void > | undefined ;
@@ -106,6 +115,16 @@ describe("handle numeric field key down", () => {
106115 h1 . dispatchEvent ( keyDownEvent ) ;
107116 expect ( spiedPreventDefault ) . toHaveBeenCalledTimes ( 1 ) ;
108117 } ) ;
118+
119+ test ( "should only accept characters like a number input" , async ( ) => {
120+ h1 . innerHTML = '' ;
121+ await userEvent . click ( h1 ) ;
122+ await userEvent . keyboard ( "ab56c78e-h10" ) ;
123+
124+ await waitFor ( ( ) => {
125+ expect ( h1 ) . toHaveTextContent ( `5678e-10` ) ;
126+ } ) ;
127+ } ) ;
109128} ) ;
110129
111130describe ( "handle keydown in button contenteditable" , ( ) => {
@@ -152,3 +171,85 @@ describe("handle keydown in button contenteditable", () => {
152171 expect ( spiedInsertSpaceAtCursor ) . toHaveBeenCalledWith ( button ) ;
153172 } ) ;
154173} ) ;
174+
175+ describe ( "handle single line field key down" , ( ) => {
176+ let h1 : HTMLHeadingElement ;
177+ let spiedPreventDefault : MockInstance < ( e : [ ] ) => void > | undefined ;
178+
179+ beforeEach ( ( ) => {
180+ h1 = document . createElement ( "h1" ) ;
181+ h1 . innerHTML = "2.2" ;
182+ h1 . setAttribute ( "contenteditable" , "true" ) ;
183+ h1 . setAttribute ( VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY , FieldDataType . SINGLELINE ) ;
184+
185+ h1 . addEventListener ( "keydown" , ( e ) => {
186+ spiedPreventDefault = vi . spyOn ( e , "preventDefault" ) ;
187+ handleFieldKeyDown ( e ) ;
188+ } ) ;
189+
190+ document . body . appendChild ( h1 ) ;
191+ } ) ;
192+
193+ afterEach ( ( ) => {
194+ document . body . innerHTML = "" ;
195+ vi . clearAllMocks ( ) ;
196+ } ) ;
197+
198+ afterAll ( ( ) => {
199+ vi . restoreAllMocks ( ) ;
200+ } ) ;
201+
202+ test ( "should prevent default on enter key" , ( ) => {
203+ const keyDownEvent = new KeyboardEvent ( "keydown" , {
204+ bubbles : true ,
205+ key : "Enter" ,
206+ code : "Enter" ,
207+ } ) ;
208+ h1 . dispatchEvent ( keyDownEvent ) ;
209+
210+ expect ( spiedPreventDefault ) . toHaveBeenCalledTimes ( 1 ) ;
211+ } ) ;
212+ } )
213+
214+ describe ( "`handleFieldInput`" , ( ) => {
215+ let h1 : HTMLHeadingElement ;
216+ let visualBuilderContainer : HTMLElement ;
217+ beforeEach ( ( ) => {
218+ h1 = document . createElement ( "h1" ) ;
219+ h1 . innerHTML = "2.2" ;
220+ h1 . setAttribute ( "contenteditable" , "true" ) ;
221+ h1 . setAttribute ( VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY , "number" ) ;
222+
223+ h1 . addEventListener ( "input" , handleFieldInput ) ;
224+
225+ visualBuilderContainer = document . createElement ( "div" ) ;
226+ visualBuilderContainer . classList . add ( "visual-builder__container" ) ;
227+ document . body . appendChild ( visualBuilderContainer ) ;
228+ document . body . appendChild ( h1 ) ;
229+ } ) ;
230+
231+ afterEach ( ( ) => {
232+ document . body . innerHTML = "" ;
233+ vi . clearAllMocks ( ) ;
234+ } ) ;
235+
236+ afterAll ( ( ) => {
237+ vi . restoreAllMocks ( ) ;
238+ } ) ;
239+
240+ test ( "should call `sendFieldEvent` on input event" , ( ) => {
241+ const spiedSendFieldEvent = vi . spyOn ( generateOverlay , "sendFieldEvent" )
242+ const consoleError = vi . spyOn ( console , "error" ) ;
243+ spiedSendFieldEvent . mockImplementation ( ( ) => {
244+ throw new Error ( "sendFieldEvent not implemented" )
245+ } ) ;
246+ const inputEvent = new InputEvent ( "input" , {
247+ bubbles : true ,
248+ } ) ;
249+ h1 . dispatchEvent ( inputEvent ) ;
250+
251+ expect ( spiedSendFieldEvent ) . toHaveBeenCalledWith ( { visualBuilderContainer, eventType : VisualBuilderPostMessageEvents . SYNC_FIELD } ) ;
252+ expect ( consoleError ) . toHaveBeenCalled ( ) ;
253+ } ) ;
254+
255+ } )
0 commit comments