Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: optimistic updates for nested queries should work then optional relationships have null values #1884

Merged
merged 3 commits into from
Nov 26, 2024

Conversation

roomman
Copy link
Contributor

@roomman roomman commented Nov 25, 2024

This PR addresses the issue raised in #1878. It adds guards to doApplyMutation to ensure that resultData is an array or an object before it is processed.

I had a bit of trouble getting nock to play nicely in the test suite and needed to be more explicit about which endpoints were being intercepted. I added a constant for BASE_URL and added that into makeUrl too, for consistency. I hope that's okay?

Either way, the tests are passing and I hope this is a useful contribution to your epic project! 🚀

Copy link
Contributor

coderabbitai bot commented Nov 25, 2024

📝 Walkthrough

Walkthrough

The pull request introduces modifications to the Tanstack Query React Hooks V5 test suite, enhancing test coverage for optimistic updates and nested relationships. It defines a new BASE_URL constant for API requests and adds multiple test cases to validate the functionality of optimistic updates in various scenarios. Additionally, the modelMeta structure is updated to include a new category model and related fields in the post model. The mutator.ts file is refined to improve type checks and cloning behavior in mutation functions, ensuring data integrity during operations.

Changes

File Path Change Summary
packages/plugins/tanstack-query/tests/react-hooks-v5.test.ts - Added BASE_URL constant for API requests.
- Introduced new test cases for optimistic updates involving nested relationships.
packages/plugins/tanstack-query/tests/test-model-meta.ts - Added category model with fields.
- Expanded post model with category and categoryId fields.
packages/runtime/src/cross/mutator.ts - Enhanced applyMutation, createMutate, updateMutate, and deleteMutate functions with improved type checks and cloning behavior.

Possibly related issues

Possibly related PRs

Suggested reviewers

  • ymc9: Suggested as a reviewer due to their involvement in related issues and PRs.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (5)
packages/plugins/tanstack-query/tests/test-model-meta.ts (1)

57-73: LGTM! Consider removing redundant isOptional flag.

The relationship between Post and Category is well-defined with proper foreign key mapping and backlink. The optional nature of the relationship aligns with the PR objectives.

The isOptional: true on line 62 is redundant since it's already set in fieldDefaults. Consider removing it for consistency:

 category: {
     ...fieldDefaults,
     type: 'Category',
     name: 'category',
     isDataModel: true,
-    isOptional: true,
     isRelationOwner: true,
     backLink: 'posts',
     foreignKeyMapping: { id: 'categoryId' },
 },
packages/runtime/src/cross/mutator.ts (1)

168-168: Consider optimizing object updates

The changes correctly handle nested field updates and prevent invalid assignments. However, there's room for optimization in how objects are cloned.

Consider batching multiple field updates before creating a new object to reduce object spread operations:

-            if (r && typeof r === 'object') {
-                resultData = { ...resultData, [key]: r };
-                updated = true;
-            }
+            if (r && typeof r === 'object') {
+                if (!updated) {
+                    resultData = { ...resultData };
+                    updated = true;
+                }
+                resultData[key] = r;
+            }

This optimization would prevent creating a new object for each field update while maintaining immutability.

Also applies to: 184-187

packages/plugins/tanstack-query/tests/react-hooks-v5.test.tsx (3)

390-390: Fix typographical errors in comments

  • Line 390: The comment has a typo: 'pupulate' should be 'populate'.
  • Line 504: The word 'relatonship' should be 'relationship'.

Also applies to: 504-504


495-496: Address the TODO regarding category inclusion

In lines 495-496, there's a TODO comment questioning whether the category object should be included in the post's data. Consider updating the assertion to include the category object if it's part of the expected behavior.

Would you like assistance in updating the test assertion to include the category object?


355-356: Consider using explicit TypeScript interfaces instead of any

Defining specific interfaces for userData, categoryData, and postData can improve type safety and code readability in your tests.

Also applies to: 391-392, 505-506, 597-598

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between b7c6c87 and 9a31bcb.

📒 Files selected for processing (3)
  • packages/plugins/tanstack-query/tests/react-hooks-v5.test.tsx (3 hunks)
  • packages/plugins/tanstack-query/tests/test-model-meta.ts (1 hunks)
  • packages/runtime/src/cross/mutator.ts (3 hunks)
🔇 Additional comments (8)
packages/plugins/tanstack-query/tests/test-model-meta.ts (1)

77-96: LGTM! Consider adding deleteCascade rule for Category.

The Category model is well-structured with proper bidirectional relationship to Post.

Let's verify if we need a deleteCascade rule for Category:

packages/runtime/src/cross/mutator.ts (2)

Line range hint 154-163: LGTM: Improved type safety for array mutations

The added type check ensures that only valid object values are used when updating array items, preventing potential issues with null values in optional relationships.


163-166: LGTM: Essential fixes for data integrity

Two important improvements:

  1. The null check properly handles optional relationships
  2. Cloning prevents mutations of the original data during iteration, which could lead to bugs

This change directly addresses the PR's objective of handling null values in optional relationships.

packages/plugins/tanstack-query/tests/react-hooks-v5.test.tsx (5)

14-15: Good use of a BASE_URL constant

Defining BASE_URL enhances maintainability by avoiding hardcoded URLs and making the base URL easily configurable.


30-30: Updated makeUrl function to use BASE_URL

The makeUrl function now utilizes the BASE_URL constant, improving consistency and maintainability.


350-499: Added test for optimistic create with deeply nested relationships

The new test optimistic create updating deeply nested query effectively tests the optimistic update functionality when creating a post connected to both a user and a category. The test correctly populates the cache and asserts that the optimistic updates are reflected in deeply nested queries.


501-591: Added test for optimistic update with optional one-to-many relationship

The test optimistic update with optional one-to-many relationship correctly verifies that optimistic updates work as expected when updating a post with a nullable category relationship. The implementation accurately reflects the intended functionality.


593-692: Added test for optimistic update with nested optional relationships

The test optimistic update with nested optional one-to-many relationship effectively ensures that optimistic updates propagate correctly through nested data structures, even when optional relationships have null values.

Copy link
Member

@ymc9 ymc9 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Thank you for the carefully crafted test cases!

@ymc9 ymc9 merged commit a75f8d9 into zenstackhq:dev Nov 26, 2024
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants