import {MockedProvider as MockedProviderBase} from '@apollo/client/testing'
import {fireEvent, render, screen} from '@testing-library/react'
import {CreateUserDocument, UserDocument, UserRoleListDocument} from '@wepublish/editor/api'
import {AuthContext} from '@wepublish/ui/editor'
import React from 'react'
import {BrowserRouter} from 'react-router-dom'
import snapshotDiff from 'snapshot-diff'
import {UserEditView} from '../../src/app/routes/users/userEditView'
import {actWait, sessionWithPermissions} from '../utils'
const MockedProvider = MockedProviderBase as any
const userRoleListDocumentQuery = {
request: {
query: UserRoleListDocument,
variables: {
take: 200
}
},
result: () => {
return {
data: {
userRoles: {
nodes: [
{
__typename: 'UserRole',
id: 'roleId1',
name: 'Role 1',
description: 'Description for role 1',
systemRole: false,
permissions: []
},
{
__typename: 'UserRole',
id: 'roleId2',
name: 'Role 2',
description: 'Description for role 2',
systemRole: false,
permissions: []
}
],
pageInfo: {
hasNextPage: false,
hasPreviousPage: false,
startCursor: null,
endCursor: null
},
totalCount: 2
}
}
}
}
}
const userDocumentQuery = {
request: {
query: UserDocument,
variables: {
id: 'fakeId3'
}
},
result: () => ({
data: {
user: {
__typename: 'User',
id: 'fakeId3',
firstName: 'Peter',
name: 'Parker',
preferredName: 'Peter Parker',
email: 'peter@parker.com',
flair: 'foobar',
address: null,
active: false,
roles: [
{
__typename: 'UserRole',
id: 'roleId1',
name: 'Role 1',
description: 'Description for role 1',
systemRole: false,
permissions: []
}
],
properties: [],
emailVerifiedAt: null,
lastLogin: null,
createdAt: null,
modifiedAt: null
}
}
})
}
describe('User edit view', () => {
test('should render', async () => {
const mocks = [userRoleListDocumentQuery]
const {asFragment} = render(
)
await actWait()
expect(asFragment()).toMatchSnapshot()
})
test('should render with ID', async () => {
const mocks = [userDocumentQuery, userRoleListDocumentQuery]
const {asFragment} = render(
)
await actWait()
expect(asFragment()).toMatchSnapshot()
})
test('should allow user role to be added', async () => {
const mocks = [userRoleListDocumentQuery]
const {asFragment} = render(
)
await actWait()
const initialRender = asFragment()
fireEvent.click(await screen.findByRole('combobox'))
const checkboxLabels = await screen.findAllByRole('checkbox')
fireEvent.click(checkboxLabels[checkboxLabels.length - 1])
expect(snapshotDiff(initialRender, asFragment())).toMatchSnapshot()
})
test('should allow user role to be removed', async () => {
const mocks = [userDocumentQuery, userRoleListDocumentQuery]
const {asFragment} = render(
)
await actWait()
const initialRender = asFragment()
fireEvent.click(await screen.findByRole('combobox'))
const checkboxLabels = await screen.findAllByRole('checkbox', {checked: false})
fireEvent.click(checkboxLabels[checkboxLabels.length - 1])
expect(snapshotDiff(initialRender, asFragment())).toMatchSnapshot()
})
test('should allow user properties to be added', async () => {
const user = {
name: 'Testing Müller',
email: 'testing@mueller.com',
active: true,
properties: [],
roleIDs: [],
password: 'superSecret'
}
const mocks = [
{
request: {
query: CreateUserDocument,
variables: {
input: {
name: user.name,
firstName: undefined,
preferredName: undefined,
email: user.email,
active: user.active,
properties: user.properties,
roleIDs: user.roleIDs
},
password: user.password
}
},
result: () => ({
data: {
user: {
__typename: 'User',
id: 'fakeId4',
name: user.name,
email: user.email,
roles: user.roleIDs,
active: user.active,
properties: user.properties
}
}
})
},
userRoleListDocumentQuery
]
const {asFragment, getByTestId} = render(
)
await actWait()
const initialRender = asFragment()
const addPropertyButton = getByTestId('addProperty')
const saveButton = getByTestId('saveButton')
fireEvent.click(addPropertyButton)
const keyInput = getByTestId('propertyKey')
const valueInput = getByTestId('propertyValue')
fireEvent.change(keyInput, {
target: {value: 'some key'}
})
fireEvent.change(valueInput, {
target: {value: 'some value'}
})
fireEvent.click(saveButton)
expect(snapshotDiff(initialRender, asFragment())).toMatchSnapshot()
})
test('should allow a new user to be created', async () => {
const user = {
name: 'Testing Müller',
email: 'testing@mueller.com',
active: true,
properties: [],
roleIDs: [],
password: 'superSecret'
}
const mocks = [
{
request: {
query: CreateUserDocument,
variables: {
input: {
name: user.name,
firstName: undefined,
preferredName: undefined,
email: user.email,
active: user.active,
properties: user.properties,
roleIDs: user.roleIDs
},
password: user.password
}
},
result: () => ({
data: {
user: {
__typename: 'User',
id: 'fakeId4',
name: user.name,
email: user.email,
roles: user.roleIDs,
active: user.active,
properties: user.properties
}
}
})
},
userRoleListDocumentQuery
]
const {asFragment, getByLabelText, getByTestId} = render(
)
await actWait()
const initialRender = asFragment()
const nameInput = getByLabelText('userCreateOrEditView.name*')
const emailInput = getByLabelText('userCreateOrEditView.email*')
const passwordInput = getByLabelText('userCreateOrEditView.password*')
const saveButton = getByTestId('saveButton')
fireEvent.change(nameInput, {
target: {value: user.name}
})
fireEvent.change(emailInput, {
target: {value: user.email}
})
fireEvent.change(passwordInput, {
target: {value: user.password}
})
fireEvent.click(saveButton)
expect(snapshotDiff(initialRender, asFragment())).toMatchSnapshot()
})
})