190 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
import { mount } from '@vue/test-utils';
 | 
						||
import { asyncExpect } from '@/tests/utils';
 | 
						||
import moment from 'moment';
 | 
						||
import MockDate from 'mockdate';
 | 
						||
import DatePicker from '..';
 | 
						||
import {
 | 
						||
  selectDateFromBody,
 | 
						||
  openPanel,
 | 
						||
  clearInput,
 | 
						||
  nextYear,
 | 
						||
  nextMonth,
 | 
						||
  hasSelected,
 | 
						||
  $$,
 | 
						||
} from './utils';
 | 
						||
import focusTest from '../../../tests/shared/focusTest';
 | 
						||
 | 
						||
describe('DatePicker', () => {
 | 
						||
  focusTest(DatePicker);
 | 
						||
 | 
						||
  beforeEach(() => {
 | 
						||
    document.body.outerHTML = '';
 | 
						||
    MockDate.set(moment('2016-11-22'));
 | 
						||
  });
 | 
						||
 | 
						||
  afterEach(() => {
 | 
						||
    MockDate.reset();
 | 
						||
  });
 | 
						||
 | 
						||
  it('prop locale should works', async () => {
 | 
						||
    const locale = {
 | 
						||
      lang: {
 | 
						||
        placeholder: 'Избери дата',
 | 
						||
        rangePlaceholder: ['Начална дата', 'Крайна дата'],
 | 
						||
        today: 'Днес',
 | 
						||
        now: 'Сега',
 | 
						||
        backToToday: 'Към днес',
 | 
						||
        ok: 'Добре',
 | 
						||
        clear: 'Изчистване',
 | 
						||
        month: 'Месец',
 | 
						||
        year: 'Година',
 | 
						||
        timeSelect: 'Избор на час',
 | 
						||
        dateSelect: 'Избор на дата',
 | 
						||
        monthSelect: 'Избор на месец',
 | 
						||
        yearSelect: 'Избор на година',
 | 
						||
        decadeSelect: 'Десетилетие',
 | 
						||
        previousMonth: 'Предишен месец (PageUp)',
 | 
						||
        nextMonth: 'Следващ месец (PageDown)',
 | 
						||
        previousYear: 'Последна година (Control + left)',
 | 
						||
        nextYear: 'Следваща година (Control + right)',
 | 
						||
        previousDecade: 'Предишно десетилетие',
 | 
						||
        nextDecade: 'Следващо десетилетие',
 | 
						||
        previousCentury: 'Последен век',
 | 
						||
        nextCentury: 'Следващ век',
 | 
						||
        yearFormat: 'YYYY',
 | 
						||
        dateFormat: 'D M YYYY',
 | 
						||
        dayFormat: 'D',
 | 
						||
        dateTimeFormat: 'D M YYYY HH:mm:ss',
 | 
						||
        monthBeforeYear: true,
 | 
						||
      },
 | 
						||
      timePickerLocale: {
 | 
						||
        placeholder: 'Избор на час',
 | 
						||
      },
 | 
						||
    };
 | 
						||
    const birthday = moment('2000-01-01', 'YYYY-MM-DD');
 | 
						||
    const wrapper = mount({
 | 
						||
      render() {
 | 
						||
        return <DatePicker open locale={locale} value={birthday} />;
 | 
						||
      },
 | 
						||
    });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      expect(wrapper.html()).toMatchSnapshot();
 | 
						||
    });
 | 
						||
  });
 | 
						||
 | 
						||
  // Fix https://github.com/ant-design/ant-design/issues/8885
 | 
						||
  it('control value after panel closed', async () => {
 | 
						||
    const Test = {
 | 
						||
      data() {
 | 
						||
        return {
 | 
						||
          cleared: false,
 | 
						||
          value: moment(),
 | 
						||
        };
 | 
						||
      },
 | 
						||
      methods: {
 | 
						||
        onChange(value) {
 | 
						||
          let cleared = this.cleared;
 | 
						||
 | 
						||
          if (cleared) {
 | 
						||
            value = moment(moment(value).format('YYYY-MM-DD 12:12:12'));
 | 
						||
            cleared = false;
 | 
						||
          }
 | 
						||
 | 
						||
          if (!value) {
 | 
						||
            cleared = true;
 | 
						||
          }
 | 
						||
          this.value = value;
 | 
						||
          this.cleared = cleared;
 | 
						||
        },
 | 
						||
      },
 | 
						||
      render() {
 | 
						||
        return (
 | 
						||
          <DatePicker
 | 
						||
            showTime
 | 
						||
            value={this.value}
 | 
						||
            format="YYYY-MM-DD HH:mm:ss"
 | 
						||
            onChange={this.onChange}
 | 
						||
          />
 | 
						||
        );
 | 
						||
      },
 | 
						||
    };
 | 
						||
 | 
						||
    const wrapper = mount(Test, { sync: false, attachTo: 'body' });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      // clear input
 | 
						||
      clearInput(wrapper);
 | 
						||
    });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      openPanel(wrapper);
 | 
						||
    });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      // selectDateFromBody时(点击其它元素)没有触发input blur事件,强制执行blur
 | 
						||
      $$('.ant-calendar-input')[0].blur();
 | 
						||
    }, 0);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      selectDateFromBody(moment('2016-11-13'));
 | 
						||
    }, 0);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      expect($$('.ant-calendar-input')[0].value).toBe('2016-11-13 12:12:12');
 | 
						||
    });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      selectDateFromBody(moment('2016-11-14'));
 | 
						||
    });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      expect($$('.ant-calendar-input')[0].value).toBe('2016-11-14 12:12:12');
 | 
						||
    });
 | 
						||
  });
 | 
						||
 | 
						||
  it('triggers onChange only when date was selected', async () => {
 | 
						||
    const handleChange = jest.fn();
 | 
						||
    const wrapper = mount(
 | 
						||
      {
 | 
						||
        render() {
 | 
						||
          return <DatePicker onChange={handleChange} />;
 | 
						||
        },
 | 
						||
      },
 | 
						||
      { sync: false, attachTo: 'body' },
 | 
						||
    );
 | 
						||
    await asyncExpect(() => {
 | 
						||
      openPanel(wrapper);
 | 
						||
    }, 0);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      nextYear();
 | 
						||
    }, 1000);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      expect(handleChange).not.toBeCalled();
 | 
						||
    }, 0);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      nextMonth();
 | 
						||
    }, 0);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      expect(handleChange).not.toBeCalled();
 | 
						||
    });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      selectDateFromBody(moment('2017-12-22'));
 | 
						||
    }, 1000);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      expect(handleChange).toBeCalled();
 | 
						||
    }, 0);
 | 
						||
  });
 | 
						||
 | 
						||
  it('clear input', async () => {
 | 
						||
    const wrapper = mount(DatePicker, { sync: false, attachTo: 'body' });
 | 
						||
    await asyncExpect(() => {
 | 
						||
      openPanel(wrapper);
 | 
						||
    }, 0);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      selectDateFromBody(moment('2016-11-23'));
 | 
						||
    }, 100);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      clearInput(wrapper);
 | 
						||
    }, 1000);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      openPanel(wrapper);
 | 
						||
    }, 0);
 | 
						||
    await asyncExpect(() => {
 | 
						||
      expect(hasSelected(wrapper, moment('2016-11-22'))).toBe(true);
 | 
						||
    }, 0);
 | 
						||
  });
 | 
						||
});
 |