aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-ui-common/components/ui/__tests__/popups-test.tsx
blob: 777c1004d7769607088772b0df5d7777af0fd0b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 * Sonar UI Common
 * Copyright (C) 2019-2020 SonarSource SA
 * mailto:info AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
import { shallow } from 'enzyme';
import * as React from 'react';
import { findDOMNode } from 'react-dom';
import ScreenPositionFixer from '../../controls/ScreenPositionFixer';
import { Popup, PopupArrow, PopupPlacement, PortalPopup } from '../popups';

jest.mock('react-dom', () => ({
  ...jest.requireActual('react-dom'),
  findDOMNode: jest.fn().mockReturnValue(undefined),
}));

describe('Popup', () => {
  it('should render Popup', () => {
    expect(
      shallow(
        <Popup
          arrowStyle={{ top: -5 }}
          className="foo"
          placement={PopupPlacement.LeftTop}
          style={{ left: -5 }}
        />
      )
    ).toMatchSnapshot();
  });

  it('should render PopupArrow', () => {
    expect(shallow(<PopupArrow style={{ left: -5 }} />)).toMatchSnapshot();
  });
});

describe('PortalPopup', () => {
  it('should render correctly without overlay', () => {
    expect(shallowRender({ overlay: undefined })).toMatchSnapshot();
  });

  it('should render correctly with overlay', () => {
    const wrapper = shallowRender();
    wrapper.setState({ left: 0, top: 0, width: 10, height: 10 });
    expect(wrapper).toMatchSnapshot();
    expect(wrapper.find(ScreenPositionFixer).dive().dive().dive()).toMatchSnapshot();
  });

  it('should correctly compute the popup positioning', () => {
    const fakeDomNode = document.createElement('div');
    fakeDomNode.getBoundingClientRect = jest
      .fn()
      .mockReturnValue({ left: 10, top: 10, width: 10, height: 10 });
    (findDOMNode as jest.Mock).mockReturnValue(fakeDomNode);
    const wrapper = shallowRender();
    const getPlacementSpy = jest.spyOn(wrapper.instance(), 'getPlacement');

    wrapper.instance().popupNode = {
      current: {
        getBoundingClientRect: jest.fn().mockReturnValue({ width: 8, height: 8 }),
      } as any,
    };

    wrapper.instance().positionPopup();
    expect(wrapper.state()).toEqual(expect.objectContaining({ left: 11, top: 20 }));

    getPlacementSpy.mockReturnValue(PopupPlacement.BottomLeft);
    wrapper.instance().positionPopup();
    expect(wrapper.state()).toEqual(expect.objectContaining({ left: 10, top: 20 }));

    getPlacementSpy.mockReturnValue(PopupPlacement.BottomRight);
    wrapper.instance().positionPopup();
    expect(wrapper.state()).toEqual(expect.objectContaining({ left: 12, top: 20 }));

    getPlacementSpy.mockReturnValue(PopupPlacement.LeftTop);
    wrapper.instance().positionPopup();
    expect(wrapper.state()).toEqual(expect.objectContaining({ left: 2, top: 10 }));

    getPlacementSpy.mockReturnValue(PopupPlacement.RightBottom);
    wrapper.instance().positionPopup();
    expect(wrapper.state()).toEqual(expect.objectContaining({ left: 20, top: 12 }));

    getPlacementSpy.mockReturnValue(PopupPlacement.RightTop);
    wrapper.instance().positionPopup();
    expect(wrapper.state()).toEqual(expect.objectContaining({ left: 20, top: 10 }));

    getPlacementSpy.mockReturnValue(PopupPlacement.TopLeft);
    wrapper.instance().positionPopup();
    expect(wrapper.state()).toEqual(expect.objectContaining({ left: 10, top: 2 }));
  });

  it('should correctly compute the popup arrow positioning', () => {
    const wrapper = shallowRender({ arrowOffset: -2 });
    const getPlacementSpy = jest.spyOn(wrapper.instance(), 'getPlacement');

    expect(
      wrapper.instance().adjustArrowPosition(PopupPlacement.BottomLeft, { leftFix: 10, topFix: 10 })
    ).toEqual({ marginLeft: -12 });

    expect(
      wrapper
        .instance()
        .adjustArrowPosition(PopupPlacement.RightBottom, { leftFix: 10, topFix: 10 })
    ).toEqual({ marginTop: -12 });
  });

  function shallowRender(props: Partial<PortalPopup['props']> = {}) {
    return shallow<PortalPopup>(
      <PortalPopup overlay={<span id="overlay" />} {...props}>
        <div id="popup-trigger" />
      </PortalPopup>
    );
  }
});