Follow all suggested users by default when onboarding (#19435)

This commit is contained in:
PJ 2023-05-09 17:04:10 +01:00 committed by GitHub
parent d8ac9e27fb
commit 5933f294e9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 83 additions and 44 deletions

View file

@ -27,7 +27,10 @@ export class FollowUsers extends Component {
})
.then((response) => response.json())
.then((data) => {
this.setState({ users: data });
this.setState({
selectedUsers: data,
users: data,
});
});
const csrfToken = getContentOfToken('csrf-token');

View file

@ -1,5 +1,5 @@
import { h } from 'preact';
import { render } from '@testing-library/preact';
import { render, fireEvent } from '@testing-library/preact';
import fetch from 'jest-fetch-mock';
import '@testing-library/jest-dom';
@ -80,83 +80,92 @@ describe('FollowUsers', () => {
expect(user3).toBeInTheDocument();
});
it('should render the correct navigation button on first load', () => {
it('should follow all suggested users by default', async () => {
fetch.mockResponseOnce(fakeUsersResponse);
const { queryByText } = renderFollowUsers();
const { queryByText, findAllByLabelText } = renderFollowUsers();
expect(queryByText(/skip for now/i)).toBeDefined();
const selectedUsers = await findAllByLabelText('Following');
expect(selectedUsers).toHaveLength(3);
expect(queryByText(/Continue/i)).toExist();
});
it('should update the navigation button text and follow status when you follow users', async () => {
it('should update the navigation button text and follow status when you follow/unfollow users', async () => {
fetch.mockResponse(fakeUsersResponse);
const { queryByText, findByText, findAllByTestId } = renderFollowUsers();
const { queryByText, queryAllByLabelText, findAllByTestId } =
renderFollowUsers();
const userButtons = await findAllByTestId(
'onboarding-user-following-status',
);
expect(queryByText(/skip for now/i)).toBeDefined();
expect(queryByText(/You're not following anyone/i)).toBeDefined();
expect(queryAllByLabelText('Following')).toHaveLength(3);
expect(queryByText(/You're following 3 people \(everyone\)/i)).toExist();
expect(queryByText(/Continue/i)).toExist();
// follow the first user
const firstUser = userButtons[0];
firstUser.click();
// Unfollow the first user
fireEvent.click(userButtons[0]);
await findByText('Following');
expect(queryAllByLabelText('Following')).toHaveLength(2);
expect(queryByText(/You're following 2 people/i)).toExist();
expect(queryByText(/continue/i)).toExist();
expect(queryByText(/You're following 1 person/i)).toBeDefined();
expect(queryByText(/continue/i)).toBeDefined();
// Unfollow the second user
fireEvent.click(userButtons[1]);
// follow the second user
const secondUser = userButtons[1];
secondUser.click();
expect(queryAllByLabelText('Following')).toHaveLength(1);
expect(queryByText(/You're following 1 person/i)).toExist();
expect(queryByText(/continue/i)).toExist();
await findByText('Following');
// Unfollow the third user
fireEvent.click(userButtons[2]);
expect(queryByText(/You're following 2 people/i)).toBeDefined();
expect(queryByText(/continue/i)).toBeDefined();
expect(queryByText('Following')).not.toExist();
expect(queryByText(/You're not following anyone/i)).toExist();
expect(queryByText(/skip for now/i)).toExist();
// Follow the third user again
fireEvent.click(userButtons[2]);
expect(queryAllByLabelText('Following')).toHaveLength(1);
expect(queryByText(/You're following 1 person/i)).toExist();
expect(queryByText(/continue/i)).toExist();
});
it('should have a functioning de/select all toggle', async () => {
fetch.mockResponse(fakeUsersResponse);
const {
getByText,
queryByText,
findByText,
findAllByText,
} = renderFollowUsers();
const { queryByText, findByText, queryAllByLabelText } =
renderFollowUsers();
// deselect all then test following count
const deselectAllSelector = await findByText(/Deselect all/i);
fireEvent.click(deselectAllSelector);
expect(queryAllByLabelText('Follow')).toHaveLength(3);
expect(queryByText('Following')).not.toExist();
expect(queryByText(/You're not following anyone/i)).toExist();
// select all then test following count
const followAllSelector = await findByText(/Select all 3 people/i);
followAllSelector.click();
fireEvent.click(followAllSelector);
await findAllByText('Following');
expect(queryByText('Follow')).toBeNull();
queryByText(/You're following 3 people (everyone)/i);
// deselect all then test following count
const deselecAllSelector = await findByText(/Deselect all/i);
deselecAllSelector.click();
await findAllByText('Follow');
expect(queryByText('Following')).toBeNull();
getByText(/You're not following anyone/i);
expect(queryByText('Follow')).not.toExist();
expect(queryAllByLabelText('Following')).toHaveLength(3);
expect(queryByText(/You're following 3 people \(everyone\)/i)).toExist();
});
it('should render a stepper', () => {
const { queryByTestId } = renderFollowUsers();
expect(queryByTestId('stepper')).toBeDefined();
expect(queryByTestId('stepper')).toExist();
});
it('should render a back button', () => {
const { queryByTestId } = renderFollowUsers();
expect(queryByTestId('back-button')).toBeDefined();
expect(queryByTestId('back-button')).toExist();
});
});

View file

@ -1,4 +1,4 @@
/* eslint-env node */
/* eslint-env jest, node */
import 'jest-axe/extend-expect';
import './app/assets/javascripts/lib/xss';
@ -18,3 +18,30 @@ process.on('unhandledRejection', (error) => {
// Errors thrown here are typically fetch responses that have not been mocked.
throw error;
});
expect.extend({
/**
* This matcher tests if its subject is neither null nor undefined.
*
* Jest's `toBeDefined` only tests if its subject is *strictly* not the value
* `undefined`, which makes it unsuitable for testing if a value exists as the
* value might be `null` (which would pass a `toBeDefined` check).
*
* @param {any} subject The subject of the matcher
* @returns
*/
toExist(subject) {
if (subject === null || subject === undefined) {
return {
pass: false,
message: () => `Expected ${this.utils.printReceived(subject)} to exist`,
};
}
return {
pass: true,
message: () =>
`Expected ${this.utils.printReceived(subject)} to not exist`,
};
},
});