starling-devex 0.1.2

Starling: a local dev orchestrator with a central daemon, shared named-URL proxy, and a k9s-style TUI (a Rust port of Tilt + portless)
import { render } from "@testing-library/react"
import React from "react"
import { FeaturesProvider, Flag } from "./feature"
import PathBuilder, { PathBuilderProvider } from "./PathBuilder"
import { SnapshotActionProvider, useSnapshotAction } from "./snapshot"
import type { UIFeatureFlag } from "./core"

// Make sure that useSnapshotAction() doesn't break memoization.
it("memoizes renders", () => {
  let renderCount = 0
  let FakeEl = React.memo(() => {
    useSnapshotAction()
    renderCount++
    return <div></div>
  })

  let pathBuilder = PathBuilder.forTesting("localhost", "/")
  let openModal = () => {}
  let tree = (flags: UIFeatureFlag[]) => {
    return (
      <FeaturesProvider featureFlags={flags}>
        <PathBuilderProvider value={pathBuilder}>
          <SnapshotActionProvider openModal={openModal}>
            <FakeEl />
          </SnapshotActionProvider>
        </PathBuilderProvider>
      </FeaturesProvider>
    )
  }

  let flags = [{ name: "foo", value: true }]
  let { rerender } = render(tree(flags))
  expect(renderCount).toEqual(1)

  // Make sure we don't re-render if an irrelevant flag changes
  let flags2 = [{ name: "foo", value: false }]
  rerender(tree(flags2))
  expect(renderCount).toEqual(1)

  // Make sure we do re-render on a real update.
  let flags3 = [{ name: Flag.Snapshots, value: true }]
  rerender(tree(flags3))
  expect(renderCount).toEqual(2)
})