/* eslint-disable no-unused-expressions */ import { shallow, mount } from 'enzyme'; import { AddCommentForm } from './add_comment_form.component'; import generateUserData from '../support/generate_user_data'; import generateUserGroupData from '../support/generate_user_group_data'; describe("", () => { let session = null; const commentable = { id: "1", type: "Decidim::DummyResource" }; const addCommentStub = () => { return null; } beforeEach(() => { session = { user: generateUserData(), verifiedUserGroups: [] }; }); it("should render a div with class add-comment", () => { const wrapper = shallow(); expect(wrapper.find('div.add-comment')).to.present(); }); it("should have a reference to body textarea", () => { const wrapper = mount(); expect(wrapper.instance().bodyTextArea).to.be.ok; }); it("should initialize with a state property disabled as true", () => { const wrapper = mount(); expect(wrapper).to.have.state('disabled', true); }); it("should have a default prop showTitle as true", () => { const wrapper = mount(); expect(wrapper).to.have.prop('showTitle').equal(true); }); it("should not render the title if prop showTitle is false", () => { const wrapper = shallow(); expect(wrapper.find('h5.section-heading')).not.to.be.present(); }); it("should have a default prop submitButtonClassName as 'button button--sc'", () => { const wrapper = mount(); expect(wrapper).to.have.prop('submitButtonClassName').equal('button button--sc'); }); it("should have a default prop maxLength of 1000", () => { const wrapper = mount(); expect(wrapper).to.have.prop('maxLength').equal(1000); }); it("should use prop submitButtonClassName as a className prop for submit button", () => { const wrapper = shallow(); expect(wrapper.find('input[type="submit"]')).to.have.className('button'); expect(wrapper.find('input[type="submit"]')).to.have.className('small'); expect(wrapper.find('input[type="submit"]')).to.have.className('hollow'); }); it("should enable the submit button if textarea is not blank", () => { const wrapper = mount(); wrapper.find('textarea').simulate('change', { target: { value: 'This is a comment' } }); expect(wrapper.find('input[type="submit"]')).not.to.be.disabled(); }); it("should disable the submit button if textarea is blank", () => { const wrapper = mount(); wrapper.find('textarea').simulate('change', { target: { value: 'This will be deleted' } }); wrapper.find('textarea').simulate('change', { target: { value: '' } }); expect(wrapper.find('input[type="submit"]')).to.be.disabled(); }); it("should not render a div with class 'opinion-toggle'", () => { const wrapper = shallow(); expect(wrapper.find('.opinion-toggle')).not.to.be.present(); }); describe("submitting the form", () => { let addComment = null; let onCommentAdded = null; let wrapper = null; let message = null; beforeEach(() => { addComment = sinon.spy(); onCommentAdded = sinon.spy(); wrapper = mount(); message = 'This will be submitted'; wrapper.instance().bodyTextArea.value = message; }); it("should call addComment prop with the textarea value and state property alignment", () => { wrapper.find('form').simulate('submit'); expect(addComment).to.calledWith({ body: message, alignment: 0 }); }); it("should reset textarea", () => { wrapper.find('form').simulate('submit'); expect(wrapper.find('textarea')).to.have.value(''); }); it("should prevent default form submission", () => { const preventDefault = sinon.spy(); wrapper.find('form').simulate('submit', { preventDefault }); expect(preventDefault).to.have.been.called; }); it("should call the prop onCommentAdded function", () => { wrapper.find('form').simulate('submit'); expect(onCommentAdded).to.have.been.called; }); }); it("should initialize state with a property alignment and value 0", () => { const wrapper = shallow(); expect(wrapper).to.have.state('alignment').equal(0); }); describe("when receiving an optional prop arguable with value true", () => { it("should render a div with class 'opinion-toggle'", () => { const wrapper = shallow(); expect(wrapper.find('.opinion-toggle')).to.be.present(); }); it("should set state alignment to 1 if user clicks ok button and change its class", () => { const wrapper = shallow(); wrapper.find('.opinion-toggle--ok').simulate('click'); expect(wrapper.find('.opinion-toggle--ok')).to.have.className('is-active'); expect(wrapper).to.have.state('alignment').equal(1); }); it("should set state alignment to -11 if user clicks ko button and change its class", () => { const wrapper = shallow(); wrapper.find('.opinion-toggle--ko').simulate('click'); expect(wrapper.find('.opinion-toggle--ko')).to.have.className('is-active'); expect(wrapper).to.have.state('alignment').equal(-1); }); describe("submitting the form", () => { let addComment = null; let wrapper = null; let message = null; beforeEach(() => { addComment = sinon.spy(); wrapper = mount(); message = 'This will be submitted'; wrapper.instance().bodyTextArea.value = message; }); it("should call addComment prop with the state's property alignment", () => { wrapper.find('button.opinion-toggle--ko').simulate('click'); wrapper.find('form').simulate('submit'); expect(addComment).to.calledWith({ body: message, alignment: -1 }); }); it("should reset the state to its initial state", () => { wrapper.find('button.opinion-toggle--ok').simulate('click'); wrapper.find('form').simulate('submit'); expect(wrapper).to.have.state('alignment').eq(0); }); }); }); describe("when user groups are greater than 0", () => { beforeEach(() => { session.verifiedUserGroups = [ generateUserGroupData(), generateUserGroupData() ]; }); it("should have a reference to user_group_id select", () => { const wrapper = mount(); expect(wrapper.instance().userGroupIdSelect).to.be.ok; }); it("should render a select with option tags for each verified user group", () => { const wrapper = mount(); expect(wrapper.find('select')).to.have.exactly(3).descendants('option'); }); describe("submitting the form", () => { let addComment = null; let wrapper = null; let message = null; let userGroupId = null; beforeEach(() => { addComment = sinon.spy(); wrapper = mount(); message = 'This will be submitted'; userGroupId = session.verifiedUserGroups[1].id; wrapper.instance().bodyTextArea.value = message; wrapper.instance().userGroupIdSelect.value = userGroupId; }); it("should call addComment prop with the body textarea, alignment and user_group_id select values", () => { wrapper.find('form').simulate('submit'); expect(addComment).to.calledWith({ body: message, alignment: 0, userGroupId }); }); describe("when user_group_id is blank", () => { beforeEach(() => { wrapper.instance().userGroupIdSelect.value = ''; }); it("should call addComment prop with the body textarea and alignment", () => { wrapper.find('form').simulate('submit'); expect(addComment).to.calledWith({ body: message, alignment: 0 }); }); }); }); }); describe("when session is null", () => { beforeEach(() => { session = null; }); it("display a message to sign in or sign up", () => { const wrapper = mount(); expect(wrapper.find('span')).to.include.text("sign up"); }); }); });