Welcome to mirror list, hosted at ThFree Co, Russian Federation.

clusters_actions_spec.js « components « clusters_list « frontend « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 312df12ab5f9f5bc2be028f68986bd7ed2007585 (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import { GlDropdown, GlDropdownItem, GlButton } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ClustersActions from '~/clusters_list/components/clusters_actions.vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '~/clusters_list/constants';

describe('ClustersActionsComponent', () => {
  let wrapper;

  const newClusterPath = 'path/to/create/cluster';
  const addClusterPath = 'path/to/connect/existing/cluster';

  const defaultProvide = {
    newClusterPath,
    addClusterPath,
    canAddCluster: true,
    displayClusterAgents: true,
    certificateBasedClustersEnabled: true,
  };

  const findDropdown = () => wrapper.findComponent(GlDropdown);
  const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
  const findDropdownItemIds = () =>
    findDropdownItems().wrappers.map((x) => x.attributes('data-testid'));
  const findNewClusterLink = () => wrapper.findByTestId('new-cluster-link');
  const findConnectClusterLink = () => wrapper.findByTestId('connect-cluster-link');
  const findConnectNewAgentLink = () => wrapper.findByTestId('connect-new-agent-link');
  const findConnectWithAgentButton = () => wrapper.findComponent(GlButton);

  const createWrapper = (provideData = {}) => {
    wrapper = shallowMountExtended(ClustersActions, {
      provide: {
        ...defaultProvide,
        ...provideData,
      },
      directives: {
        GlModalDirective: createMockDirective(),
        GlTooltip: createMockDirective(),
      },
    });
  };

  beforeEach(() => {
    createWrapper();
  });

  afterEach(() => {
    wrapper.destroy();
  });
  describe('when the certificate based clusters are enabled', () => {
    it('renders actions menu', () => {
      expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.actionsButton);
    });

    it('renders correct href attributes for the links', () => {
      expect(findNewClusterLink().attributes('href')).toBe(newClusterPath);
      expect(findConnectClusterLink().attributes('href')).toBe(addClusterPath);
    });

    describe('when user cannot add clusters', () => {
      beforeEach(() => {
        createWrapper({ canAddCluster: false });
      });

      it('disables dropdown', () => {
        expect(findDropdown().props('disabled')).toBe(true);
      });

      it('shows tooltip explaining why dropdown is disabled', () => {
        const tooltip = getBinding(findDropdown().element, 'gl-tooltip');
        expect(tooltip.value).toBe(CLUSTERS_ACTIONS.dropdownDisabledHint);
      });

      it('does not bind split dropdown button', () => {
        const binding = getBinding(findDropdown().element, 'gl-modal-directive');

        expect(binding.value).toBe(false);
      });
    });

    describe('when on project level', () => {
      it('renders a dropdown with 3 actions items', () => {
        expect(findDropdownItemIds()).toEqual([
          'connect-new-agent-link',
          'new-cluster-link',
          'connect-cluster-link',
        ]);
      });

      it('renders correct modal id for the agent link', () => {
        const binding = getBinding(findConnectNewAgentLink().element, 'gl-modal-directive');

        expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
      });

      it('shows tooltip', () => {
        const tooltip = getBinding(findDropdown().element, 'gl-tooltip');
        expect(tooltip.value).toBe(CLUSTERS_ACTIONS.connectWithAgent);
      });

      it('shows split button in dropdown', () => {
        expect(findDropdown().props('split')).toBe(true);
      });

      it('binds split button with modal id', () => {
        const binding = getBinding(findDropdown().element, 'gl-modal-directive');

        expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
      });
    });

    describe('when on group or admin level', () => {
      beforeEach(() => {
        createWrapper({ displayClusterAgents: false });
      });

      it('renders a dropdown with 2 actions items', () => {
        expect(findDropdownItemIds()).toEqual(['new-cluster-link', 'connect-cluster-link']);
      });

      it('shows tooltip', () => {
        const tooltip = getBinding(findDropdown().element, 'gl-tooltip');
        expect(tooltip.value).toBe(CLUSTERS_ACTIONS.connectExistingCluster);
      });

      it('does not show split button in dropdown', () => {
        expect(findDropdown().props('split')).toBe(false);
      });

      it('does not bind dropdown button to modal', () => {
        const binding = getBinding(findDropdown().element, 'gl-modal-directive');

        expect(binding.value).toBe(false);
      });
    });
  });

  describe('when the certificate based clusters not enabled', () => {
    beforeEach(() => {
      createWrapper({ certificateBasedClustersEnabled: false });
    });

    it('it does not show the the dropdown', () => {
      expect(findDropdown().exists()).toBe(false);
    });

    it('shows the connect with agent button', () => {
      expect(findConnectWithAgentButton().props()).toMatchObject({
        disabled: !defaultProvide.canAddCluster,
        category: 'primary',
        variant: 'confirm',
      });
      expect(findConnectWithAgentButton().text()).toBe(CLUSTERS_ACTIONS.connectWithAgent);
    });
  });
});