141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
import { shallowMount } from '@vue/test-utils';
 | 
						|
import ImageDiffOverlay from '~/diffs/components/image_diff_overlay.vue';
 | 
						|
import { createStore } from '~/mr_notes/stores';
 | 
						|
import { imageDiffDiscussions } from '../mock_data/diff_discussions';
 | 
						|
import Icon from '~/vue_shared/components/icon.vue';
 | 
						|
 | 
						|
describe('Diffs image diff overlay component', () => {
 | 
						|
  const dimensions = {
 | 
						|
    width: 100,
 | 
						|
    height: 200,
 | 
						|
  };
 | 
						|
  let wrapper;
 | 
						|
  let dispatch;
 | 
						|
  const getAllImageBadges = () => wrapper.findAll('.js-image-badge');
 | 
						|
 | 
						|
  function createComponent(props = {}, extendStore = () => {}) {
 | 
						|
    const store = createStore();
 | 
						|
 | 
						|
    extendStore(store);
 | 
						|
    dispatch = jest.spyOn(store, 'dispatch').mockImplementation();
 | 
						|
 | 
						|
    wrapper = shallowMount(ImageDiffOverlay, {
 | 
						|
      store,
 | 
						|
      propsData: {
 | 
						|
        discussions: [...imageDiffDiscussions],
 | 
						|
        fileHash: 'ABC',
 | 
						|
        ...props,
 | 
						|
      },
 | 
						|
      methods: {
 | 
						|
        getImageDimensions: jest.fn().mockReturnValue(dimensions),
 | 
						|
      },
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  afterEach(() => {
 | 
						|
    wrapper.destroy();
 | 
						|
    wrapper = null;
 | 
						|
  });
 | 
						|
 | 
						|
  it('renders comment badges', () => {
 | 
						|
    createComponent();
 | 
						|
 | 
						|
    expect(getAllImageBadges()).toHaveLength(2);
 | 
						|
  });
 | 
						|
 | 
						|
  it('renders index of discussion in badge', () => {
 | 
						|
    createComponent();
 | 
						|
    const imageBadges = getAllImageBadges();
 | 
						|
 | 
						|
    expect(
 | 
						|
      imageBadges
 | 
						|
        .at(0)
 | 
						|
        .text()
 | 
						|
        .trim(),
 | 
						|
    ).toBe('1');
 | 
						|
    expect(
 | 
						|
      imageBadges
 | 
						|
        .at(1)
 | 
						|
        .text()
 | 
						|
        .trim(),
 | 
						|
    ).toBe('2');
 | 
						|
  });
 | 
						|
 | 
						|
  it('renders icon when showCommentIcon is true', () => {
 | 
						|
    createComponent({ showCommentIcon: true });
 | 
						|
 | 
						|
    expect(wrapper.find(Icon).exists()).toBe(true);
 | 
						|
  });
 | 
						|
 | 
						|
  it('sets badge comment positions', () => {
 | 
						|
    createComponent();
 | 
						|
    const imageBadges = getAllImageBadges();
 | 
						|
 | 
						|
    expect(imageBadges.at(0).attributes('style')).toBe('left: 10px; top: 10px;');
 | 
						|
    expect(imageBadges.at(1).attributes('style')).toBe('left: 5px; top: 5px;');
 | 
						|
  });
 | 
						|
 | 
						|
  it('renders single badge for discussion object', () => {
 | 
						|
    createComponent({
 | 
						|
      discussions: {
 | 
						|
        ...imageDiffDiscussions[0],
 | 
						|
      },
 | 
						|
    });
 | 
						|
 | 
						|
    expect(getAllImageBadges()).toHaveLength(1);
 | 
						|
  });
 | 
						|
 | 
						|
  it('dispatches openDiffFileCommentForm when clicking overlay', () => {
 | 
						|
    createComponent({ canComment: true });
 | 
						|
    wrapper.find('.js-add-image-diff-note-button').trigger('click', { offsetX: 0, offsetY: 0 });
 | 
						|
 | 
						|
    expect(dispatch).toHaveBeenCalledWith('diffs/openDiffFileCommentForm', {
 | 
						|
      fileHash: 'ABC',
 | 
						|
      x: 0,
 | 
						|
      y: 0,
 | 
						|
      width: 100,
 | 
						|
      height: 200,
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe('toggle discussion', () => {
 | 
						|
    const getImageBadge = () => wrapper.find('.js-image-badge');
 | 
						|
 | 
						|
    it('disables buttons when shouldToggleDiscussion is false', () => {
 | 
						|
      createComponent({ shouldToggleDiscussion: false });
 | 
						|
 | 
						|
      expect(getImageBadge().attributes('disabled')).toEqual('disabled');
 | 
						|
    });
 | 
						|
 | 
						|
    it('dispatches toggleDiscussion when clicking image badge', () => {
 | 
						|
      createComponent();
 | 
						|
      getImageBadge().trigger('click');
 | 
						|
 | 
						|
      expect(dispatch).toHaveBeenCalledWith('toggleDiscussion', {
 | 
						|
        discussionId: '1',
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe('comment form', () => {
 | 
						|
    const getCommentIndicator = () => wrapper.find('.comment-indicator');
 | 
						|
    beforeEach(() => {
 | 
						|
      createComponent({}, store => {
 | 
						|
        store.state.diffs.commentForms.push({
 | 
						|
          fileHash: 'ABC',
 | 
						|
          x: 20,
 | 
						|
          y: 10,
 | 
						|
        });
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    it('renders comment form badge', () => {
 | 
						|
      expect(getCommentIndicator().exists()).toBe(true);
 | 
						|
    });
 | 
						|
 | 
						|
    it('sets comment form badge position', () => {
 | 
						|
      expect(getCommentIndicator().attributes('style')).toBe('left: 20px; top: 10px;');
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |