Skip to content

Commit ace6228

Browse files
Update TurboModuleTestFixture to handle Promise types (#52801)
Summary: Pull Request resolved: #52801 Changelog: [Internal] This adds utility functions and sample test cases to verify AsyncPromises in GTests Differential Revision: D78871865
1 parent 546e276 commit ace6228

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

packages/react-native/ReactCommon/react/nativemodule/core/tests/TurboModuleTestFixture.h

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
#include <ReactCommon/TestCallInvoker.h>
1111
#include <gtest/gtest.h>
1212
#include <hermes/hermes.h>
13+
#include <react/bridging/Promise.h>
14+
#include <react/debug/react_native_assert.h>
1315
#include <memory>
16+
#include <optional>
1417

1518
namespace facebook::react {
1619

@@ -22,6 +25,76 @@ class TurboModuleTestFixture : public ::testing::Test {
2225
jsInvoker_(std::make_shared<TestCallInvoker>(runtime_)),
2326
module_(std::make_shared<T>(jsInvoker_, std::forward<Args>(args)...)) {}
2427

28+
void SetUp() override {
29+
auto setImmediateName =
30+
facebook::jsi::PropNameID::forAscii(*runtime_, "setImmediate");
31+
runtime_->global().setProperty(
32+
*runtime_,
33+
setImmediateName,
34+
facebook::jsi::Function::createFromHostFunction(
35+
*runtime_,
36+
setImmediateName,
37+
1,
38+
[jsInvoker = jsInvoker_](
39+
facebook::jsi::Runtime& rt,
40+
[[maybe_unused]] const facebook::jsi::Value& thisVal,
41+
const facebook::jsi::Value* args,
42+
size_t count) {
43+
react_native_assert(count >= 1);
44+
jsInvoker->invokeAsync(
45+
[cb = std::make_shared<facebook::jsi::Value>(rt, args[0])](
46+
facebook::jsi::Runtime& runtime) {
47+
cb->asObject(runtime).asFunction(runtime).call(runtime);
48+
});
49+
return facebook::jsi::Value::undefined();
50+
}));
51+
}
52+
53+
void TearDown() override {
54+
module_ = nullptr;
55+
jsInvoker_ = nullptr;
56+
runtime_ = nullptr;
57+
}
58+
59+
template <typename TPromise>
60+
std::optional<TPromise> resolvePromise(
61+
const AsyncPromise<TPromise>& asyncPromise) {
62+
auto promise = asyncPromise.get(*runtime_);
63+
std::optional<TPromise> result = std::nullopt;
64+
promise.getPropertyAsFunction(*runtime_, "then")
65+
.callWithThis(
66+
*runtime_,
67+
promise,
68+
bridging::toJs(
69+
*runtime_,
70+
[&](TPromise value) { result = std::move(value); },
71+
jsInvoker_));
72+
jsInvoker_->flushQueue();
73+
return result;
74+
}
75+
76+
template <typename TPromise>
77+
std::optional<std::string> handleError(
78+
const AsyncPromise<TPromise>& asyncPromise) {
79+
auto promise = asyncPromise.get(*runtime_);
80+
std::optional<std::string> message;
81+
promise.getPropertyAsFunction(*runtime_, "catch")
82+
.callWithThis(
83+
*runtime_,
84+
promise,
85+
bridging::toJs(
86+
*runtime_,
87+
[&](facebook::jsi::Object error) {
88+
message = bridging::fromJs<std::string>(
89+
*runtime_,
90+
error.getProperty(*runtime_, "message"),
91+
jsInvoker_);
92+
},
93+
jsInvoker_));
94+
jsInvoker_->flushQueue();
95+
return message;
96+
}
97+
2598
protected:
2699
std::shared_ptr<jsi::Runtime> runtime_{};
27100
std::shared_ptr<TestCallInvoker> jsInvoker_{};

packages/rn-tester/NativeCxxModuleExample/tests/NativeCxxModuleExampleTests.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,16 @@ TEST_F(NativeCxxModuleExampleTests, GetValueReturnsCorrectValues) {
154154
EXPECT_EQ(result.z.c, "seven");
155155
}
156156

157+
TEST_F(NativeCxxModuleExampleTests, GetValueWithPromiseReturnsCorrectValues) {
158+
auto promise1 = module_->getValueWithPromise(*runtime_, false);
159+
auto result = resolvePromise(promise1);
160+
EXPECT_EQ(result, "result!");
161+
162+
auto promise2 = module_->getValueWithPromise(*runtime_, true);
163+
auto message = handleError(promise2);
164+
EXPECT_EQ(message, "intentional promise rejection");
165+
}
166+
157167
TEST_F(
158168
NativeCxxModuleExampleTests,
159169
GetWithWithOptionalArgsReturnsCorrectValues) {

0 commit comments

Comments
 (0)