Files
old-tellall/web/src/components/__tests__/IntentDetails.test.js

319 lines
13 KiB
JavaScript

import React from 'react';
import {shallow, mount} from 'enzyme';
import IntentDetails from '../IntentDetails';
import {
QUESTION_MAX_LENGTH,
ANSWER_MAX_LENGTH,
INTENT_NAME_MAX_LENGTH,
INTENT_EXPLANATION_MAX_LENGTH,
ANSWER_TYPE,
} from '../../config/constants';
it ('renders without crashing', () => {
const dummyIntent = {
questions: ['q1', 'q2'],
};
shallow (<IntentDetails selectedIntent={dummyIntent} />);
});
describe('complete testing', () => {
let wrapper;
let newIntent;
beforeEach(()=>{
newIntent = {
intentName: '',
intentExplanation: '',
questions: [''],
answer: '',
answerType: ANSWER_TYPE.PREDEFINED,
externalAnswerSource: '',
};
wrapper = mount(<IntentDetails selectedIntent={newIntent} />);
expect(wrapper.state('intent')).toEqual(newIntent);
});
it ('snapshot', () =>{
expect(wrapper).toMatchSnapshot();
});
it ('renders correctly for new intent input when empty intent is sent', () => {
expect(wrapper.find('TextField').length).toBe(4);
expect(wrapper.find('Button').length).toBe(4);
expect(wrapper.find('TextField').at(0).props().id).toEqual('intent explanation');
expect(wrapper.find('TextField').at(1).props().id).toEqual('intent name');
expect(wrapper.find('TextField').at(2).props().id).toEqual('intent question');
expect(wrapper.find('TextField').at(3).props().id).toEqual('intent answer');
expect(wrapper.find('Button').at(0).props().children).toEqual('add');
expect(wrapper.find('Button').at(1).props().children).toEqual('Answer type');
expect(wrapper.find('Button').at(2).props().children).toEqual('Save');
expect(wrapper.find('Button').at(3).props().children).toEqual('Delete');
});
it ('receives correct props for non empty intent with predefined answer', () => {
newIntent = {
intentName: 'Dummy intent',
intentExplanation: 'Dummy explanation',
questions: ['Dummy question'],
answer: 'dummy answer',
answerType: ANSWER_TYPE.PREDEFINED,
externalAnswerSource: '',
};
wrapper = mount(<IntentDetails selectedIntent={newIntent} />);
expect(wrapper.state('intent')).toEqual(newIntent);
});
it ('receives correct props for non empty intent with external source for answer', () => {
newIntent = {
intentName: 'Dummy intent',
intentExplanation: 'Dummy explanation',
questions: ['Dummy question'],
answer: '',
answerType: ANSWER_TYPE.EXTERNAL_SOURCE_WP_NEWS,
externalAnswerSource: 'http://sarajevotimes.com',
};
wrapper = mount(<IntentDetails selectedIntent={newIntent} />);
expect(wrapper.state('intent')).toEqual(newIntent);
});
it ('adds text field when add button is clicked', () => {
const addButton = wrapper.find('button').at(0);
addButton.simulate('click');
expect(wrapper.find('TextField').length).toBe(5);
addButton.simulate('click');
expect(wrapper.find('TextField').length).toBe(6);
expect(wrapper.find('TextField').at(0).props().id).toEqual('intent explanation');
expect(wrapper.find('TextField').at(1).props().id).toEqual('intent name');
expect(wrapper.find('TextField').at(2).props().id).toEqual('intent question');
expect(wrapper.find('TextField').at(3).props().id).toEqual('intent question');
expect(wrapper.find('TextField').at(4).props().id).toEqual('intent question');
expect(wrapper.find('TextField').at(5).props().id).toEqual('intent answer');
expect(wrapper.state('intent').questions.length).toBe(3);
});
it ('removes correct text field when delete button on text field is clicked', () => {
const addButton = wrapper.find('button').at(0);
addButton.simulate('click');
addButton.simulate('click');
let firstQuestionTextField = wrapper.find('TextField').at(2);
let secondQuestionTextField = wrapper.find('TextField').at(3);
let thirdQuestionTextField = wrapper.find('TextField').at(4);
firstQuestionTextField.instance().props.onChange('first question');
secondQuestionTextField.instance().props.onChange('second question');
thirdQuestionTextField.instance().props.onChange('third question');
expect(firstQuestionTextField.instance().value).toEqual('first question');
expect(secondQuestionTextField.instance().value).toEqual('second question');
expect(thirdQuestionTextField.instance().value).toEqual('third question');
expect(wrapper.state('intent').questions.length).toBe(3);
const rightIcon = secondQuestionTextField.props().rightIcon;
rightIcon.props.onClick(secondQuestionTextField.props().key);
expect(wrapper.state('intent').questions.length).toBe(2);
expect(secondQuestionTextField.instance().value).toEqual('third question');
expect(thirdQuestionTextField.instance()._field._field).toBeNull();
});
it ('does not remove text field when it is only one left', () => {
let firstQuestionTextField = wrapper.find('TextField').at(2);
firstQuestionTextField.instance().props.onChange('first question');
expect(firstQuestionTextField.props().id).toEqual('intent question');
expect(wrapper.state('intent').questions.length).toBe(1);
const rightIcon = firstQuestionTextField.props().rightIcon;
rightIcon.props.onClick(firstQuestionTextField.props().key);
expect(wrapper.state('intent').questions.length).toBe(1);
expect(firstQuestionTextField.instance().value).toEqual('first question');
});
it ('accepts text without special characters for intent explanation', () => {
let explanationTextField = wrapper.find('TextField').at(0);
let validExplanationText = 'to get latest news, say ';
explanationTextField.instance().props.onChange(validExplanationText);
expect(wrapper.state('intent').intentExplanation).toEqual(validExplanationText);
expect(explanationTextField.instance().value).toEqual(validExplanationText);
});
it ('does not accept text with special characters for intent explanation', () => {
let explanationTextField = wrapper.find('TextField').at(0);
let invalidExplanationText = '554to get latest news, say #$ ';
explanationTextField.instance().props.onChange(invalidExplanationText);
expect(wrapper.state('intent').intentExplanation).toEqual('');
expect(explanationTextField.instance().value).toEqual('');
});
it ('does not accept too long text for intent explanation', () => {
let explanationTextField = wrapper.find('TextField').at(0);
let invalidExplanationText = new Array(INTENT_EXPLANATION_MAX_LENGTH + 10).join('A');
explanationTextField.instance().props.onChange(invalidExplanationText);
expect(wrapper.state('intent').intentExplanation).toEqual('');
expect(explanationTextField.instance().value).toEqual('');
});
it ('accepts text without special characters for intent name', () => {
let intentNameTextField = wrapper.find('TextField').at(1);
let validIntentNameText = 'intentName';
intentNameTextField.instance().props.onChange(validIntentNameText);
expect(wrapper.state('intent').intentName).toEqual(validIntentNameText);
expect(intentNameTextField.instance().value).toEqual(validIntentNameText);
});
it ('does not accept text with speces characters for intent name', () => {
let intentNameTextField = wrapper.find('TextField').at(1);
let invalidIntentNameText = 'intentName with space';
intentNameTextField.instance().props.onChange(invalidIntentNameText);
expect(wrapper.state('intent').intentName).toEqual('');
expect(intentNameTextField.instance().value).toEqual('');
});
it ('does not accept text with special characters for intent name', () => {
let intentNameTextField = wrapper.find('TextField').at(1);
let invalidIntentNameText = 'intentName23!';
intentNameTextField.instance().props.onChange(invalidIntentNameText);
expect(wrapper.state('intent').intentName).toEqual('');
expect(intentNameTextField.instance().value).toEqual('');
});
it ('does not accept too long text for intent name', () => {
let intentNameTextField = wrapper.find('TextField').at(1);
let invalidIntentNameText = new Array(INTENT_NAME_MAX_LENGTH + 10).join('A');
intentNameTextField.instance().props.onChange(invalidIntentNameText);
expect(wrapper.state('intent').intentName).toEqual('');
expect(intentNameTextField.instance().value).toEqual('');
});
it ('accepts text without special characters for question text', () => {
let questionTextField = wrapper.find('TextField').at(2);
let validQuestionText = 'read me latest news'
questionTextField.instance().props.onChange(validQuestionText);
expect(wrapper.state('intent').questions).toEqual([validQuestionText]);
expect(questionTextField.instance().value).toEqual(validQuestionText);
});
it ('does not accept text with special characters for question text', () => {
let questionTextField = wrapper.find('TextField').at(2);
let invalidQuestionText = 'read m3 1at35t news #'
questionTextField.instance().props.onChange(invalidQuestionText);
expect(wrapper.state('intent').questions).toEqual(['']);
expect(questionTextField.instance().value).toEqual('');
});
it ('does not accept too long text for question text', () => {
let questionTextField = wrapper.find('TextField').at(2);
let invalidQuestionText = new Array(QUESTION_MAX_LENGTH + 10).join('A');
questionTextField.instance().props.onChange(invalidQuestionText);
expect(wrapper.state('intent').questions).toEqual(['']);
expect(questionTextField.instance().value).toEqual('');
});
it ('accepts text without special characters for answer text', () => {
let answerTextField = wrapper.find('TextField').at(3);
let validAnswerText = 'this is valid answer.'
answerTextField.instance().props.onChange(validAnswerText);
expect(wrapper.state('intent').answer).toEqual(validAnswerText);
expect(answerTextField.instance().value).toEqual(validAnswerText);
});
it ('does not accept text with special characters for answer text', () => {
let answerTextField = wrapper.find('TextField').at(3);
let invalidAnswerText = 'this is invalid answer.0123'
answerTextField.instance().props.onChange(invalidAnswerText);
expect(wrapper.state('intent').answer).toEqual('');
expect(answerTextField.instance().value).toEqual('');
});
it ('does not accept too long text for answer text', () => {
let answerTextField = wrapper.find('TextField').at(3);
let invalidAnswerText = new Array(ANSWER_MAX_LENGTH + 10).join('A');
answerTextField.instance().props.onChange(invalidAnswerText);
expect(wrapper.state('intent').answer).toEqual('');
expect(answerTextField.instance().value).toEqual('');
});
it ('accepts text for external source as answer', () => {
newIntent = {
intentName: '',
intentExplanation: '',
questions: [''],
answer: '',
answerType: ANSWER_TYPE.EXTERNAL_SOURCE_WP_NEWS,
externalAnswerSource: '',
};
wrapper = mount(<IntentDetails selectedIntent={newIntent} />);
let answerTextField = wrapper.find('TextField').at(3);
let validAnswerText = 'http://sarajevotimes.com'
answerTextField.instance().props.onChange(validAnswerText);
expect(wrapper.state('intent').externalAnswerSource).toEqual(validAnswerText);
expect(answerTextField.instance().value).toEqual(validAnswerText);
});
it ('does not accept too long text for external source as answer', () => {
newIntent = {
intentName: '',
intentExplanation: '',
questions: [''],
answer: '',
answerType: ANSWER_TYPE.EXTERNAL_SOURCE_WP_NEWS,
externalAnswerSource: '',
};
wrapper = mount(<IntentDetails selectedIntent={newIntent} />);
let answerTextField = wrapper.find('TextField').at(3);
let invalidAnswerText = new Array(ANSWER_MAX_LENGTH + 10).join('A');
answerTextField.instance().props.onChange(invalidAnswerText);
expect(wrapper.state('intent').answer).toEqual('');
expect(answerTextField.instance().value).toEqual('');
});
it ('calls function with correct data on save button click', () => {
newIntent = {
intentName: 'Dummy intent',
intentExplanation: 'Dummy explanation',
questions: ['Dummy question'],
answer: 'Dummy answer',
answerType: ANSWER_TYPE.PREDEFINED,
externalAnswerSource: '',
};
const onSaveFunction = jest.fn();
wrapper = mount(<IntentDetails selectedIntent={newIntent} onSaveIntentClick={onSaveFunction} />);
wrapper.find('Button').at(2).simulate('click');
expect(onSaveFunction).toBeCalledWith(newIntent);
});
it ('calls function with correct data on delete button click', () => {
newIntent = {
intentName: 'Dummy intent',
intentExplanation: 'Dummy explanation',
questions: ['Dummy question'],
answer: 'Dummy answer',
answerType: ANSWER_TYPE.PREDEFINED,
externalAnswerSource: '',
};
const onSaveFunction = jest.fn();
wrapper = mount(<IntentDetails selectedIntent={newIntent} onDeleteIntentClick={onSaveFunction} />);
wrapper.find('Button').at(3).simulate('click');
expect(onSaveFunction).toBeCalledWith(newIntent);
});
});