mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2025-12-13 07:45:56 +00:00
Ok, so here are multiple issues: 1. In cypher, `NOT NULL` will return `NULL` not `FALSE`. If we want `FALSE` to be set in the database import, we should use `COAELESCE` to find the first not-null value. See: https://neo4j.com/docs/cypher-manual/current/syntax/working-with-null/ https://markhneedham.com/blog/2017/02/22/neo4j-null-values-even-work/ 2. I removed the `disabled` and `deleted` checks on the commented counter. With `neo4j-graphql-js` it is not possible to filter on the join models (at least not without a lot of complexity) for disabled or deleted items. Let's live with the fact that the list of commented posts will include those posts, where the user has deleted his comment or where the user's comment was disabled. It's being displayed as "not available" so I think this is OK for now. 3. De-couple the pagination counters from the "commented", "shouted" etc. counters. It might be that the list of posts is different for different users. E.g. if the user has blocked you, the "posts" list will be empty. The "shouted" or "commented" list will not have the posts of the author. If you are a moderator, the list will include disabled posts. So the counters are not in sync with the actual list coming from the backend. Therefore I implemented "fetch and check if resultSet < pageSize" instead of a global counter.
181 lines
4.8 KiB
JavaScript
181 lines
4.8 KiB
JavaScript
import { config, mount, createLocalVue } from '@vue/test-utils'
|
|
import ProfileSlug from './_slug.vue'
|
|
import Vuex from 'vuex'
|
|
import Styleguide from '@human-connection/styleguide'
|
|
import Filters from '~/plugins/vue-filters'
|
|
import InfiniteScroll from '~/plugins/vue-infinite-scroll'
|
|
|
|
const localVue = createLocalVue()
|
|
|
|
localVue.use(Vuex)
|
|
localVue.use(Styleguide)
|
|
localVue.use(Filters)
|
|
localVue.use(InfiniteScroll)
|
|
localVue.filter('date', d => d)
|
|
|
|
config.stubs['client-only'] = '<span><slot /></span>'
|
|
config.stubs['v-popover'] = '<span><slot /></span>'
|
|
config.stubs['nuxt-link'] = '<span><slot /></span>'
|
|
|
|
describe('ProfileSlug', () => {
|
|
let wrapper
|
|
let Wrapper
|
|
let mocks
|
|
|
|
beforeEach(() => {
|
|
mocks = {
|
|
post: {
|
|
id: 'p23',
|
|
name: 'It is a post',
|
|
},
|
|
$t: jest.fn(),
|
|
// If you're mocking router, then don't use VueRouter with localVue: https://vue-test-utils.vuejs.org/guides/using-with-vue-router.html
|
|
$route: {
|
|
params: {
|
|
id: '4711',
|
|
slug: 'john-doe',
|
|
},
|
|
},
|
|
$router: {
|
|
history: {
|
|
push: jest.fn(),
|
|
},
|
|
},
|
|
$toast: {
|
|
success: jest.fn(),
|
|
error: jest.fn(),
|
|
},
|
|
$apollo: {
|
|
loading: false,
|
|
mutate: jest.fn().mockResolvedValue(),
|
|
},
|
|
}
|
|
})
|
|
|
|
describe('mount', () => {
|
|
Wrapper = () => {
|
|
return mount(ProfileSlug, {
|
|
mocks,
|
|
localVue,
|
|
})
|
|
}
|
|
|
|
describe('given an authenticated user', () => {
|
|
beforeEach(() => {
|
|
mocks.$filters = {
|
|
removeLinks: c => c,
|
|
truncate: a => a,
|
|
}
|
|
mocks.$store = {
|
|
getters: {
|
|
'auth/user': {
|
|
id: 'u23',
|
|
},
|
|
},
|
|
}
|
|
})
|
|
|
|
describe('given a user for the profile', () => {
|
|
beforeEach(() => {
|
|
wrapper = Wrapper()
|
|
wrapper.setData({
|
|
User: [
|
|
{
|
|
id: 'u3',
|
|
name: 'Bob the builder',
|
|
contributionsCount: 6,
|
|
shoutedCount: 7,
|
|
commentedCount: 8,
|
|
},
|
|
],
|
|
})
|
|
})
|
|
|
|
it('displays name of the user', () => {
|
|
expect(wrapper.text()).toContain('Bob the builder')
|
|
})
|
|
|
|
describe('load more button', () => {
|
|
const aPost = {
|
|
title: 'I am a post',
|
|
content: 'This is my content',
|
|
contentExcerpt: 'This is my content',
|
|
}
|
|
|
|
describe('currently no posts available (e.g. after tab switching)', () => {
|
|
beforeEach(() => {
|
|
wrapper.setData({ posts: [], hasMore: false })
|
|
})
|
|
|
|
it('displays no "load more" button', () => {
|
|
expect(wrapper.find('.load-more').exists()).toBe(false)
|
|
})
|
|
|
|
describe('apollo client in `loading` state', () => {
|
|
beforeEach(() => {
|
|
wrapper.vm.$apollo.loading = true
|
|
})
|
|
|
|
it('never displays more than one loading spinner', () => {
|
|
expect(wrapper.findAll('.ds-spinner')).toHaveLength(1)
|
|
})
|
|
|
|
it('displays a loading spinner below the posts list', () => {
|
|
expect(wrapper.find('.user-profile-posts-list .ds-spinner').exists()).toBe(true)
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('pagination returned less posts than available', () => {
|
|
beforeEach(() => {
|
|
const posts = [1, 2, 3, 4, 5].map(id => {
|
|
return {
|
|
...aPost,
|
|
id,
|
|
}
|
|
})
|
|
|
|
wrapper.setData({ posts, hasMore: true })
|
|
})
|
|
|
|
it('displays a "load more" button', () => {
|
|
expect(wrapper.find('.load-more').exists()).toBe(true)
|
|
})
|
|
|
|
describe('apollo client in `loading` state', () => {
|
|
beforeEach(() => {
|
|
wrapper.vm.$apollo.loading = true
|
|
})
|
|
|
|
it('never displays more than one loading spinner', () => {
|
|
expect(wrapper.findAll('.ds-spinner')).toHaveLength(1)
|
|
})
|
|
|
|
it('displays a loading spinner below the posts list', () => {
|
|
expect(wrapper.find('.load-more .ds-spinner').exists()).toBe(true)
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('pagination returned as many posts as available', () => {
|
|
beforeEach(() => {
|
|
const posts = [1, 2, 3, 4, 5, 6].map(id => {
|
|
return {
|
|
...aPost,
|
|
id,
|
|
}
|
|
})
|
|
|
|
wrapper.setData({ posts, hasMore: false })
|
|
})
|
|
|
|
it('displays no "load more" button', () => {
|
|
expect(wrapper.find('.load-more').exists()).toBe(false)
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|