import Vue from 'vue';
import { createStore } from '~/ide/stores';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import FileRowExtra from '~/ide/components/file_row_extra.vue';
import { file, resetStore } from '../helpers';

describe('IDE extra file row component', () => {
  let Component;
  let vm;
  let unstagedFilesCount = 0;
  let stagedFilesCount = 0;
  let changesCount = 0;

  beforeAll(() => {
    Component = Vue.extend(FileRowExtra);
  });

  beforeEach(() => {
    vm = createComponentWithStore(Component, createStore(), {
      file: {
        ...file('test'),
      },
      mouseOver: false,
    });

    spyOnProperty(vm, 'getUnstagedFilesCountForPath').and.returnValue(() => unstagedFilesCount);
    spyOnProperty(vm, 'getStagedFilesCountForPath').and.returnValue(() => stagedFilesCount);
    spyOnProperty(vm, 'getChangesInFolder').and.returnValue(() => changesCount);

    vm.$mount();
  });

  afterEach(() => {
    vm.$destroy();
    resetStore(vm.$store);

    stagedFilesCount = 0;
    unstagedFilesCount = 0;
    changesCount = 0;
  });

  describe('folderChangesTooltip', () => {
    it('returns undefined when changes count is 0', () => {
      expect(vm.folderChangesTooltip).toBe(undefined);
    });

    it('returns unstaged changes text', () => {
      changesCount = 1;
      unstagedFilesCount = 1;

      expect(vm.folderChangesTooltip).toBe('1 unstaged change');
    });

    it('returns staged changes text', () => {
      changesCount = 1;
      stagedFilesCount = 1;

      expect(vm.folderChangesTooltip).toBe('1 staged change');
    });

    it('returns staged and unstaged changes text', () => {
      changesCount = 1;
      stagedFilesCount = 1;
      unstagedFilesCount = 1;

      expect(vm.folderChangesTooltip).toBe('1 unstaged and 1 staged changes');
    });
  });

  describe('show tree changes count', () => {
    it('does not show for blobs', () => {
      vm.file.type = 'blob';

      expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null);
    });

    it('does not show when changes count is 0', () => {
      vm.file.type = 'tree';

      expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null);
    });

    it('does not show when tree is open', done => {
      vm.file.type = 'tree';
      vm.file.opened = true;
      changesCount = 1;

      vm.$nextTick(() => {
        expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null);

        done();
      });
    });

    it('shows for trees with changes', done => {
      vm.file.type = 'tree';
      vm.file.opened = false;
      changesCount = 1;

      vm.$nextTick(() => {
        expect(vm.$el.querySelector('.ide-tree-changes')).not.toBe(null);

        done();
      });
    });
  });

  describe('changes file icon', () => {
    it('hides when file is not changed', () => {
      expect(vm.$el.querySelector('.file-changed-icon')).toBe(null);
    });

    it('shows when file is changed', done => {
      vm.file.changed = true;

      vm.$nextTick(() => {
        expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null);

        done();
      });
    });

    it('shows when file is staged', done => {
      vm.file.staged = true;

      vm.$nextTick(() => {
        expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null);

        done();
      });
    });

    it('shows when file is a tempFile', done => {
      vm.file.tempFile = true;

      vm.$nextTick(() => {
        expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null);

        done();
      });
    });
  });

  describe('merge request icon', () => {
    it('hides when not a merge request change', () => {
      expect(vm.$el.querySelector('.ic-git-merge')).toBe(null);
    });

    it('shows when a merge request change', done => {
      vm.file.mrChange = true;

      vm.$nextTick(() => {
        expect(vm.$el.querySelector('.ic-git-merge')).not.toBe(null);

        done();
      });
    });
  });
});
