|
5 | 5 | * LICENSE file in the root directory of this source tree. |
6 | 6 | */ |
7 | 7 |
|
8 | | -import React from 'react'; |
| 8 | +import React, { Profiler } from 'react'; |
9 | 9 | import { |
10 | 10 | act, |
11 | 11 | fireEvent, |
@@ -389,4 +389,63 @@ describe('FloatingMenu', () => { |
389 | 389 | expect(menu.style.top).toBe('60px'); |
390 | 390 | }); |
391 | 391 | }); |
| 392 | + |
| 393 | + it('should not commit again when repeated resizes keep the same updated menu position', async () => { |
| 394 | + const remove = jest.fn(); |
| 395 | + let resizeCallback; |
| 396 | + const onRender = jest.fn(); |
| 397 | + const trigger = document.createElement('button'); |
| 398 | + const triggerRef = { current: trigger }; |
| 399 | + const target = () => document.body; |
| 400 | + |
| 401 | + trigger.setAttribute('data-testid', 'trigger'); |
| 402 | + document.body.appendChild(trigger); |
| 403 | + |
| 404 | + jest.spyOn(OptimizedResize, 'add').mockImplementation((callback) => { |
| 405 | + resizeCallback = callback; |
| 406 | + return { remove }; |
| 407 | + }); |
| 408 | + |
| 409 | + render( |
| 410 | + <Profiler id="floating-menu" onRender={onRender}> |
| 411 | + <FloatingMenu |
| 412 | + triggerRef={triggerRef} |
| 413 | + menuOffset={defaultMenuOffset} |
| 414 | + target={target}> |
| 415 | + {defaultMenuChildren} |
| 416 | + </FloatingMenu> |
| 417 | + </Profiler> |
| 418 | + ); |
| 419 | + |
| 420 | + await waitFor(() => { |
| 421 | + expect(screen.getByTestId('menu').style.left).toBe('-23px'); |
| 422 | + expect(screen.getByTestId('menu').style.top).toBe('65px'); |
| 423 | + }); |
| 424 | + |
| 425 | + triggerRect = createRect({ |
| 426 | + left: 50, |
| 427 | + top: 20, |
| 428 | + right: 70, |
| 429 | + bottom: 60, |
| 430 | + width: 20, |
| 431 | + height: 40, |
| 432 | + }); |
| 433 | + |
| 434 | + act(() => { |
| 435 | + resizeCallback(); |
| 436 | + }); |
| 437 | + |
| 438 | + await waitFor(() => { |
| 439 | + expect(screen.getByTestId('menu').style.left).toBe('17px'); |
| 440 | + expect(screen.getByTestId('menu').style.top).toBe('65px'); |
| 441 | + }); |
| 442 | + |
| 443 | + const commitCountAfterPositionChange = onRender.mock.calls.length; |
| 444 | + |
| 445 | + act(() => { |
| 446 | + resizeCallback(); |
| 447 | + }); |
| 448 | + |
| 449 | + expect(onRender).toHaveBeenCalledTimes(commitCountAfterPositionChange); |
| 450 | + }); |
392 | 451 | }); |
0 commit comments