116 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
import { mount } from '@vue/test-utils';
 | 
						|
import dayjs from 'dayjs';
 | 
						|
import { asyncExpect } from '../../../tests/utils';
 | 
						|
import Comment from '..';
 | 
						|
import List from '../../list';
 | 
						|
import Form from '../../form';
 | 
						|
import Button from '../../button';
 | 
						|
import Input from '../../input';
 | 
						|
import mountTest from '../../../tests/shared/mountTest';
 | 
						|
import relativeTime from 'dayjs/plugin/relativeTime';
 | 
						|
dayjs.extend(relativeTime);
 | 
						|
 | 
						|
const CommentTest = {
 | 
						|
  data() {
 | 
						|
    return {
 | 
						|
      comments: [],
 | 
						|
      submitting: false,
 | 
						|
      value: '',
 | 
						|
      dayjs,
 | 
						|
    };
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    handleSubmit() {
 | 
						|
      if (!this.value) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      this.submitting = true;
 | 
						|
 | 
						|
      setTimeout(() => {
 | 
						|
        this.submitting = false;
 | 
						|
        this.comments = [
 | 
						|
          {
 | 
						|
            author: 'Han Solo',
 | 
						|
            avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
 | 
						|
            content: this.value,
 | 
						|
            datetime: dayjs().fromNow(),
 | 
						|
          },
 | 
						|
          ...this.comments,
 | 
						|
        ];
 | 
						|
        this.value = '';
 | 
						|
      }, 1000);
 | 
						|
    },
 | 
						|
    handleChange(e) {
 | 
						|
      this.value = e.target.value;
 | 
						|
    },
 | 
						|
  },
 | 
						|
  render() {
 | 
						|
    return (
 | 
						|
      <div>
 | 
						|
        {this.comments.length ? (
 | 
						|
          <List
 | 
						|
            dataSource={this.comments}
 | 
						|
            header={`${this.comments.length} ${this.comments.length > 1 ? 'replies' : 'reply'}`}
 | 
						|
            itemLayout="horizontal"
 | 
						|
            renderItem={({ item }) => {
 | 
						|
              return (
 | 
						|
                <List.Item>
 | 
						|
                  <Comment
 | 
						|
                    author={item.author}
 | 
						|
                    avatar={item.avatar}
 | 
						|
                    content={item.content}
 | 
						|
                    datetime={item.datetime}
 | 
						|
                  />
 | 
						|
                </List.Item>
 | 
						|
              );
 | 
						|
            }}
 | 
						|
          />
 | 
						|
        ) : null}
 | 
						|
        <Comment
 | 
						|
          vSlots={{
 | 
						|
            content: () => (
 | 
						|
              <div>
 | 
						|
                <Form.Item>
 | 
						|
                  <Input.TextArea rows={4} onChange={this.handleChange} value={this.value} />
 | 
						|
                </Form.Item>
 | 
						|
                <Form.Item>
 | 
						|
                  <Button
 | 
						|
                    htmlType="submit"
 | 
						|
                    loading={this.submitting}
 | 
						|
                    onClick={this.handleSubmit}
 | 
						|
                    type="primary"
 | 
						|
                  >
 | 
						|
                    Add Comment
 | 
						|
                  </Button>
 | 
						|
                </Form.Item>
 | 
						|
              </div>
 | 
						|
            ),
 | 
						|
          }}
 | 
						|
        ></Comment>
 | 
						|
      </div>
 | 
						|
    );
 | 
						|
  },
 | 
						|
};
 | 
						|
 | 
						|
describe('Comment', () => {
 | 
						|
  mountTest(Comment);
 | 
						|
  it('Comment can be used as editor, user can customize the editor component.', async () => {
 | 
						|
    const wrapper = mount(CommentTest, {
 | 
						|
      sync: false,
 | 
						|
    });
 | 
						|
    await asyncExpect(() => {
 | 
						|
      wrapper.find('textarea').element.value = '222';
 | 
						|
      wrapper.find('textarea').trigger('input');
 | 
						|
    });
 | 
						|
    await asyncExpect(() => {
 | 
						|
      wrapper.find('.ant-btn').trigger('click');
 | 
						|
    });
 | 
						|
 | 
						|
    await asyncExpect(() => {
 | 
						|
      expect(wrapper.findAll('.ant-list-header')[0].element.innerHTML).toBe('1 reply');
 | 
						|
      expect(wrapper.html()).toMatchSnapshot();
 | 
						|
    }, 2000);
 | 
						|
  });
 | 
						|
});
 |