summaryrefslogtreecommitdiff
path: root/spec/frontend/issue_show/components/form_spec.js
blob: 4a8ec3cf66a9523a49ea00edd5c8ade71646e334 (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
import Vue from 'vue';
import mountComponent from 'helpers/vue_mount_component_helper';
import Autosave from '~/autosave';
import formComponent from '~/issue_show/components/form.vue';
import eventHub from '~/issue_show/event_hub';

jest.mock('~/autosave');

describe('Inline edit form component', () => {
  let vm;
  const defaultProps = {
    canDestroy: true,
    formState: {
      title: 'b',
      description: 'a',
      lockedWarningVisible: false,
    },
    issuableType: 'issue',
    markdownPreviewPath: '/',
    markdownDocsPath: '/',
    projectPath: '/',
    projectId: 1,
    projectNamespace: '/',
  };

  afterEach(() => {
    vm.$destroy();
  });

  const createComponent = (props) => {
    const Component = Vue.extend(formComponent);

    vm = mountComponent(Component, {
      ...defaultProps,
      ...props,
    });
  };

  it('does not render template selector if no templates exist', () => {
    createComponent();

    expect(vm.$el.querySelector('.js-issuable-selector-wrap')).toBeNull();
  });

  it('renders template selector when templates exists', () => {
    createComponent({
      issuableTemplates: [
        { name: 'test', id: 'test', project_path: 'test', namespace_path: 'test' },
      ],
    });

    expect(vm.$el.querySelector('.js-issuable-selector-wrap')).not.toBeNull();
  });

  it('hides locked warning by default', () => {
    createComponent();

    expect(vm.$el.querySelector('.alert')).toBeNull();
  });

  it('shows locked warning if formState is different', () => {
    createComponent({ formState: { ...defaultProps.formState, lockedWarningVisible: true } });

    expect(vm.$el.querySelector('.alert')).not.toBeNull();
  });

  it('hides locked warning when currently saving', () => {
    createComponent({
      formState: { ...defaultProps.formState, updateLoading: true, lockedWarningVisible: true },
    });

    expect(vm.$el.querySelector('.alert')).toBeNull();
  });

  describe('autosave', () => {
    let spy;

    beforeEach(() => {
      spy = jest.spyOn(Autosave.prototype, 'reset');
    });

    it('initialized Autosave on mount', () => {
      createComponent();

      expect(Autosave).toHaveBeenCalledTimes(2);
    });

    it('calls reset on autosave when eventHub emits appropriate events', () => {
      createComponent();

      eventHub.$emit('close.form');

      expect(spy).toHaveBeenCalledTimes(2);

      eventHub.$emit('delete.issuable');

      expect(spy).toHaveBeenCalledTimes(4);

      eventHub.$emit('update.issuable');

      expect(spy).toHaveBeenCalledTimes(6);
    });
  });
});