293 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import { mount } from '@vue/test-utils';
 | ||
| import { h } from 'vue';
 | ||
| import MockDate from 'mockdate';
 | ||
| import Descriptions from '..';
 | ||
| import { resetWarned } from '../../_util/warning';
 | ||
| import { asyncExpect } from '../../../tests/utils';
 | ||
| 
 | ||
| describe('Descriptions', () => {
 | ||
|   const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
 | ||
| 
 | ||
|   afterEach(() => {
 | ||
|     MockDate.reset();
 | ||
|     errorSpy.mockReset();
 | ||
|   });
 | ||
| 
 | ||
|   afterAll(() => {
 | ||
|     errorSpy.mockRestore();
 | ||
|   });
 | ||
| 
 | ||
|   it('when typeof column is object', async () => {
 | ||
|     const wrapper = mount(
 | ||
|       {
 | ||
|         render() {
 | ||
|           return (
 | ||
|             <Descriptions ref="descriptions" column={{ xs: 8, sm: 16, md: 24 }}>
 | ||
|               <Descriptions.Item label="Product">Cloud Database</Descriptions.Item>
 | ||
|               <Descriptions.Item label="Billing">Prepaid</Descriptions.Item>
 | ||
|               <Descriptions.Item label="time">18:00:00</Descriptions.Item>
 | ||
|               <Descriptions.Item label="Amount">$80.00</Descriptions.Item>
 | ||
|             </Descriptions>
 | ||
|           );
 | ||
|         },
 | ||
|       },
 | ||
|       { sync: false, attachTo: 'body' },
 | ||
|     );
 | ||
|     await asyncExpect(() => {
 | ||
|       expect(
 | ||
|         wrapper.findAll('td').reduce((total, td) => total + parseInt(td.attributes().colspan), 0),
 | ||
|       ).toBe(8);
 | ||
|     }, 100);
 | ||
|     wrapper.unmount();
 | ||
|   });
 | ||
| 
 | ||
|   it('column is number', () => {
 | ||
|     // eslint-disable-next-line global-require
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions column={3}>
 | ||
|             <Descriptions.Item label="Product">Cloud Database</Descriptions.Item>
 | ||
|             <Descriptions.Item label="Billing">Prepaid</Descriptions.Item>
 | ||
|             <Descriptions.Item label="time">18:00:00</Descriptions.Item>
 | ||
|             <Descriptions.Item label="Amount">$80.00</Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
|     expect(wrapper.html()).toMatchSnapshot();
 | ||
|     wrapper.unmount();
 | ||
|   });
 | ||
| 
 | ||
|   it('warning if ecceed the row span', () => {
 | ||
|     resetWarned();
 | ||
| 
 | ||
|     mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions column={3}>
 | ||
|             <Descriptions.Item label="Product" span={2}>
 | ||
|               Cloud Database
 | ||
|             </Descriptions.Item>
 | ||
|             <Descriptions.Item label="Billing" span={2}>
 | ||
|               Prepaid
 | ||
|             </Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
|     expect(errorSpy).toHaveBeenCalledWith(
 | ||
|       'Warning: [antdv: Descriptions] Sum of column `span` in a line not match `column` of Descriptions.',
 | ||
|     );
 | ||
|   });
 | ||
| 
 | ||
|   it('when item is rendered conditionally', () => {
 | ||
|     const hasDiscount = false;
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions>
 | ||
|             <Descriptions.Item label="Product">Cloud Database</Descriptions.Item>
 | ||
|             <Descriptions.Item label="Billing">Prepaid</Descriptions.Item>
 | ||
|             <Descriptions.Item label="time">18:00:00</Descriptions.Item>
 | ||
|             <Descriptions.Item label="Amount">$80.00</Descriptions.Item>
 | ||
|             {hasDiscount && <Descriptions.Item label="Discount">$20.00</Descriptions.Item>}
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
|     expect(wrapper.html()).toMatchSnapshot();
 | ||
|     wrapper.unmount();
 | ||
|   });
 | ||
| 
 | ||
|   it('vertical layout', () => {
 | ||
|     // eslint-disable-next-line global-require
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions layout="vertical">
 | ||
|             <Descriptions.Item label="Product">Cloud Database</Descriptions.Item>
 | ||
|             <Descriptions.Item label="Billing">Prepaid</Descriptions.Item>
 | ||
|             <Descriptions.Item label="time">18:00:00</Descriptions.Item>
 | ||
|             <Descriptions.Item label="Amount">$80.00</Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
|     expect(wrapper.html()).toMatchSnapshot();
 | ||
|     wrapper.unmount();
 | ||
|   });
 | ||
| 
 | ||
|   it('Descriptions.Item support className', () => {
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions>
 | ||
|             <Descriptions.Item label="Product" class="my-class">
 | ||
|               Cloud Database
 | ||
|             </Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
|     expect(wrapper.html()).toMatchSnapshot();
 | ||
|   });
 | ||
| 
 | ||
|   it('Descriptions support colon', () => {
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions colon={false}>
 | ||
|             <Descriptions.Item label="Product">Cloud Database</Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
|     expect(wrapper.html()).toMatchSnapshot();
 | ||
|   });
 | ||
| 
 | ||
|   it('Descriptions support style', () => {
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions style={{ backgroundColor: '#e8e8e8' }}>
 | ||
|             <Descriptions.Item>Cloud Database</Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
|     expect(wrapper.html()).toMatchSnapshot();
 | ||
|   });
 | ||
| 
 | ||
|   it('when max-width: 575pxīŧcolumn=1', async () => {
 | ||
|     // eslint-disable-next-line global-require
 | ||
|     const wrapper = mount(
 | ||
|       {
 | ||
|         render() {
 | ||
|           return (
 | ||
|             <Descriptions>
 | ||
|               <Descriptions.Item label="Product">Cloud Database</Descriptions.Item>
 | ||
|               <Descriptions.Item label="Billing">Prepaid</Descriptions.Item>
 | ||
|               <Descriptions.Item label="time">18:00:00</Descriptions.Item>
 | ||
|               <Descriptions.Item label="Amount">$80.00</Descriptions.Item>
 | ||
|               <Descriptions.Item>No-Label</Descriptions.Item>
 | ||
|             </Descriptions>
 | ||
|           );
 | ||
|         },
 | ||
|       },
 | ||
|       { sync: false, attachTo: 'body' },
 | ||
|     );
 | ||
|     await asyncExpect(() => {
 | ||
|       expect(wrapper.findAll('tr')).toHaveLength(5);
 | ||
|       expect(wrapper.findAll('.ant-descriptions-item-label')).toHaveLength(4);
 | ||
|     });
 | ||
| 
 | ||
|     wrapper.unmount();
 | ||
|   });
 | ||
| 
 | ||
|   it('when max-width: 575pxīŧcolumn=2', async () => {
 | ||
|     const wrapper = mount(
 | ||
|       {
 | ||
|         render() {
 | ||
|           return (
 | ||
|             <Descriptions column={{ xs: 2 }}>
 | ||
|               <Descriptions.Item label="Product">Cloud Database</Descriptions.Item>
 | ||
|               <Descriptions.Item label="Billing">Prepaid</Descriptions.Item>
 | ||
|               <Descriptions.Item label="time">18:00:00</Descriptions.Item>
 | ||
|               <Descriptions.Item label="Amount">$80.00</Descriptions.Item>
 | ||
|             </Descriptions>
 | ||
|           );
 | ||
|         },
 | ||
|       },
 | ||
|       { sync: false, attachTo: 'body' },
 | ||
|     );
 | ||
|     await asyncExpect(() => {
 | ||
|       expect(wrapper.findAll('tr')).toHaveLength(2);
 | ||
|     });
 | ||
|     wrapper.unmount();
 | ||
|   });
 | ||
| 
 | ||
|   it('columns 5 with customize', () => {
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions layout="vertical" column={4}>
 | ||
|             {/* 1 1 1 1 */}
 | ||
|             <Descriptions.Item label="bamboo">bamboo</Descriptions.Item>
 | ||
|             <Descriptions.Item label="bamboo">bamboo</Descriptions.Item>
 | ||
|             <Descriptions.Item label="bamboo">bamboo</Descriptions.Item>
 | ||
|             <Descriptions.Item label="bamboo">bamboo</Descriptions.Item>
 | ||
|             {/* 2 2 */}
 | ||
|             <Descriptions.Item label="bamboo" span={2}>
 | ||
|               bamboo
 | ||
|             </Descriptions.Item>
 | ||
|             <Descriptions.Item label="bamboo" span={2}>
 | ||
|               bamboo
 | ||
|             </Descriptions.Item>
 | ||
|             {/* 3 1 */}
 | ||
|             <Descriptions.Item label="bamboo" span={3}>
 | ||
|               bamboo
 | ||
|             </Descriptions.Item>
 | ||
|             <Descriptions.Item label="bamboo">bamboo</Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
| 
 | ||
|     function matchSpan(rowIndex, spans) {
 | ||
|       const tr = wrapper.findAll('tr')[rowIndex];
 | ||
|       const tds = tr.findAll('th');
 | ||
|       expect(tds.length).toEqual(spans.length);
 | ||
|       tds.forEach((td, index) => {
 | ||
|         expect(parseInt(td.attributes().colspan)).toEqual(spans[index]);
 | ||
|       });
 | ||
|     }
 | ||
| 
 | ||
|     matchSpan(0, [1, 1, 1, 1]);
 | ||
|     matchSpan(2, [2, 2]);
 | ||
|     matchSpan(4, [3, 1]);
 | ||
|   });
 | ||
| 
 | ||
|   it('number value should render correct', () => {
 | ||
|     const wrapper = mount({
 | ||
|       render() {
 | ||
|         return (
 | ||
|           <Descriptions bordered>
 | ||
|             <Descriptions.Item label={0}>{0}</Descriptions.Item>
 | ||
|           </Descriptions>
 | ||
|         );
 | ||
|       },
 | ||
|     });
 | ||
| 
 | ||
|     expect(wrapper.find('th').classes()).toContain('ant-descriptions-item-label');
 | ||
|     expect(wrapper.find('td').classes()).toContain('ant-descriptions-item-content');
 | ||
|   });
 | ||
| 
 | ||
|   it('Descriptions support extra', async () => {
 | ||
|     const wrapper = mount(Descriptions, {
 | ||
|       props: {
 | ||
|         extra: 'Edit',
 | ||
|       },
 | ||
|       slots: {
 | ||
|         default: h(
 | ||
|           Descriptions.Item,
 | ||
|           {
 | ||
|             label: 'UserName',
 | ||
|           },
 | ||
|           'Zhou Maomao',
 | ||
|         ),
 | ||
|       },
 | ||
|     });
 | ||
| 
 | ||
|     await asyncExpect(() => {
 | ||
|       expect(wrapper.find('.ant-descriptions-extra').exists()).toBe(true);
 | ||
|     });
 | ||
| 
 | ||
|     wrapper.setProps({ extra: undefined });
 | ||
| 
 | ||
|     await asyncExpect(() => {
 | ||
|       expect(wrapper.find('.ant-descriptions-extra').exists()).toBe(false);
 | ||
|     });
 | ||
|   });
 | ||
| });
 |