Skip to content

Commit

Permalink
Fix bug where suspending @weak resolver values were getting normalized
Browse files Browse the repository at this point in the history
Reviewed By: josephsavona, andreqi

Differential Revision: D45675778

fbshipit-source-id: 3606951d90eae1f4b9adfcdc4761a99446a929ec
  • Loading branch information
captbaritone authored and facebook-github-bot committed May 9, 2023
1 parent 442d494 commit 6347254
Show file tree
Hide file tree
Showing 6 changed files with 399 additions and 3 deletions.
28 changes: 28 additions & 0 deletions packages/react-relay/__tests__/RelayResolverModel-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,34 @@ describe.each([
expect(renderer.toJSON()).toEqual('NULL!');
});

// Ensure we don't:
// 1. Wrap a suspense value coming from a @weak model resolver
// 2. Don't try to normalize a suspense sentinel as a model value
test('@weak model client edge suspends', () => {
function TodoComponentWithNullWeakClientEdge(props: {todoID: string}) {
useClientQuery(
graphql`
query RelayResolverModelTestSuspendedWeakClientEdgeQuery($id: ID!) {
todo_model(todoID: $id) {
fancy_description_suspends {
text_with_prefix(prefix: "[x]")
}
}
}
`,
{id: props.todoID},
);
invariant(false, 'Expected to suspend.');
}

const renderer = TestRenderer.create(
<EnvironmentWrapper environment={environment}>
<TodoComponentWithNullWeakClientEdge todoID="todo-1" />
</EnvironmentWrapper>,
);
expect(renderer.toJSON()).toEqual('Loading...');
});

test('read a field with its own root fragment', () => {
function TodoComponentWithFieldWithRootFragmentComponent(props: {
todoID: string,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 22 additions & 1 deletion packages/relay-runtime/store/__tests__/resolvers/TodoModel.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@

'use strict';

import type {LiveState} from '../../experimental-live-resolvers/LiveResolverStore';
import type {TodoModelCapitalizedID$key} from './__generated__/TodoModelCapitalizedID.graphql';
import type {TodoModelCapitalizedIDLegacy$key} from './__generated__/TodoModelCapitalizedIDLegacy.graphql';
import type {TodoDescription} from './TodoDescription';
import type {ConcreteClientEdgeResolverReturnType} from 'relay-runtime';
import type {TodoItem} from 'relay-runtime/store/__tests__/resolvers/ExampleTodoStore';
import type {LiveState} from 'relay-runtime/store/experimental-live-resolvers/LiveResolverStore';

const {readFragment} = require('../../ResolverFragments');
const {createTodoDescription} = require('./TodoDescription');
Expand All @@ -25,6 +25,9 @@ const {
Selectors,
TODO_STORE,
} = require('relay-runtime/store/__tests__/resolvers/ExampleTodoStore');
const {
suspenseSentinel,
} = require('relay-runtime/store/experimental-live-resolvers/LiveResolverSuspenseSentinel');

/**
* @RelayResolver TodoModel
Expand Down Expand Up @@ -103,6 +106,23 @@ function fancy_description_null(model: ?TodoItem): ?TodoDescription {
return null;
}

/**
* @RelayResolver TodoModel.fancy_description_suspends: TodoDescription
* @live
*/
function fancy_description_suspends(
model: ?TodoItem,
): LiveState<TodoDescription> {
return {
read() {
return suspenseSentinel();
},
subscribe() {
return () => {};
},
};
}

/**
* @RelayResolver TodoModel.many_fancy_descriptions: [TodoDescription]
*/
Expand Down Expand Up @@ -152,6 +172,7 @@ module.exports = {
description,
fancy_description,
fancy_description_null,
fancy_description_suspends,
many_fancy_descriptions,
live_todo_description,
};
Loading

0 comments on commit 6347254

Please sign in to comment.