diff --git a/webapp/components/features/ReportRow/ReportRow.spec.js b/webapp/components/features/ReportRow/ReportRow.spec.js new file mode 100644 index 000000000..ff0d51f5f --- /dev/null +++ b/webapp/components/features/ReportRow/ReportRow.spec.js @@ -0,0 +1,187 @@ +import { config, mount, RouterLinkStub } from '@vue/test-utils' +import Vuex from 'vuex' +import ReportRow from './ReportRow.vue' +import BaseIcon from '~/components/_new/generic/BaseIcon/BaseIcon' +import { reports } from '~/components/features/ReportsList/ReportsList.story.js' + +const localVue = global.localVue + +config.stubs['client-only'] = '' + +describe('ReportRow', () => { + let propsData, mocks, stubs, getters, wrapper + + beforeEach(() => { + propsData = {} + mocks = { + $t: jest.fn(string => string), + } + stubs = { + NuxtLink: RouterLinkStub, + } + getters = { + 'auth/user': () => { + return { slug: 'awesome-user' } + }, + 'auth/isModerator': () => true, + } + }) + + describe('given a report ', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(ReportRow, { propsData, mocks, stubs, localVue, store }) + } + + describe('has not been closed', () => { + let confirmButton + beforeEach(() => { + propsData = { ...propsData, report: reports[1] } + wrapper = Wrapper() + confirmButton = wrapper.find('.ds-button-danger') + }) + + it('renders a confirm button', () => { + expect(confirmButton.exists()).toBe(true) + }) + + it('emits confirm event', () => { + confirmButton.trigger('click') + expect(wrapper.emitted('confirm-report')).toHaveLength(1) + }) + }) + + describe('has been closed', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[2] } + wrapper = Wrapper() + }) + + it('renders a decided text', () => { + const decidedTitle = wrapper + .findAll('.title') + .filter(title => title.text() === 'moderation.reports.decided') + expect(decidedTitle.exists()).toBe(true) + }) + }) + + describe('has not been reviewed', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[1] } + wrapper = Wrapper() + }) + + it('renders its current status', () => { + expect(wrapper.find('.status-line').text()).toEqual('moderation.reports.enabled') + }) + }) + + describe('has been reviewed', () => { + describe('and disabled', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[2] } + wrapper = Wrapper() + }) + it('renders the disabled icon', () => { + expect( + wrapper + .find('.status-line') + .find(BaseIcon) + .props().name, + ).toEqual('eye-slash') + }) + + it('renders its current status', () => { + expect(wrapper.find('.status-line').text()).toEqual('moderation.reports.disabledBy') + }) + }) + + describe('and enabled', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[0] } + wrapper = Wrapper() + }) + it('renders the enabled icon', () => { + expect( + wrapper + .find('.status-line') + .find(BaseIcon) + .props().name, + ).toEqual('eye') + }) + + it('renders its current status', () => { + expect(wrapper.find('.status-line').text()).toEqual('moderation.reports.enabledBy') + }) + + it('renders the moderator who reviewed the resource', () => { + const username = wrapper.find('[data-test="report-reviewer"]') + expect(username.text()).toContain('@moderator') + }) + }) + }) + + describe('concerns a Comment', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[0] } + wrapper = Wrapper() + }) + + it('renders a comments icon', () => { + const commentsIcon = wrapper.find(BaseIcon).props().name + expect(commentsIcon).toEqual('comments') + }) + + it('renders a link to the post, with the comment contentExcerpt', () => { + const postLink = wrapper.find('.title') + expect(postLink.text()).toEqual('@peter-lustig Lorem ipsum dolor sit amet, …') + }) + + it('renders the author', () => { + const userSlug = wrapper.find('[data-test="report-author"]') + expect(userSlug.text()).toContain('@louie') + }) + }) + + describe('concerns a Post', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[1] } + wrapper = Wrapper() + }) + + it('renders a bookmark icon', () => { + const postIcon = wrapper.find(BaseIcon).props().name + expect(postIcon).toEqual('bookmark') + }) + + it('renders a link to the post', () => { + const postLink = wrapper.find('.title') + expect(postLink.text()).toEqual("I'm a bigoted post!") + }) + + it('renders the author', () => { + const username = wrapper.find('[data-test="report-author"]') + expect(username.text()).toContain('@dagobert') + }) + }) + + describe('concerns a User', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[2] } + wrapper = Wrapper() + }) + + it('renders a user icon', () => { + const userIcon = wrapper.find(BaseIcon).props().name + expect(userIcon).toEqual('user') + }) + + it('renders a link to the user profile', () => { + const userLink = wrapper.find('[data-test="report-content"]') + expect(userLink.text()).toContain('@abusive-user') + }) + }) + }) +}) diff --git a/webapp/components/features/ReportRow/ReportRow.vue b/webapp/components/features/ReportRow/ReportRow.vue new file mode 100644 index 000000000..cc81ae018 --- /dev/null +++ b/webapp/components/features/ReportRow/ReportRow.vue @@ -0,0 +1,183 @@ + + + + +