164 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/* eslint-disable no-new */
 | 
						|
import _ from 'underscore';
 | 
						|
import MockAdapter from 'axios-mock-adapter';
 | 
						|
import axios from '~/lib/utils/axios_utils';
 | 
						|
import Sidebar from '~/right_sidebar';
 | 
						|
import timeoutPromise from './helpers/set_timeout_promise_helper';
 | 
						|
 | 
						|
describe('Issuable right sidebar collapsed todo toggle', () => {
 | 
						|
  const fixtureName = 'issues/open-issue.html.raw';
 | 
						|
  const jsonFixtureName = 'todos/todos.json';
 | 
						|
  let mock;
 | 
						|
 | 
						|
  preloadFixtures(fixtureName);
 | 
						|
  preloadFixtures(jsonFixtureName);
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    const todoData = getJSONFixture(jsonFixtureName);
 | 
						|
    new Sidebar();
 | 
						|
    loadFixtures(fixtureName);
 | 
						|
 | 
						|
    document.querySelector('.js-right-sidebar')
 | 
						|
      .classList.toggle('right-sidebar-expanded');
 | 
						|
    document.querySelector('.js-right-sidebar')
 | 
						|
      .classList.toggle('right-sidebar-collapsed');
 | 
						|
 | 
						|
    mock = new MockAdapter(axios);
 | 
						|
 | 
						|
    mock.onPost(`${gl.TEST_HOST}/frontend-fixtures/issues-project/todos`).reply(() => {
 | 
						|
      const response = _.clone(todoData);
 | 
						|
 | 
						|
      return [200, response];
 | 
						|
    });
 | 
						|
 | 
						|
    mock.onDelete(/(.*)\/dashboard\/todos\/\d+$/).reply(() => {
 | 
						|
      const response = _.clone(todoData);
 | 
						|
      delete response.delete_path;
 | 
						|
 | 
						|
      return [200, response];
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  afterEach(() => {
 | 
						|
    mock.restore();
 | 
						|
  });
 | 
						|
 | 
						|
  it('shows add todo button', () => {
 | 
						|
    expect(
 | 
						|
      document.querySelector('.js-issuable-todo.sidebar-collapsed-icon'),
 | 
						|
    ).not.toBeNull();
 | 
						|
 | 
						|
    expect(
 | 
						|
      document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .fa-plus-square'),
 | 
						|
    ).not.toBeNull();
 | 
						|
 | 
						|
    expect(
 | 
						|
      document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
 | 
						|
    ).toBeNull();
 | 
						|
  });
 | 
						|
 | 
						|
  it('sets default tooltip title', () => {
 | 
						|
    expect(
 | 
						|
      document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('title'),
 | 
						|
    ).toBe('Add todo');
 | 
						|
  });
 | 
						|
 | 
						|
  it('toggle todo state', (done) => {
 | 
						|
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
 | 
						|
    setTimeout(() => {
 | 
						|
      expect(
 | 
						|
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
 | 
						|
      ).not.toBeNull();
 | 
						|
 | 
						|
      expect(
 | 
						|
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .fa-check-square'),
 | 
						|
      ).not.toBeNull();
 | 
						|
 | 
						|
      done();
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  it('toggle todo state of expanded todo toggle', (done) => {
 | 
						|
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
 | 
						|
    setTimeout(() => {
 | 
						|
      expect(
 | 
						|
        document.querySelector('.issuable-sidebar-header .js-issuable-todo').textContent.trim(),
 | 
						|
      ).toBe('Mark todo as done');
 | 
						|
 | 
						|
      done();
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  it('toggles todo button tooltip', (done) => {
 | 
						|
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
 | 
						|
    setTimeout(() => {
 | 
						|
      expect(
 | 
						|
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('data-original-title'),
 | 
						|
      ).toBe('Mark todo as done');
 | 
						|
 | 
						|
      done();
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  it('marks todo as done', (done) => {
 | 
						|
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
 | 
						|
    timeoutPromise()
 | 
						|
      .then(() => {
 | 
						|
        expect(
 | 
						|
          document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
 | 
						|
        ).not.toBeNull();
 | 
						|
 | 
						|
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
      })
 | 
						|
      .then(timeoutPromise)
 | 
						|
      .then(() => {
 | 
						|
        expect(
 | 
						|
          document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
 | 
						|
        ).toBeNull();
 | 
						|
 | 
						|
        expect(
 | 
						|
          document.querySelector('.issuable-sidebar-header .js-issuable-todo').textContent.trim(),
 | 
						|
        ).toBe('Add todo');
 | 
						|
      })
 | 
						|
      .then(done)
 | 
						|
      .catch(done.fail);
 | 
						|
  });
 | 
						|
 | 
						|
  it('updates aria-label to mark todo as done', (done) => {
 | 
						|
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
 | 
						|
    setTimeout(() => {
 | 
						|
      expect(
 | 
						|
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('aria-label'),
 | 
						|
      ).toBe('Mark todo as done');
 | 
						|
 | 
						|
      done();
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  it('updates aria-label to add todo', (done) => {
 | 
						|
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
 | 
						|
    timeoutPromise()
 | 
						|
      .then(() => {
 | 
						|
        expect(
 | 
						|
          document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('aria-label'),
 | 
						|
        ).toBe('Mark todo as done');
 | 
						|
 | 
						|
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
 | 
						|
      })
 | 
						|
      .then(timeoutPromise)
 | 
						|
      .then(() => {
 | 
						|
        expect(
 | 
						|
          document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('aria-label'),
 | 
						|
        ).toBe('Add todo');
 | 
						|
      })
 | 
						|
      .then(done)
 | 
						|
      .catch(done.fail);
 | 
						|
  });
 | 
						|
});
 |