chore: prepare local.3 release and test event subscriptions

This commit is contained in:
Codex
2026-10-13 21:59:09 +03:00
parent 6bfd311ad4
commit 6f313cbef9
4 changed files with 56 additions and 1 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ name: immich_mobile
description: Immich - selfhosted backup media file on mobile phone
publish_to: 'none'
version: 3.3.1-local.2+3030200
version: 3.3.1-local.3+3030201
environment:
sdk: '>=3.12.0 <4.0.0'
@@ -0,0 +1,17 @@
<script lang="ts">
import { BaseEventManager } from '$lib/utils/base-event-manager.svelte';
import EventSubscriber from './EventSubscriber.svelte';
const manager = new BaseEventManager<{ update: [] }>();
let page = $state(0);
let visible = $state(true);
</script>
<button type="button" onclick={() => page++}>Next page</button>
<button type="button" onclick={() => (visible = !visible)}>Toggle subscriber</button>
<button type="button" disabled={!manager.hasListeners('update')} onclick={() => manager.emit('update')}>Update</button>
{#if visible}
{#key page}
<EventSubscriber {manager} />
{/key}
{/if}
@@ -0,0 +1,10 @@
<script lang="ts">
import { onDestroy } from 'svelte';
import type { BaseEventManager } from '$lib/utils/base-event-manager.svelte';
const { manager }: { manager: BaseEventManager<{ update: [] }> } = $props();
let received = $state(0);
onDestroy(manager.on({ update: () => received++ }));
</script>
<span data-testid="received">{received}</span>
@@ -0,0 +1,28 @@
import { render, screen } from '@testing-library/svelte';
import userEvent from '@testing-library/user-event';
import EventNavigation from './__tests__/EventNavigation.svelte';
describe('event subscriptions across navigation', () => {
it('keeps the new page subscribed when the previous page is destroyed', async () => {
const user = userEvent.setup();
render(EventNavigation);
for (let page = 0; page < 3; page++) {
await user.click(screen.getByRole('button', { name: 'Next page' }));
await user.click(screen.getByRole('button', { name: 'Update' }));
expect(screen.getByTestId('received')).toHaveTextContent('1');
}
});
it('updates controls when the last subscriber is removed and restored', async () => {
const user = userEvent.setup();
render(EventNavigation);
const update = screen.getByRole('button', { name: 'Update' });
expect(update).toBeEnabled();
await user.click(screen.getByRole('button', { name: 'Toggle subscriber' }));
expect(update).toBeDisabled();
await user.click(screen.getByRole('button', { name: 'Toggle subscriber' }));
expect(update).toBeEnabled();
await user.click(update);
expect(screen.getByTestId('received')).toHaveTextContent('1');
});
});