@@ -13,12 +13,23 @@ describe("index tests", () => {
1313 } ) ;
1414
1515 test ( "Table render" , async ( ) => {
16- render ( < List data = { generateDummyContent ( 310 , 1 ) } /> ) ;
16+ render (
17+ < div style = { { height : "600px" } } >
18+ { `tr {height: 30}` }
19+ < List data = { generateDummyContent ( 310 , 1 ) } />
20+ </ div > ,
21+ ) ; //Style required to find scroll height and fire onScroll
1722 expect ( store . getState ( ) . data . length ) . toBe ( 310 ) ;
23+
1824 const tr = await screen . findAllByTestId ( "sheet-table-tr" ) ;
1925 expect ( tr ) . toHaveLength ( 300 ) ;
20- fireEvent . scroll ( screen . getByTestId ( `sheet-table-content` ) , { target : { scrollTo : 300 * 28 } } ) ;
21- // Optional: Add waitFor/check for more rows if needed
26+
27+ const scrollable = screen . getByTestId ( `sheet-table-content` ) ;
28+
29+ fireEvent . scroll ( scrollable , { target : { scrollTop : 4000 } } ) ;
30+
31+ const tr2 = await screen . findAllByTestId ( "sheet-table-tr" ) ;
32+ expect ( tr2 ) . toHaveLength ( 310 ) ;
2233 } ) ;
2334
2435 test ( "Table KeyboardActions" , async ( ) => {
@@ -40,6 +51,11 @@ describe("index tests", () => {
4051 expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "fontWeight" ] ) . toBe ( "bold" ) ;
4152 } ) ;
4253
54+ fireEvent . keyDown ( table , { code : "KeyB" , ctrlKey : true } ) ;
55+ await waitFor ( ( ) => {
56+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "fontWeight" ] ) . toBe ( undefined ) ;
57+ } ) ;
58+
4359 fireEvent . keyDown ( table , { code : "KeyU" , ctrlKey : true } ) ;
4460 await waitFor ( ( ) => {
4561 expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "text-decoration" ] ) . toBe ( "underline" ) ;
@@ -49,7 +65,67 @@ describe("index tests", () => {
4965 await waitFor ( ( ) => {
5066 expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "fontStyle" ] ) . toBe ( "italic" ) ;
5167 } ) ;
52- expect ( onChange ) . toHaveBeenCalledTimes ( 7 ) ;
68+
69+ const fontInput = screen . getByTestId ( "font-size-input" ) ;
70+ expect ( fontInput ) . toBeInTheDocument ( ) ;
71+ fireEvent . change ( fontInput , { target : { value : "23" } } ) ;
72+ fireEvent . keyDown ( fontInput ) ;
73+ await waitFor ( ( ) => {
74+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "fontStyle" ] ) . toBe ( "italic" ) ;
75+ } ) ;
76+
77+ const fontDecrease = screen . getByTestId ( "font-size-decrease" ) ;
78+ expect ( fontDecrease ) . toBeInTheDocument ( ) ;
79+ fireEvent . click ( fontDecrease ) ;
80+ await waitFor ( ( ) => {
81+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "fontSize" ] ) . toBe ( "22px" ) ;
82+ } ) ;
83+
84+ const left = screen . getByTestId ( "align-left" ) ;
85+ expect ( left ) . toBeInTheDocument ( ) ;
86+ fireEvent . click ( left ) ;
87+ await waitFor ( ( ) => {
88+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "textAlign" ] ) . toBe ( "left" ) ;
89+ } ) ;
90+
91+ const right = screen . getByTestId ( "align-right" ) ;
92+ expect ( right ) . toBeInTheDocument ( ) ;
93+ fireEvent . click ( right ) ;
94+ await waitFor ( ( ) => {
95+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "textAlign" ] ) . toBe ( "right" ) ;
96+ } ) ;
97+
98+ const center = screen . getByTestId ( "align-center" ) ;
99+ expect ( center ) . toBeInTheDocument ( ) ;
100+ fireEvent . click ( center ) ;
101+
102+ await waitFor ( ( ) => {
103+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "textAlign" ] ) . toBe ( "center" ) ;
104+ } ) ;
105+
106+ const justify = screen . getByTestId ( "align-justify" ) ;
107+ expect ( justify ) . toBeInTheDocument ( ) ;
108+ fireEvent . click ( justify ) ;
109+ await waitFor ( ( ) => {
110+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "textAlign" ] ) . toBe ( "justify" ) ;
111+ } ) ;
112+
113+ const color = screen . getByTestId ( "font-color" ) ;
114+ expect ( color ) . toBeInTheDocument ( ) ;
115+ fireEvent . click ( screen . getByTestId ( "font-color-button" ) ) ;
116+ fireEvent . change ( color , { target : { value : "#ffffff" } } ) ;
117+ await waitFor ( ( ) => {
118+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "color" ] ) . toBe ( "#ffffff" ) ;
119+ } ) ;
120+
121+ const background = screen . getByTestId ( "background-color" ) ;
122+ expect ( background ) . toBeInTheDocument ( ) ;
123+ fireEvent . click ( screen . getByTestId ( "background-color-button" ) ) ;
124+ fireEvent . change ( background , { target : { value : "#ffffff" } } ) ;
125+ await waitFor ( ( ) => {
126+ expect ( store . getState ( ) . data ?. [ 0 ] [ 0 ] ?. styles ?. [ "background" ] ) . toBe ( "#ffffff" ) ;
127+ } ) ;
128+ expect ( onChange ) . toHaveBeenCalledTimes ( 17 ) ;
53129 } ) ;
54130
55131 test ( "Undo-Redo" , async ( ) => {
@@ -110,6 +186,7 @@ describe("index tests", () => {
110186 expect ( screen . getByTestId ( `3-0` ) ) . toHaveValue ( "1" ) ;
111187 } ) ;
112188 expect ( screen . getByTestId ( `4-0` ) ) . toHaveValue ( "2" ) ;
189+
113190 act ( ( ) => {
114191 store . dispatch ( selectOneCell , { payload : { i : 0 , j : 0 } } ) ;
115192 store . dispatch ( selectCellsDrag , { payload : { i : 2 , j : 0 } } ) ;
@@ -128,6 +205,50 @@ describe("index tests", () => {
128205 } ) ;
129206 } ) ;
130207
208+ test ( "select bottom to top and paste" , async ( ) => {
209+ userEvent . setup ( ) ;
210+ render ( < List data = { generateDummyContent ( 10 , 1 ) } /> ) ;
211+ mockAllIsIntersecting ( true ) ;
212+ act ( ( ) => {
213+ store . dispatch ( selectOneCell , { payload : { i : 0 , j : 0 } } ) ;
214+ } ) ;
215+ act ( ( ) => {
216+ store . dispatch ( changeData , {
217+ payload : { value : "1" , i : 0 , j : 0 } ,
218+ } ) ;
219+ } ) ;
220+ act ( ( ) => {
221+ store . dispatch ( changeData , {
222+ payload : { value : "2" , i : 1 , j : 0 } ,
223+ } ) ;
224+ } ) ;
225+ act ( ( ) => {
226+ store . dispatch ( changeData , {
227+ payload : { value : "3" , i : 2 , j : 0 } ,
228+ } ) ;
229+ } ) ;
230+ const table = screen . getByTestId ( `sheet-table` ) ;
231+
232+ act ( ( ) => {
233+ store . dispatch ( selectOneCell , { payload : { i : 2 , j : 0 } } ) ;
234+ store . dispatch ( selectCellsDrag , { payload : { i : 0 , j : 0 } } ) ;
235+ } ) ;
236+ fireEvent . keyDown ( table , { code : "KeyX" , ctrlKey : true } ) ;
237+ await waitFor ( ( ) => {
238+ expect ( screen . getByTestId ( `0-0` ) ) . toHaveValue ( "" ) ;
239+ } ) ;
240+ act ( ( ) => {
241+ store . dispatch ( selectOneCell , { payload : { i : 3 , j : 0 } } ) ;
242+ } ) ;
243+ fireEvent . keyDown ( table , { key : "V" , code : "KeyV" , ctrlKey : true } ) ;
244+
245+ await waitFor ( ( ) => {
246+ expect ( screen . getByTestId ( `3-0` ) ) . toHaveValue ( "1" ) ;
247+ } ) ;
248+ expect ( screen . getByTestId ( `4-0` ) ) . toHaveValue ( "2" ) ;
249+ expect ( screen . getByTestId ( `5-0` ) ) . toHaveValue ( "3" ) ;
250+ } ) ;
251+
131252 test ( "paste a normal value" , async ( ) => {
132253 userEvent . setup ( ) ;
133254 render ( < List data = { generateDummyContent ( 10 , 1 ) } /> ) ;
@@ -151,4 +272,15 @@ describe("index tests", () => {
151272 expect ( screen . getByTestId ( `1-0` ) ) . toHaveValue ( `[{"index":[],"data":["testValue"]}]` ) ;
152273 } ) ;
153274 } ) ;
275+
276+ test ( "Context menu" , ( ) => {
277+ render ( < List data = { generateDummyContent ( 10 , 1 ) } /> ) ;
278+ mockAllIsIntersecting ( true ) ;
279+ fireEvent . contextMenu ( screen . getByTestId ( `0-0` ) ) ;
280+ expect ( screen . getByText ( "Cut" ) ) . toBeInTheDocument ( ) ;
281+ expect ( screen . getByText ( "Copy" ) ) . toBeInTheDocument ( ) ;
282+ expect ( screen . getByText ( "Paste" ) ) . toBeInTheDocument ( ) ;
283+ fireEvent . click ( screen . getByTestId ( `sheet-table-content` ) ) ;
284+ expect ( screen . queryByText ( "Cut" ) ) . not . toBeInTheDocument ( ) ;
285+ } ) ;
154286} ) ;
0 commit comments