dropdown_job_component_spec.js 2.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import Vue from 'vue';
import component from '~/pipelines/components/graph/dropdown_job_component.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';

describe('dropdown job component', () => {
  const Component = Vue.extend(component);
  let vm;

  const mock = {
    jobs: [
      {
        id: 4256,
        name: '<img src=x onerror=alert(document.domain)>',
        status: {
15
          icon: 'status_success',
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
          text: 'passed',
          label: 'passed',
          tooltip: 'passed',
          group: 'success',
          details_path: '/root/ci-mock/builds/4256',
          has_details: true,
          action: {
            icon: 'retry',
            title: 'Retry',
            path: '/root/ci-mock/builds/4256/retry',
            method: 'post',
          },
        },
      },
      {
        id: 4299,
        name: 'test',
        status: {
34
          icon: 'status_success',
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
          text: 'passed',
          label: 'passed',
          tooltip: 'passed',
          group: 'success',
          details_path: '/root/ci-mock/builds/4299',
          has_details: true,
          action: {
            icon: 'retry',
            title: 'Retry',
            path: '/root/ci-mock/builds/4299/retry',
            method: 'post',
          },
        },
      },
    ],
    name: 'rspec:linux',
    size: 2,
    status: {
53
      icon: 'status_success',
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
      text: 'passed',
      label: 'passed',
      tooltip: 'passed',
      group: 'success',
      details_path: '/root/ci-mock/builds/4256',
      has_details: true,
      action: {
        icon: 'retry',
        title: 'Retry',
        path: '/root/ci-mock/builds/4256/retry',
        method: 'post',
      },
    },
  };

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

  beforeEach(() => {
    vm = mountComponent(Component, { job: mock });
  });

  it('renders button with job name and size', () => {
    expect(vm.$el.querySelector('button').textContent).toContain(mock.name);
    expect(vm.$el.querySelector('button').textContent).toContain(mock.size);
  });

  it('renders dropdown with jobs', () => {
    expect(vm.$el.querySelectorAll('.scrollable-menu>ul>li').length).toEqual(mock.jobs.length);
  });

  it('escapes tooltip title', () => {
    expect(
      vm.$el.querySelector('.js-pipeline-graph-job-link').getAttribute('data-original-title'),
    ).toEqual(
      '&lt;img src=x onerror=alert(document.domain)&gt; - passed',
    );
  });
});