github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/web/src/feature.test.tsx (about) 1 import { render } from "@testing-library/react" 2 import React from "react" 3 import Features, { FeaturesProvider, Flag, useFeatures } from "./feature" 4 5 describe("feature", () => { 6 it("returns false if the feature does not exist", () => { 7 let features = new Features({}) 8 expect(features.isEnabled("foo" as Flag)).toBe(false) 9 }) 10 11 it("returns false if the feature does exist and is false", () => { 12 let features = new Features({ foo: false }) 13 expect(features.isEnabled("foo" as Flag)).toBe(false) 14 }) 15 16 it("returns true if the feature does exist and is true", () => { 17 let features = new Features({ foo: true }) 18 expect(features.isEnabled("foo" as Flag)).toBe(true) 19 }) 20 21 it("still works if null is passed in", () => { 22 let features = new Features(null) 23 expect(features.isEnabled("foo" as Flag)).toBe(false) 24 }) 25 }) 26 27 // Make sure that useFeatures() doesn't break memoization. 28 it("memoizes renders", () => { 29 let renderCount = 0 30 let FakeEl = React.memo(() => { 31 useFeatures() 32 renderCount++ 33 return <div></div> 34 }) 35 36 let flags = [{ name: "foo", value: true }] 37 let tree = (flags: Proto.v1alpha1UIFeatureFlag[]) => { 38 return ( 39 <FeaturesProvider featureFlags={flags}> 40 <FakeEl /> 41 </FeaturesProvider> 42 ) 43 } 44 45 let { rerender } = render(tree(flags)) 46 47 expect(renderCount).toEqual(1) 48 rerender(tree(flags)) 49 50 // Make sure we don't re-render on a no-op update. 51 expect(renderCount).toEqual(1) 52 53 // Make sure we do re-render on a real update. 54 let newFlags = [{ name: "foo", value: false }] 55 rerender(tree(newFlags)) 56 expect(renderCount).toEqual(2) 57 })