chore: prepare local.3 release and test event subscriptions
This commit is contained in:
@@ -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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user