mirror of
https://github.com/immich-app/immich
synced 2025-11-07 17:27:20 +00:00
* feat: people infinite scroll * add infinite scroll to show & hide modal * update unit tests * show total people count instead of currently loaded * update personsearchdto
116 lines
3.5 KiB
TypeScript
116 lines
3.5 KiB
TypeScript
import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock';
|
|
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
|
import ManagePeopleVisibility from '$lib/components/faces-page/manage-people-visibility.svelte';
|
|
import type { PersonResponseDto } from '@immich/sdk';
|
|
import { personFactory } from '@test-data/factories/person-factory';
|
|
import { render } from '@testing-library/svelte';
|
|
import { tick } from 'svelte';
|
|
|
|
describe('ManagePeopleVisibility Component', () => {
|
|
let personVisible: PersonResponseDto;
|
|
let personHidden: PersonResponseDto;
|
|
let personWithoutName: PersonResponseDto;
|
|
|
|
beforeAll(() => {
|
|
// Prevents errors from `img.decode()` in ImageThumbnail
|
|
Object.defineProperty(HTMLImageElement.prototype, 'decode', {
|
|
value: vi.fn(),
|
|
});
|
|
});
|
|
|
|
beforeEach(() => {
|
|
vi.stubGlobal('IntersectionObserver', getIntersectionObserverMock());
|
|
personVisible = personFactory.build({ isHidden: false });
|
|
personHidden = personFactory.build({ isHidden: true });
|
|
personWithoutName = personFactory.build({ isHidden: false, name: undefined });
|
|
sdkMock.updatePeople.mockResolvedValue([]);
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.resetAllMocks();
|
|
});
|
|
|
|
it('does not update people when no changes are made', () => {
|
|
const { getByText } = render(ManagePeopleVisibility, {
|
|
props: {
|
|
people: [personVisible, personHidden, personWithoutName],
|
|
totalPeopleCount: 3,
|
|
onClose: vi.fn(),
|
|
loadNextPage: vi.fn(),
|
|
},
|
|
});
|
|
|
|
const saveButton = getByText('done');
|
|
saveButton.click();
|
|
expect(sdkMock.updatePeople).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('hides unnamed people on first button press', () => {
|
|
const { getByText, getByTitle } = render(ManagePeopleVisibility, {
|
|
props: {
|
|
people: [personVisible, personHidden, personWithoutName],
|
|
totalPeopleCount: 3,
|
|
onClose: vi.fn(),
|
|
loadNextPage: vi.fn(),
|
|
},
|
|
});
|
|
|
|
getByTitle('hide_unnamed_people').click();
|
|
getByText('done').click();
|
|
|
|
expect(sdkMock.updatePeople).toHaveBeenCalledWith({
|
|
peopleUpdateDto: {
|
|
people: [{ id: personWithoutName.id, isHidden: true }],
|
|
},
|
|
});
|
|
});
|
|
|
|
it('hides all people on second button press', async () => {
|
|
const { getByText, getByTitle } = render(ManagePeopleVisibility, {
|
|
props: {
|
|
people: [personVisible, personHidden, personWithoutName],
|
|
totalPeopleCount: 3,
|
|
onClose: vi.fn(),
|
|
loadNextPage: vi.fn(),
|
|
},
|
|
});
|
|
|
|
getByTitle('hide_unnamed_people').click();
|
|
await tick();
|
|
getByTitle('hide_all_people').click();
|
|
getByText('done').click();
|
|
|
|
expect(sdkMock.updatePeople).toHaveBeenCalledWith({
|
|
peopleUpdateDto: {
|
|
people: expect.arrayContaining([
|
|
{ id: personVisible.id, isHidden: true },
|
|
{ id: personWithoutName.id, isHidden: true },
|
|
]),
|
|
},
|
|
});
|
|
});
|
|
|
|
it('shows all people on third button press', async () => {
|
|
const { getByText, getByTitle } = render(ManagePeopleVisibility, {
|
|
props: {
|
|
people: [personVisible, personHidden, personWithoutName],
|
|
totalPeopleCount: 3,
|
|
onClose: vi.fn(),
|
|
loadNextPage: vi.fn(),
|
|
},
|
|
});
|
|
|
|
getByTitle('hide_unnamed_people').click();
|
|
await tick();
|
|
getByTitle('hide_all_people').click();
|
|
await tick();
|
|
getByTitle('show_all_people').click();
|
|
getByText('done').click();
|
|
|
|
expect(sdkMock.updatePeople).toHaveBeenCalledWith({
|
|
peopleUpdateDto: {
|
|
people: [{ id: personHidden.id, isHidden: false }],
|
|
},
|
|
});
|
|
});
|
|
});
|