Merge branch 'group-hooks-tests' into 'develop'
Add tests for Group API hooks See merge request soapbox-pub/soapbox!2508
This commit is contained in:
commit
a6519c5685
6 changed files with 226 additions and 0 deletions
41
app/soapbox/api/hooks/groups/__tests__/useGroup.test.ts
Normal file
41
app/soapbox/api/hooks/groups/__tests__/useGroup.test.ts
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import { __stub } from 'soapbox/api';
|
||||||
|
import { buildGroup } from 'soapbox/jest/factory';
|
||||||
|
import { renderHook, waitFor } from 'soapbox/jest/test-helpers';
|
||||||
|
|
||||||
|
import { useGroup } from '../useGroup';
|
||||||
|
|
||||||
|
const group = buildGroup({ id: '1', display_name: 'soapbox' });
|
||||||
|
|
||||||
|
describe('useGroup hook', () => {
|
||||||
|
describe('with a successful request', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/groups/${group.id}`).reply(200, group);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is successful', async () => {
|
||||||
|
const { result } = renderHook(() => useGroup(group.id));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.group?.id).toBe(group.id);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with an unsuccessful query', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/groups/${group.id}`).networkError();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is has error state', async() => {
|
||||||
|
const { result } = renderHook(() => useGroup(group.id));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.group).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,41 @@
|
||||||
|
import { __stub } from 'soapbox/api';
|
||||||
|
import { buildGroup } from 'soapbox/jest/factory';
|
||||||
|
import { renderHook, waitFor } from 'soapbox/jest/test-helpers';
|
||||||
|
|
||||||
|
import { useGroupLookup } from '../useGroupLookup';
|
||||||
|
|
||||||
|
const group = buildGroup({ id: '1', slug: 'soapbox' });
|
||||||
|
|
||||||
|
describe('useGroupLookup hook', () => {
|
||||||
|
describe('with a successful request', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/groups/lookup?name=${group.slug}`).reply(200, group);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is successful', async () => {
|
||||||
|
const { result } = renderHook(() => useGroupLookup(group.slug));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.entity?.id).toBe(group.id);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with an unsuccessful query', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/groups/lookup?name=${group.slug}`).networkError();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is has error state', async() => {
|
||||||
|
const { result } = renderHook(() => useGroupLookup(group.slug));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.entity).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
44
app/soapbox/api/hooks/groups/__tests__/useGroupMedia.test.ts
Normal file
44
app/soapbox/api/hooks/groups/__tests__/useGroupMedia.test.ts
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
import { __stub } from 'soapbox/api';
|
||||||
|
import { buildStatus } from 'soapbox/jest/factory';
|
||||||
|
import { renderHook, waitFor } from 'soapbox/jest/test-helpers';
|
||||||
|
|
||||||
|
import { useGroupMedia } from '../useGroupMedia';
|
||||||
|
|
||||||
|
const status = buildStatus();
|
||||||
|
const groupId = '1';
|
||||||
|
|
||||||
|
describe('useGroupMedia hook', () => {
|
||||||
|
describe('with a successful request', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/timelines/group/${groupId}?only_media=true`).reply(200, [status]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is successful', async () => {
|
||||||
|
const { result } = renderHook(() => useGroupMedia(groupId));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.entities.length).toBe(1);
|
||||||
|
expect(result.current.entities[0].id).toBe(status.id);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with an unsuccessful query', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/timelines/group/${groupId}?only_media=true`).networkError();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is has error state', async() => {
|
||||||
|
const { result } = renderHook(() => useGroupMedia(groupId));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.entities.length).toBe(0);
|
||||||
|
expect(result.current.isError).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,45 @@
|
||||||
|
import { __stub } from 'soapbox/api';
|
||||||
|
import { buildGroupMember } from 'soapbox/jest/factory';
|
||||||
|
import { renderHook, waitFor } from 'soapbox/jest/test-helpers';
|
||||||
|
import { GroupRoles } from 'soapbox/schemas/group-member';
|
||||||
|
|
||||||
|
import { useGroupMembers } from '../useGroupMembers';
|
||||||
|
|
||||||
|
const groupMember = buildGroupMember();
|
||||||
|
const groupId = '1';
|
||||||
|
|
||||||
|
describe('useGroupMembers hook', () => {
|
||||||
|
describe('with a successful request', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/groups/${groupId}/memberships?role=${GroupRoles.ADMIN}`).reply(200, [groupMember]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is successful', async () => {
|
||||||
|
const { result } = renderHook(() => useGroupMembers(groupId, GroupRoles.ADMIN));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.groupMembers.length).toBe(1);
|
||||||
|
expect(result.current.groupMembers[0].id).toBe(groupMember.id);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with an unsuccessful query', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet(`/api/v1/groups/${groupId}/memberships?role=${GroupRoles.ADMIN}`).networkError();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is has error state', async() => {
|
||||||
|
const { result } = renderHook(() => useGroupMembers(groupId, GroupRoles.ADMIN));
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.groupMembers.length).toBe(0);
|
||||||
|
expect(result.current.isError).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
47
app/soapbox/api/hooks/groups/__tests__/useGroups.test.ts
Normal file
47
app/soapbox/api/hooks/groups/__tests__/useGroups.test.ts
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
import { __stub } from 'soapbox/api';
|
||||||
|
import { buildGroup } from 'soapbox/jest/factory';
|
||||||
|
import { renderHook, waitFor } from 'soapbox/jest/test-helpers';
|
||||||
|
import { normalizeInstance } from 'soapbox/normalizers';
|
||||||
|
|
||||||
|
import { useGroups } from '../useGroups';
|
||||||
|
|
||||||
|
const group = buildGroup({ id: '1', display_name: 'soapbox' });
|
||||||
|
const store = {
|
||||||
|
instance: normalizeInstance({
|
||||||
|
version: '3.4.1 (compatible; TruthSocial 1.0.0+unreleased)',
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('useGroups hook', () => {
|
||||||
|
describe('with a successful request', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet('/api/v1/groups').reply(200, [group]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is successful', async () => {
|
||||||
|
const { result } = renderHook(useGroups, undefined, store);
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.groups).toHaveLength(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with an unsuccessful query', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
__stub((mock) => {
|
||||||
|
mock.onGet('/api/v1/groups').networkError();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is has error state', async() => {
|
||||||
|
const { result } = renderHook(useGroups, undefined, store);
|
||||||
|
|
||||||
|
await waitFor(() => expect(result.current.isFetching).toBe(false));
|
||||||
|
|
||||||
|
expect(result.current.groups).toHaveLength(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -19,6 +19,7 @@ import {
|
||||||
type Relationship,
|
type Relationship,
|
||||||
} from 'soapbox/schemas';
|
} from 'soapbox/schemas';
|
||||||
import { GroupRoles } from 'soapbox/schemas/group-member';
|
import { GroupRoles } from 'soapbox/schemas/group-member';
|
||||||
|
import { statusSchema, type Status } from 'soapbox/schemas/status';
|
||||||
|
|
||||||
// TODO: there's probably a better way to create these factory functions.
|
// TODO: there's probably a better way to create these factory functions.
|
||||||
// This looks promising but didn't work on my first attempt: https://github.com/anatine/zod-plugins/tree/main/packages/zod-mock
|
// This looks promising but didn't work on my first attempt: https://github.com/anatine/zod-plugins/tree/main/packages/zod-mock
|
||||||
|
@ -77,6 +78,12 @@ function buildRelationship(props: Partial<Relationship> = {}): Relationship {
|
||||||
}, props));
|
}, props));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function buildStatus(props: Partial<Status> = {}): Status {
|
||||||
|
return statusSchema.parse(Object.assign({
|
||||||
|
id: uuidv4(),
|
||||||
|
}, props));
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
buildAd,
|
buildAd,
|
||||||
buildCard,
|
buildCard,
|
||||||
|
@ -85,4 +92,5 @@ export {
|
||||||
buildGroupRelationship,
|
buildGroupRelationship,
|
||||||
buildGroupTag,
|
buildGroupTag,
|
||||||
buildRelationship,
|
buildRelationship,
|
||||||
|
buildStatus,
|
||||||
};
|
};
|
Loading…
Reference in a new issue