summaryrefslogtreecommitdiff
path: root/spec/javascripts/pipelines/stage_spec.js
blob: a4f32a1faed20bc5919abae8b0d7f0440fc20cd8 (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
import Vue from 'vue';
import stage from '~/pipelines/components/stage.vue';

describe('Pipelines stage component', () => {
  let StageComponent;
  let component;

  beforeEach(() => {
    StageComponent = Vue.extend(stage);

    component = new StageComponent({
      propsData: {
        stage: {
          status: {
            group: 'success',
            icon: 'icon_status_success',
            title: 'success',
          },
          dropdown_path: 'foo',
        },
        updateDropdown: false,
      },
    }).$mount();
  });

  it('should render a dropdown with the status icon', () => {
    expect(component.$el.getAttribute('class')).toEqual('dropdown');
    expect(component.$el.querySelector('svg')).toBeDefined();
    expect(component.$el.querySelector('button').getAttribute('data-toggle')).toEqual('dropdown');
  });

  describe('with successfull request', () => {
    const interceptor = (request, next) => {
      next(request.respondWith(JSON.stringify({ html: 'foo' }), {
        status: 200,
      }));
    };

    beforeEach(() => {
      Vue.http.interceptors.push(interceptor);
    });

    afterEach(() => {
      Vue.http.interceptors = _.without(
        Vue.http.interceptors, interceptor,
      );
    });

    it('should render the received data', (done) => {
      component.$el.querySelector('button').click();

      setTimeout(() => {
        expect(
          component.$el.querySelector('.js-builds-dropdown-container ul').textContent.trim(),
        ).toEqual('foo');
        done();
      }, 0);
    });
  });

  describe('when request fails', () => {
    const interceptor = (request, next) => {
      next(request.respondWith(JSON.stringify({}), {
        status: 500,
      }));
    };

    beforeEach(() => {
      Vue.http.interceptors.push(interceptor);
    });

    afterEach(() => {
      Vue.http.interceptors = _.without(
        Vue.http.interceptors, interceptor,
      );
    });

    it('should close the dropdown', () => {
      component.$el.click();

      setTimeout(() => {
        expect(component.$el.classList.contains('open')).toEqual(false);
      }, 0);
    });
  });
});