summaryrefslogtreecommitdiff
path: root/spec/frontend/clusters/services/crossplane_provider_stack_spec.js
blob: 3e5f8de8e7b89b596badfb386c091d4f03f4633f (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
import { shallowMount } from '@vue/test-utils';
import { GlDropdownItem, GlIcon } from '@gitlab/ui';
import CrossplaneProviderStack from '~/clusters/components/crossplane_provider_stack.vue';

describe('CrossplaneProviderStack component', () => {
  let wrapper;

  const defaultProps = {
    stacks: [
      {
        name: 'Google Cloud Platform',
        code: 'gcp',
      },
      {
        name: 'Amazon Web Services',
        code: 'aws',
      },
    ],
  };

  function createComponent(props = {}) {
    const propsData = {
      ...defaultProps,
      ...props,
    };

    wrapper = shallowMount(CrossplaneProviderStack, {
      propsData,
    });
  }

  beforeEach(() => {
    const crossplane = {
      title: 'crossplane',
      stack: '',
    };
    createComponent({ crossplane });
  });

  const findDropdownElements = () => wrapper.findAll(GlDropdownItem);
  const findFirstDropdownElement = () => findDropdownElements().at(0);

  afterEach(() => {
    wrapper.destroy();
  });

  it('renders all of the available stacks in the dropdown', () => {
    const dropdownElements = findDropdownElements();

    expect(dropdownElements.length).toBe(defaultProps.stacks.length);

    defaultProps.stacks.forEach((stack, index) =>
      expect(dropdownElements.at(index).text()).toEqual(stack.name),
    );
  });

  it('displays the correct label for the first dropdown item if a stack is selected', () => {
    const crossplane = {
      title: 'crossplane',
      stack: 'gcp',
    };
    createComponent({ crossplane });
    expect(wrapper.vm.dropdownText).toBe('Google Cloud Platform');
  });

  it('emits the "set" event with the selected stack value', () => {
    const crossplane = {
      title: 'crossplane',
      stack: 'gcp',
    };
    createComponent({ crossplane });
    findFirstDropdownElement().vm.$emit('click');
    return wrapper.vm.$nextTick().then(() => {
      expect(wrapper.emitted().set[0][0].code).toEqual('gcp');
    });
  });

  it('renders the correct dropdown text when no stack is selected', () => {
    expect(wrapper.vm.dropdownText).toBe('Select Stack');
  });

  it('renders an external link', () => {
    expect(wrapper.find(GlIcon).props('name')).toBe('external-link');
  });
});