import {MockedProvider as MockedProviderBase} from '@apollo/client/testing'
import {fireEvent, render, screen, waitFor} from '@testing-library/react'
import {UserListDocument, UserRoleListDocument} from '@wepublish/editor/api'
import {AuthContext} from '@wepublish/ui/editor'
import fetch from 'jest-fetch-mock'
import {BrowserRouter} from 'react-router-dom'
import {UserList} from '../../src/app/routes/users/userList'
import {actWait, sessionWithPermissions} from '../utils'
jest.setMock('node-fetch', fetch)
const MockedProvider = MockedProviderBase as any
const userRoleDocumentQuery = {
request: {
query: UserRoleListDocument,
variables: {take: 200}
},
result: () => {
return {
data: {
userRoles: {
nodes: [
{
__typename: 'UserRole',
id: 'editor',
name: 'editor',
description: 'Description for role 1',
systemRole: false,
permissions: [
{
__typename: 'Permission',
id: 'permissionId1',
description: 'permission description 1',
checked: true,
deprecated: false
},
{
__typename: 'Permission',
id: 'permissionId2',
description: 'permission description 2',
checked: false,
deprecated: false
},
{
__typename: 'Permission',
id: 'permissionId3',
description: 'permission description 3',
checked: false,
deprecated: false
},
{
__typename: 'Permission',
id: 'permissionId4',
description: 'permission description 4',
checked: true,
deprecated: false
}
]
}
],
pageInfo: {
hasNextPage: false,
hasPreviousPage: false,
startCursor: null,
endCursor: null
},
totalCount: 1
}
}
}
}
}
let queryCalled = false
const userListDocumentQuery = {
request: {
query: UserListDocument,
variables: {
filter: {},
take: 10,
skip: 0,
sort: 'CREATED_AT',
order: 'DESCENDING'
},
fetchPolicy: 'network-only'
},
result: jest.fn(() => {
if (queryCalled) {
return {
data: {
users: {
__typename: 'UserConnection',
nodes: [
{
__typename: 'User',
active: true,
createdAt: '2023-02-09T11:43:15.846Z',
modifiedAt: '2023-02-17T16:00:49.988Z',
id: 'some-id',
name: 'test-name',
firstName: 'test-name',
preferredName: 'test-name',
email: 'some-email',
emailVerifiedAt: null,
properties: [],
lastLogin: null,
flair: 'foobar',
address: {
city: null,
company: null,
country: null,
streetAddress: null,
streetAddress2: null,
zipCode: null,
__typename: 'UserAddress'
},
userImage: null,
roles: [
{
__typename: 'UserRole',
id: 'editor',
name: 'Editor',
description: '',
permissions: [],
systemRole: true
}
],
subscriptions: [{}]
},
{
__typename: 'User',
active: true,
createdAt: '2023-02-09T11:43:15.846Z',
modifiedAt: '2023-02-17T16:00:49.988Z',
id: 'some-id-2',
name: 'test-name-2',
firstName: 'test-name-2',
preferredName: 'test-name',
email: 'some-email-2',
emailVerifiedAt: null,
properties: [],
lastLogin: null,
flair: null,
address: {
city: null,
company: null,
country: null,
streetAddress: null,
streetAddress2: null,
zipCode: null,
__typename: 'UserAddress'
},
userImage: null,
roles: [
{
__typename: 'UserRole',
id: 'editor',
name: 'Editor',
description: '',
permissions: [],
systemRole: true
},
{
__typename: 'UserRole',
id: 'admin',
name: 'Admin',
description: '',
permissions: [],
systemRole: true
}
],
subscriptions: [{}]
}
],
pageInfo: {
hasNextPage: false,
hasPreviousPage: false,
startCursor: null,
endCursor: null
},
totalCount: 2
}
}
}
}
queryCalled = true
return {
data: {
users: {
__typename: 'UserConnection',
nodes: [
{
__typename: 'User',
active: true,
createdAt: '2023-02-09T11:43:15.846Z',
modifiedAt: '2023-02-17T16:00:49.988Z',
id: 'some-id',
name: 'test-name',
firstName: 'test-name',
preferredName: 'test-name',
email: 'some-email',
emailVerifiedAt: null,
properties: [],
lastLogin: null,
flair: 'foobar',
address: {
city: null,
company: null,
country: null,
streetAddress: null,
streetAddress2: null,
zipCode: null,
__typename: 'UserAddress'
},
userImage: null,
roles: [
{
__typename: 'UserRole',
id: 'editor',
name: 'Editor',
description: '',
permissions: [],
systemRole: true
}
],
subscriptions: [{}]
},
{
__typename: 'User',
active: true,
createdAt: '2023-02-09T11:43:15.846Z',
modifiedAt: '2023-02-17T16:00:49.988Z',
id: 'some-id-2',
name: 'test-name-2',
firstName: 'test-name-2',
preferredName: 'test-name',
email: 'some-email-2',
emailVerifiedAt: null,
properties: [],
lastLogin: null,
flair: null,
address: {
city: null,
company: null,
country: null,
streetAddress: null,
streetAddress2: null,
zipCode: null,
__typename: 'UserAddress'
},
userImage: null,
roles: [
{
__typename: 'UserRole',
id: 'editor',
name: 'Editor',
description: '',
permissions: [],
systemRole: true
},
{
__typename: 'UserRole',
id: 'admin',
name: 'Admin',
description: '',
permissions: [],
systemRole: true
}
],
subscriptions: [{}]
},
{
__typename: 'User',
active: true,
createdAt: '2023-02-09T11:43:15.846Z',
modifiedAt: '2023-02-17T16:00:49.988Z',
id: 'some-id-2',
name: 'test-name-2',
firstName: 'test-name-2',
preferredName: 'test-name',
email: 'some-email-2',
emailVerifiedAt: null,
properties: [],
lastLogin: null,
flair: 'foobar',
address: {
city: null,
company: null,
country: null,
streetAddress: null,
streetAddress2: null,
zipCode: null,
__typename: 'UserAddress'
},
userImage: null,
roles: [
{
__typename: 'UserRole',
id: 'editor',
name: 'Editor',
description: '',
permissions: [],
systemRole: true
},
{
__typename: 'UserRole',
id: 'admin',
name: 'Admin',
description: '',
permissions: [],
systemRole: true
}
],
subscriptions: [{}]
}
],
pageInfo: {
hasNextPage: false,
hasPreviousPage: false,
startCursor: null,
endCursor: null
},
totalCount: 3
}
}
}
})
}
const userListDocumentQueryError = {
request: {
query: UserListDocument,
variables: {
filter: {},
take: 10,
skip: 0,
sort: 'CREATED_AT',
order: 'DESCENDING'
},
fetchPolicy: 'network-only'
},
error: new Error('An error occurred')
}
describe('User list view', () => {
test('should render successfully', async () => {
const mocks = [userListDocumentQuery]
const {asFragment} = render(
)
await actWait()
expect(asFragment()).toMatchSnapshot()
})
test('refetches data after changing filter', async () => {
const mocks = [userListDocumentQuery, userRoleDocumentQuery]
render(
)
await actWait()
expect(screen.getAllByRole('row')).toHaveLength(3)
fireEvent.click(await screen.findByTestId('userRole-combobox'))
const checkboxLabels = await screen.findAllByRole('checkbox')
await fireEvent.click(checkboxLabels[0])
await waitFor(() => expect(userListDocumentQuery.result).toBeCalledTimes(2))
})
test('does not render list when encounter apollo error', async () => {
const mocks = [userListDocumentQueryError, userRoleDocumentQuery]
const {asFragment, getByText} = render(
)
await actWait()
expect(asFragment()).toMatchSnapshot()
expect(getByText('An error occurred')).not.toBeFalsy()
})
})