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
|
import Vue from 'vue';
import failedToMergeComponent from '~/vue_merge_request_widget/components/states/mr_widget_failed_to_merge';
import eventHub from '~/vue_merge_request_widget/event_hub';
const mr = {
mergeError: 'Merge error happened.',
};
const createComponent = () => {
const Component = Vue.extend(failedToMergeComponent);
return new Component({
el: document.createElement('div'),
propsData: { mr },
});
};
describe('MRWidgetFailedToMerge', () => {
describe('data', () => {
it('should have default data', () => {
const data = failedToMergeComponent.data();
expect(data.timer).toEqual(10);
expect(data.isRefreshing).toBeFalsy();
});
});
describe('computed', () => {
describe('timerText', () => {
it('should return correct timer text', () => {
const vm = createComponent();
expect(vm.timerText).toEqual('10 seconds');
vm.timer = 1;
expect(vm.timerText).toEqual('a second');
});
});
});
describe('created', () => {
it('should disable polling', () => {
spyOn(eventHub, '$emit');
createComponent();
expect(eventHub.$emit).toHaveBeenCalledWith('DisablePolling');
});
});
describe('methods', () => {
describe('refresh', () => {
it('should emit event to request component refresh', () => {
spyOn(eventHub, '$emit');
const vm = createComponent();
expect(vm.isRefreshing).toBeFalsy();
vm.refresh();
expect(vm.isRefreshing).toBeTruthy();
expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested');
expect(eventHub.$emit).toHaveBeenCalledWith('EnablePolling');
});
});
describe('updateTimer', () => {
it('should update timer and emit event when timer end', () => {
const vm = createComponent();
spyOn(vm, 'refresh');
expect(vm.timer).toEqual(10);
for (let i = 0; i < 10; i++) { // eslint-disable-line
expect(vm.timer).toEqual(10 - i);
vm.updateTimer();
}
expect(vm.refresh).toHaveBeenCalled();
});
});
});
describe('template', () => {
let vm;
let el;
beforeEach(() => {
vm = createComponent();
el = vm.$el;
});
it('should have correct elements', (done) => {
expect(el.classList.contains('mr-widget-body')).toBeTruthy();
expect(el.innerText).toContain('Merge error happened.');
expect(el.innerText).toContain('Refreshing in 10 seconds');
expect(el.innerText).not.toContain('Merge failed.');
expect(el.querySelector('button').getAttribute('disabled')).toBeTruthy();
expect(el.querySelector('button').innerText).toContain('Merge');
expect(el.querySelector('.js-refresh-button').innerText).toContain('Refresh now');
expect(el.querySelector('.js-refresh-label')).toEqual(null);
expect(el.innerText).not.toContain('Refreshing now');
setTimeout(() => {
expect(el.innerText).toContain('Refreshing in 9 seconds');
done();
}, 1010);
});
it('should just generic merge failed message if merge_error is not available', (done) => {
vm.mr.mergeError = null;
Vue.nextTick(() => {
expect(el.innerText).toContain('Merge failed.');
expect(el.innerText).not.toContain('Merge error happened.');
done();
});
});
it('should show refresh label when refresh requested', () => {
vm.refresh();
Vue.nextTick(() => {
expect(el.innerText).not.toContain('Merge failed. Refreshing');
expect(el.innerText).toContain('Refreshing now');
});
});
});
});
|