import { mount, shallow } from "enzyme"; import * as $ from "jquery"; import * as React from "react"; import { CommentFragment } from "../support/schema"; import AddCommentForm from "./add_comment_form.component"; import Comment from "./comment.component"; import DownVoteButton from "./down_vote_button.component"; import UpVoteButton from "./up_vote_button.component"; import generateCommentsData from "../support/generate_comments_data"; import generateUserData from "../support/generate_user_data"; import { loadLocaleTranslations } from "../support/load_translations"; describe("", () => { const orderBy = "older"; const rootCommentable = { id: "1", type: "Decidim::DummyResources::DummyResource" }; let comment: CommentFragment; let session: any = null; beforeEach(() => { loadLocaleTranslations("en"); const commentsData = generateCommentsData(1); commentsData[0].comments = generateCommentsData(3); comment = commentsData[0]; session = { user: generateUserData() }; window.DecidimComments = { assets: { "icons.svg": "/assets/icons.svg" } }; window.$ = $; }); it("should render an article with class comment", () => { const wrapper = shallow( ); expect(wrapper.find("article.comment").exists()).toBeTruthy(); }); it("should render a time tag with comment's created at", () => { const wrapper = shallow( ); expect(wrapper.find("time").prop("dateTime")).toEqual(comment.createdAt); }); it("should render author's name in a link with class author__name", () => { const wrapper = shallow( ); expect(wrapper.find("span.author__name").text()).toEqual( comment.author.name ); }); it("should render author's nickname in a link with class author__nickname", () => { const wrapper = shallow( ); expect(wrapper.find("span.author__nickname").text()).toEqual( comment.author.nickname ); }); describe("when the author's account has been deleted", () => { beforeEach(() => { comment.author.deleted = true; }); it("should render 'Deleted participant' inside a badge", () => { const wrapper = shallow( ); expect( wrapper.find("span.label.label--small.label--basic").text() ).toEqual("Deleted participant"); }); }); it("should render author's avatar as a image tag", () => { const wrapper = shallow( ); expect(wrapper.find(".author__avatar img").prop("src")).toEqual( comment.author.avatarUrl ); }); it("should render formatted comment's body on a div with class comment__content", () => { const wrapper = shallow( ); expect(wrapper.find("div.comment__content").html()).toContain( comment.formattedBody ); }); it("should initialize with a state property showReplyForm as false", () => { const wrapper = shallow( ); expect(wrapper.state()).toHaveProperty("showReplyForm", false); }); it("should render a AddCommentForm component with the correct props when clicking the reply button", () => { const wrapper = shallow( ); expect(wrapper.find(AddCommentForm).exists()).toBeFalsy(); wrapper.find("button.comment__reply").simulate("click"); expect(wrapper.find(AddCommentForm).prop("session")).toEqual(session); expect(wrapper.find(AddCommentForm).prop("commentable")).toEqual(comment); expect(wrapper.find(AddCommentForm).prop("showTitle")).toBeFalsy(); expect(wrapper.find(AddCommentForm).prop("submitButtonClassName")).toEqual( "button small hollow" ); }); it("should not render the additional reply button if the parent comment has no comments and isRootcomment", () => { comment.hasComments = false; const wrapper = shallow( ); expect(wrapper.find("div.comment__additionalreply").exists()).toBeFalsy(); }); it("should not render the additional reply button if the parent comment has comments and not isRootcomment", () => { comment.hasComments = true; const wrapper = shallow( ); expect(wrapper.find("div.comment__additionalreply").exists()).toBeFalsy(); }); it("should render the additional reply button if the parent comment has comments and isRootcomment", () => { comment.hasComments = true; const wrapper = shallow( ); expect(wrapper.find("div.comment__additionalreply").exists()).toBeTruthy(); }); it("should render comment's comments as a separate Comment components", () => { const wrapper = shallow( ); wrapper.find(Comment).forEach((node, idx) => { expect(node.prop("comment")).toEqual(comment.comments[idx]); expect(node.prop("session")).toEqual(session); expect(node.prop("articleClassName")).toEqual("comment comment--nested"); expect(node.prop("votable")).toBeTruthy(); }); }); it("should render comment's comments with articleClassName as 'comment comment--nested comment--nested--alt' when articleClassName is 'comment comment--nested'", () => { const wrapper = shallow( ); wrapper.find(Comment).forEach(node => { expect(node.prop("articleClassName")).toEqual( "comment comment--nested comment--nested--alt" ); }); }); it("should have a default prop articleClassName with value 'comment'", () => { const wrapper = mount( ); expect(wrapper.prop("articleClassName")).toEqual("comment"); }); it("should have a default prop isRootComment with value false", () => { const wrapper = mount( ); expect(wrapper.prop("isRootComment")).toBeFalsy(); }); describe("when the comment cannot accept new comments", () => { beforeEach(() => { comment.acceptsNewComments = false; }); it("should not render the reply button", () => { const wrapper = shallow( ); expect(wrapper.find("button.comment__reply").exists()).toBeFalsy(); }); }); describe("when user is not logged in", () => { beforeEach(() => { session = null; }); it("should not render reply button", () => { const wrapper = shallow( ); expect(wrapper.find("button.comment__reply").exists()).toBeFalsy(); }); it("should not render the flag modal", () => { const wrapper = shallow( ); expect(wrapper.find(".flag-modal").exists()).toBeFalsy(); }); }); it("should render a 'in favor' badge if comment's alignment is 1", () => { comment.alignment = 1; const wrapper = shallow( ); expect(wrapper.find("span.alignment.label").text()).toEqual("In favor"); }); it("should render a 'against' badge if comment's alignment is -1", () => { comment.alignment = -1; const wrapper = shallow( ); expect(wrapper.find("span.alert.label").text()).toEqual("Against"); }); it("should render the flag modal", () => { const wrapper = shallow( ); expect(wrapper.find(".flag-modal").exists()).toBeTruthy(); }); describe("when user has already reported the comment", () => { it("should not render the flag form", () => { comment.alreadyReported = true; const wrapper = shallow( ); expect(wrapper.find(".flag-modal form").exists()).toBeFalsy(); }); }); describe("when the comment is votable", () => { it("should render an UpVoteButton component", () => { const wrapper = shallow( ); expect(wrapper.find(UpVoteButton).prop("comment")).toEqual(comment); }); it("should render an DownVoteButton component", () => { const wrapper = shallow( ); expect(wrapper.find(DownVoteButton).prop("comment")).toEqual(comment); }); }); describe("when user is not allowed to comment", () => { beforeEach(() => { comment.userAllowedToComment = false; }); it("should not render reply button", () => { const wrapper = shallow( ); expect(wrapper.find("button.comment__reply").exists()).toBeFalsy(); }); it("should not render the flag modal", () => { const wrapper = shallow( ); expect(wrapper.find(".flag-modal").exists()).toBeFalsy(); }); it("should not render an UpVoteButton component", () => { const wrapper = shallow( ); expect(wrapper.find(".comment__votes--up").exists()).toBeFalsy(); }); it("should not render an DownVoteButton component", () => { const wrapper = shallow( ); expect(wrapper.find(".comment__votes--down").exists()).toBeFalsy(); }); }); });