11import { mount } from "@vue/test-utils" ;
22import veTable from "@/ve-table" ;
33import { later } from "../util" ;
4+ import { cloneDeep } from "lodash" ;
45
56describe ( "veTable contextmenu" , ( ) => {
67 const TABLE_DATA = [
@@ -100,6 +101,17 @@ describe("veTable contextmenu", () => {
100101 } ,
101102 ] ;
102103
104+ afterEach ( ( ) => {
105+ return new Promise ( ( resolve ) => {
106+ const contextmenuPopper = document . querySelector (
107+ ".ve-contextmenu-popper" ,
108+ ) ;
109+ contextmenuPopper && contextmenuPopper . remove ( ) ;
110+
111+ resolve ( ) ;
112+ } ) ;
113+ } ) ;
114+
103115 it ( "render" , ( ) => {
104116 const wrapper = mount ( veTable , {
105117 propsData : {
@@ -119,50 +131,120 @@ describe("veTable contextmenu", () => {
119131 expect ( wrapper . html ( ) ) . toMatchSnapshot ( ) ;
120132 } ) ;
121133
122- const mockFn = jest . fn ( ) ;
134+ it ( "contextmenu INSERT_ROW_ABOVE" , async ( ) => {
135+ const mockFn = jest . fn ( ) ;
123136
124- const WRAPPER = mount (
125- {
126- render ( ) {
127- return (
128- < div >
129- < ve-table
130- row-key-field-name = "rowKey"
131- columns = { COLUMNS }
132- table-data = { TABLE_DATA }
133- contextmenu-body-option = { this . contextmenuBodyOption }
134- />
135- </ div >
136- ) ;
137- } ,
138- data ( ) {
139- return {
140- contextmenuBodyOption : {
141- callback : ( { type, selection } ) => {
142- console . log ( 11111111111111 ) ;
143- mockFn ( { type, selection } ) ;
137+ let tableData = cloneDeep ( TABLE_DATA ) ;
138+
139+ const WRAPPER = mount (
140+ {
141+ render ( ) {
142+ return (
143+ < div >
144+ < ve-table
145+ row-key-field-name = "rowKey"
146+ columns = { COLUMNS }
147+ table-data = { tableData }
148+ contextmenu-body-option = {
149+ this . contextmenuBodyOption
150+ }
151+ />
152+ </ div >
153+ ) ;
154+ } ,
155+ data ( ) {
156+ return {
157+ contextmenuBodyOption : {
158+ callback : ( { type, selection } ) => {
159+ mockFn ( { type, selection } ) ;
160+ } ,
161+ contextmenus : CONTEXTMENUS ,
144162 } ,
145- contextmenus : CONTEXTMENUS ,
146- } ,
147- } ;
163+ } ;
164+ } ,
148165 } ,
149- } ,
150- // need attach to documnet
151- { attachTo : document . body } ,
152- ) ;
166+ // need attach to documnet
167+ { attachTo : document . body } ,
168+ ) ;
169+
170+ const firstTrTdEl = WRAPPER . findAll ( ".ve-table-body-tr" )
171+ . at ( 2 )
172+ . findAll ( ".ve-table-body-td" )
173+ . at ( 2 ) ;
174+
175+ firstTrTdEl . trigger ( "click" ) ;
176+
177+ await later ( ) ;
178+
179+ expect ( firstTrTdEl . classes ( ) ) . toContain ( "ve-table-cell-selection" ) ;
180+
181+ const bodyEl = WRAPPER . find ( ".ve-table-body" ) ;
182+ bodyEl . trigger ( "contextmenu" ) ;
183+
184+ await later ( ) ;
185+
186+ const contextmenuPopper = document . querySelector (
187+ ".ve-contextmenu-popper" ,
188+ ) ;
153189
154- it ( "callback event" , async ( ) => {
155- /* const tdEl = document.querySelector(
156- ".ve-table-body tr[row-key='2'] td[col-key='number']",
190+ const contextmenuNodes = contextmenuPopper . querySelectorAll (
191+ ".ve-contextmenu-node" ,
157192 ) ;
158193
159- const clickEvent = new MouseEvent("click", {
194+ const event2 = new MouseEvent ( "click" , {
160195 view : window , // window
161196 bubbles : true ,
162197 cancelable : true ,
163198 } ) ;
164199
165- tdEl.dispatchEvent(clickEvent); */
200+ contextmenuNodes [ 0 ] . dispatchEvent ( event2 ) ;
201+
202+ await later ( ) ;
203+
204+ expect ( tableData . length ) . toBe ( 6 ) ;
205+
206+ expect ( mockFn ) . toHaveBeenCalled ( ) ;
207+ expect ( mockFn ) . toHaveBeenCalledWith ( {
208+ selection : { colKey : "date" , rowKey : 2 } ,
209+ type : "INSERT_ROW_ABOVE" ,
210+ } ) ;
211+ } ) ;
212+
213+ it ( "contextmenu INSERT_ROW_BELOW" , async ( ) => {
214+ const mockFn = jest . fn ( ) ;
215+
216+ let tableData = cloneDeep ( TABLE_DATA ) ;
217+
218+ const WRAPPER = mount (
219+ {
220+ render ( ) {
221+ return (
222+ < div >
223+ < ve-table
224+ row-key-field-name = "rowKey"
225+ columns = { COLUMNS }
226+ table-data = { tableData }
227+ contextmenu-body-option = {
228+ this . contextmenuBodyOption
229+ }
230+ />
231+ </ div >
232+ ) ;
233+ } ,
234+ data ( ) {
235+ return {
236+ contextmenuBodyOption : {
237+ callback : ( { type, selection } ) => {
238+ mockFn ( { type, selection } ) ;
239+ } ,
240+ contextmenus : CONTEXTMENUS ,
241+ } ,
242+ } ;
243+ } ,
244+ } ,
245+ // need attach to documnet
246+ { attachTo : document . body } ,
247+ ) ;
166248
167249 const firstTrTdEl = WRAPPER . findAll ( ".ve-table-body-tr" )
168250 . at ( 2 )
@@ -175,15 +257,6 @@ describe("veTable contextmenu", () => {
175257
176258 expect ( firstTrTdEl . classes ( ) ) . toContain ( "ve-table-cell-selection" ) ;
177259
178- /* const bodyEl = document.querySelector(".ve-table-body");
179-
180- const contextmenuEvent = new MouseEvent("contextmenu", {
181- view: window, // window
182- bubbles: true,
183- cancelable: true,
184- });
185-
186- bodyEl.dispatchEvent(contextmenuEvent); */
187260 const bodyEl = WRAPPER . find ( ".ve-table-body" ) ;
188261 bodyEl . trigger ( "contextmenu" ) ;
189262
@@ -203,17 +276,16 @@ describe("veTable contextmenu", () => {
203276 cancelable : true ,
204277 } ) ;
205278
206- contextmenuNodes [ 0 ] . dispatchEvent ( event2 ) ;
207-
208- console . log ( contextmenuNodes [ 0 ] . innerHTML ) ;
279+ contextmenuNodes [ 1 ] . dispatchEvent ( event2 ) ;
209280
210281 await later ( ) ;
211282
212- expect ( TABLE_DATA . length ) . toBe ( 5 ) ;
283+ expect ( tableData . length ) . toBe ( 6 ) ;
213284
214- // expect(mockFn).toHaveBeenCalled();
215- // expect(mockFn).toHaveBeenCalledWith("menu1-type");
216-
217- //expect(mockClickFn).toBeCalledWith(0, expect.any(Object));
285+ expect ( mockFn ) . toHaveBeenCalled ( ) ;
286+ expect ( mockFn ) . toHaveBeenCalledWith ( {
287+ selection : { colKey : "date" , rowKey : 2 } ,
288+ type : "INSERT_ROW_BELOW" ,
289+ } ) ;
218290 } ) ;
219291} ) ;
0 commit comments