From 03c978d2ccac719acdee0cd9c8275f0d476c8bf1 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Tue, 13 Jun 2023 14:24:12 -0700 Subject: [PATCH] add unit test for start method on RCTHost (#37858) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/37858 Changelog: [Internal] in this diff, i add a test that runs `start` validates that the lifecycle `hostDidStart:` is called as a result. notably, i created a custom shim for `RCTInstance` to completely stub out its behavior. Reviewed By: cipolleschi Differential Revision: D46508066 fbshipit-source-id: e815aee64d06b160f2cbdc52720a8e698d11c680 --- .../react/bridgeless/iostests/RCTHostTests.mm | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactCommon/react/bridgeless/iostests/RCTHostTests.mm b/packages/react-native/ReactCommon/react/bridgeless/iostests/RCTHostTests.mm index 13fcf49f16a..f76dfbb5f68 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/iostests/RCTHostTests.mm +++ b/packages/react-native/ReactCommon/react/bridgeless/iostests/RCTHostTests.mm @@ -7,13 +7,72 @@ #import +#import +#import +#import +#import +#import + +#import + +@interface ShimRCTInstance : NSObject +@end + @interface RCTHostTests : XCTestCase @end -@implementation RCTHostTests +@implementation RCTHostTests { + RCTHost *_subject; + id _mockHostDelegate; +} -- (void)testHost +static ShimRCTInstance *shimmedRCTInstance; + +- (void)setUp { + [super setUp]; + + shimmedRCTInstance = [ShimRCTInstance new]; + + _mockHostDelegate = OCMProtocolMock(@protocol(RCTHostDelegate)); + _subject = [[RCTHost alloc] initWithBundleURL:OCMClassMock([NSURL class]) + hostDelegate:_mockHostDelegate + turboModuleManagerDelegate:OCMProtocolMock(@protocol(RCTTurboModuleManagerDelegate)) + jsEngineProvider:^std::shared_ptr() { + return std::make_shared(); + }]; +} + +- (void)testStart +{ + [_subject start]; + OCMVerify(OCMTimes(1), [_mockHostDelegate hostDidStart:_subject]); +} + +@end + +@implementation ShimRCTInstance + +- (instancetype)init +{ + if (self = [super init]) { + RCTSwizzleInstanceSelector( + [RCTInstance class], + [ShimRCTInstance class], + @selector(initWithDelegate: + jsEngineInstance:bundleManager:turboModuleManagerDelegate:onInitialBundleLoad:moduleRegistry:)); + } + return self; +} + +- (instancetype)initWithDelegate:(id)delegate + jsEngineInstance:(std::shared_ptr)jsEngineInstance + bundleManager:(RCTBundleManager *)bundleManager + turboModuleManagerDelegate:(id)tmmDelegate + onInitialBundleLoad:(RCTInstanceInitialBundleLoadCompletionBlock)onInitialBundleLoad + moduleRegistry:(RCTModuleRegistry *)moduleRegistry +{ + return self; } @end