diff --git a/package.json b/package.json index 8b0c179..822d131 100644 --- a/package.json +++ b/package.json @@ -64,8 +64,10 @@ "@commitlint/config-conventional": "19.5.0", "@semantic-release/changelog": "6.0.3", "@semantic-release/git": "10.0.1", + "@testing-library/react-native": "12.7.2", "@types/jest": "29.5.13", "@types/react": "18.3.7", + "@types/react-test-renderer": "18.3.0", "commitlint": "19.5.0", "del-cli": "5.1.0", "husky": "9.1.6", @@ -73,6 +75,7 @@ "react": "18.3.1", "react-native": "0.75.3", "react-native-builder-bob": "0.30.2", + "react-test-renderer": "18.3.1", "semantic-release": "24.1.1", "turbo": "2.1.2", "typescript": "5.6.2" diff --git a/setupJest.ts b/setupJest.ts index bc8bec6..ee115cb 100644 --- a/setupJest.ts +++ b/setupJest.ts @@ -1,5 +1,8 @@ jest.mock("react-native/Libraries/BatchedBridge/NativeModules", () => ({ ScreenshotAware: { - mulitply: jest.fn(), + addListener: jest.fn(), + removeListeners: jest.fn(), }, + PlatformConstants: {}, + DeviceInfo: {}, })); diff --git a/src/__tests__/index.test.tsx b/src/__tests__/index.test.tsx index 3ccc188..b7f2171 100644 --- a/src/__tests__/index.test.tsx +++ b/src/__tests__/index.test.tsx @@ -1,5 +1,58 @@ +import { renderHook } from "@testing-library/react-native"; +import { NativeEventEmitter } from "react-native"; +import NativeScreenshotAware from "../codegenSpec/NativeScreenshotAware"; +import { useScreenshotAware } from "../index"; +import ScreenshotAware from "../index"; + +interface NativeModule { + addListener: (event: string) => void; + removeListeners: (count: number) => void; +} + +const emitter = new NativeEventEmitter(NativeScreenshotAware); +const typedEmitter = emitter as unknown as { _nativeModule: NativeModule }; + describe("ScreenshotAware", () => { - it("true", () => { - expect(true).toBe(true); + afterEach(() => { + jest.clearAllMocks(); + }); + + it("should add and remove listener in useScreenshotAware hook", () => { + const callback = jest.fn(); + const { unmount } = renderHook(() => useScreenshotAware(callback)); + + expect(typedEmitter._nativeModule.addListener).toHaveBeenCalledWith( + "ScreenshotAwareEvent", + ); + + unmount(); + expect(typedEmitter._nativeModule.removeListeners).toHaveBeenCalledWith(1); + }); + + it("should call the callback when a screenshot event occurs", () => { + const callback = jest.fn(); + renderHook(() => useScreenshotAware(callback)); + + emitter.emit("ScreenshotAwareEvent"); + + expect(callback).toHaveBeenCalled(); + }); + + it("should add and remove listener in ScreenshotAware module", () => { + const callback = jest.fn(); + const subscription = ScreenshotAware.addListener(callback); + + expect(typedEmitter._nativeModule.addListener).toHaveBeenCalledWith( + "ScreenshotAwareEvent", + ); + + subscription.remove(); + expect(typedEmitter._nativeModule.removeListeners).toHaveBeenCalledWith(1); + }); + + it("should remove all listeners in ScreenshotAware module", () => { + ScreenshotAware.removeAllListeners(); + + expect(typedEmitter._nativeModule.removeListeners).toHaveBeenCalled(); }); }); diff --git a/src/index.tsx b/src/index.tsx index 222cc36..2a7519f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -62,7 +62,7 @@ export const useScreenshotAware = (callback: () => void) => { * } * ``` */ -export default { +const ScreenshotAware = { /** * Adds a listener for screenshot events. * @@ -79,3 +79,5 @@ export default { removeAllListeners: () => moduleEventEmitter.removeAllListeners("ScreenshotAwareEvent"), }; + +export default ScreenshotAware; diff --git a/yarn.lock b/yarn.lock index ca79865..6c163c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3293,6 +3293,25 @@ __metadata: languageName: node linkType: hard +"@testing-library/react-native@npm:12.7.2": + version: 12.7.2 + resolution: "@testing-library/react-native@npm:12.7.2" + dependencies: + jest-matcher-utils: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + redent: "npm:^3.0.0" + peerDependencies: + jest: ">=28.0.0" + react: ">=16.8.0" + react-native: ">=0.59" + react-test-renderer: ">=16.8.0" + peerDependenciesMeta: + jest: + optional: true + checksum: 10/6e50342eb6d6424abf8fb89006b21a127988bdf3697dba69d63254da7ed8eadda7ab5fe02873c63a7dd3e12719e578aebf4a5f12049a6490cd50a07bc6e6df54 + languageName: node + linkType: hard + "@tufjs/canonical-json@npm:2.0.0": version: 2.0.0 resolution: "@tufjs/canonical-json@npm:2.0.0" @@ -3443,6 +3462,15 @@ __metadata: languageName: node linkType: hard +"@types/react-test-renderer@npm:18.3.0": + version: 18.3.0 + resolution: "@types/react-test-renderer@npm:18.3.0" + dependencies: + "@types/react": "npm:*" + checksum: 10/c53683990bd194cb68e3987bda79c78eff41517f7a747e92f3e54217c2ce3addd031b8a45bf631982c909cc2caeeb905372f322758e05bb76c03754a3f24426e + languageName: node + linkType: hard + "@types/react@npm:18.3.7": version: 18.3.7 resolution: "@types/react@npm:18.3.7" @@ -4149,9 +4177,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001660 - resolution: "caniuse-lite@npm:1.0.30001660" - checksum: 10/5d83f0b7e2075b7e31f114f739155dc6c21b0afe8cb61180f625a4903b0ccd3d7591a5f81c930f14efddfa57040203ba0890850b8a3738f6c7f17c7dd83b9de8 + version: 1.0.30001662 + resolution: "caniuse-lite@npm:1.0.30001662" + checksum: 10/275dee3c2365d58c65609e707dfd7454e72195fdae7d3a8fea05f1ddb49581f64dfc65965964ee2cff99cc0af44d08c572437b1effd43e9ddc174d7a1d7f95a3 languageName: node linkType: hard @@ -8183,7 +8211,7 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.1": +"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: 10/bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 @@ -8781,7 +8809,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1": +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f @@ -9511,6 +9539,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.3.1": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 + languageName: node + linkType: hard + "react-is@npm:^17.0.1": version: 17.0.2 resolution: "react-is@npm:17.0.2" @@ -9518,13 +9553,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 - languageName: node - linkType: hard - "react-native-builder-bob@npm:0.30.2, react-native-builder-bob@npm:^0.30.2": version: 0.30.2 resolution: "react-native-builder-bob@npm:0.30.2" @@ -9582,8 +9610,10 @@ __metadata: "@commitlint/config-conventional": "npm:19.5.0" "@semantic-release/changelog": "npm:6.0.3" "@semantic-release/git": "npm:10.0.1" + "@testing-library/react-native": "npm:12.7.2" "@types/jest": "npm:29.5.13" "@types/react": "npm:18.3.7" + "@types/react-test-renderer": "npm:18.3.0" commitlint: "npm:19.5.0" del-cli: "npm:5.1.0" husky: "npm:9.1.6" @@ -9591,6 +9621,7 @@ __metadata: react: "npm:18.3.1" react-native: "npm:0.75.3" react-native-builder-bob: "npm:0.30.2" + react-test-renderer: "npm:18.3.1" semantic-release: "npm:24.1.1" turbo: "npm:2.1.2" typescript: "npm:5.6.2" @@ -9662,6 +9693,31 @@ __metadata: languageName: node linkType: hard +"react-shallow-renderer@npm:^16.15.0": + version: 16.15.0 + resolution: "react-shallow-renderer@npm:16.15.0" + dependencies: + object-assign: "npm:^4.1.1" + react-is: "npm:^16.12.0 || ^17.0.0 || ^18.0.0" + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 10/06457fe5bcaa44aeca998905b6849304742ea1cc2d3841e4a0964c745ff392bc4dec07f8c779f317faacce3a0bf6f84e15020ac0fa81adb931067dbb0baf707b + languageName: node + linkType: hard + +"react-test-renderer@npm:18.3.1": + version: 18.3.1 + resolution: "react-test-renderer@npm:18.3.1" + dependencies: + react-is: "npm:^18.3.1" + react-shallow-renderer: "npm:^16.15.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10/d53137315c677bdfba702a7179a69828233fc7635ae1e0c03b203923d643400ace72b343cb3dd3dafba8911c20bef53f55bff7aa2e4ddff3ccc423fdd9deeee2 + languageName: node + linkType: hard + "react@npm:18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" @@ -9789,6 +9845,16 @@ __metadata: languageName: node linkType: hard +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: 10/fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + "redent@npm:^4.0.0": version: 4.0.0 resolution: "redent@npm:4.0.0" @@ -10048,6 +10114,15 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10/e8d68b89d18d5b028223edf090092846868a765a591944760942b77ea1f69b17235f7e956696efbb62c8130ab90af7e0949bfb8eba7896335507317236966bc9 + languageName: node + linkType: hard + "selfsigned@npm:^2.4.1": version: 2.4.1 resolution: "selfsigned@npm:2.4.1" @@ -10626,6 +10701,15 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: "npm:^1.0.0" + checksum: 10/18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + "strip-indent@npm:^4.0.0": version: 4.0.0 resolution: "strip-indent@npm:4.0.0"