Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,34 @@ import { describe, expect, it, vi } from "vite-plus/test";
import { render } from "../../../test/render";
import { DiffFileLoadingBoundary } from "./DiffFileLoadingBoundary";

// Like the real observer, every observe() reports the target's current state; this boundary
// is always in range.
class InRangeIntersectionObserver {
static observeCount = 0;
constructor(readonly callback: IntersectionObserverCallback) {}
observe(target: Element) {
InRangeIntersectionObserver.observeCount += 1;
this.callback(
[{ target, isIntersecting: true } as IntersectionObserverEntry],
this as unknown as IntersectionObserver,
);
}
unobserve() {}
disconnect() {}
}

function stubIntersectionObserver() {
InRangeIntersectionObserver.observeCount = 0;
let observeCount = 0;
// Like the real observer, every observe() reports the target's current state; this boundary
// is always in range.
class InRangeIntersectionObserver {
constructor(readonly callback: IntersectionObserverCallback) {}
observe(target: Element) {
observeCount += 1;
this.callback(
[{ target, isIntersecting: true } as IntersectionObserverEntry],
this as unknown as IntersectionObserver,
);
}
unobserve() {}
disconnect() {}
}
vi.stubGlobal("IntersectionObserver", InRangeIntersectionObserver);
return { [Symbol.dispose]: () => vi.unstubAllGlobals() };
return {
get observeCount() {
return observeCount;
},
[Symbol.dispose]: () => vi.unstubAllGlobals(),
};
}

describe("DiffFileLoadingBoundary", () => {
it("observes once and loads once while its parent re-renders with a new load", async () => {
using _observer = stubIntersectionObserver();
using observer = stubIntersectionObserver();
const load = vi.fn();
// DiffPanel hands over a new loadNextFiles whenever any file patch changes.
await using screen = await render(<DiffFileLoadingBoundary load={() => load()} count={8} />, {
Expand All @@ -38,12 +41,12 @@ describe("DiffFileLoadingBoundary", () => {
await screen.rerender(<DiffFileLoadingBoundary load={() => load()} count={8} />);

await expect.element(screen.getByRole("status", { name: "Loading diff…" })).toBeInTheDocument();
expect(InRangeIntersectionObserver.observeCount).toBe(1);
expect(observer.observeCount).toBe(1);
expect(load).toHaveBeenCalledTimes(1);

// A settled batch leaves the boundary in range, so it asks for the next one.
await screen.rerender(<DiffFileLoadingBoundary load={() => load()} count={4} />);
expect(InRangeIntersectionObserver.observeCount).toBe(1);
expect(observer.observeCount).toBe(1);
expect(load).toHaveBeenCalledTimes(2);
});
});
Loading