sadpandajoe commented on code in PR #43108:
URL: https://github.com/apache/superset/pull/43108#discussion_r4173720142


##########
superset-frontend/src/dashboard/containers/DashboardPage.test.tsx:
##########
@@ -630,3 +631,593 @@ test('clears undo history after hydrating the dashboard', 
async () => {
     .invocationCallOrder[0];
   expect(clearOrder).toBeGreaterThan(hydrateOrder);
 });
+
+// ---------------------------------------------------------------------------
+// localStorage filter persistence
+// ---------------------------------------------------------------------------
+
+test('restores native filter state from localStorage when no URL key is 
present', async () => {
+  // Versioned format: { dataMask, filterDefinitions }. The current code 
rejects
+  // unversioned entries (ID-only check) since the key has not shipped yet.
+  const savedVersioned = {
+    dataMask: {
+      'NATIVE_FILTER-abc123': {
+        filterState: { value: ['California'] },
+        extraFormData: {
+          filters: [{ col: 'state', op: 'IN', val: ['California'] }],
+        },
+      },
+    },
+    filterDefinitions: {
+      'NATIVE_FILTER-abc123': {
+        targets: [{ column: { name: 'state' } }],
+        type: 'filter_select',
+      },
+    },
+  };
+  // Authenticated user — key format: 
dashboard__native_filters__{userId}__{dashboardId}
+  localStorage.setItem(
+    'dashboard__native_filters__42__1',
+    JSON.stringify(savedVersioned),
+  );
+
+  // Include the filter ID (with matching targets/type) so versioned 
validation passes.
+  mockUseDashboard.mockReturnValue({
+    result: {
+      ...mockDashboard,
+      metadata: {
+        native_filter_configuration: [
+          {
+            id: 'NATIVE_FILTER-abc123',
+            filterType: 'filter_select',
+            targets: [{ column: { name: 'state' } }],
+          },
+        ],
+      },
+    },
+    error: null,
+  });
+
+  render(
+    <Suspense fallback="loading">
+      <DashboardPage idOrSlug="1" />
+    </Suspense>,
+    {
+      useRedux: true,
+      useRouter: true,
+      initialState: {
+        dashboardInfo: { id: 1, metadata: {} },
+        dashboardState: { sliceIds: [] },
+        nativeFilters: { filters: {} },
+        dataMask: {},
+        user: { userId: 42 },
+      },
+    },
+  );
+
+  await waitFor(() => {
+    expect(screen.queryByText('loading')).not.toBeInTheDocument();
+  });
+
+  expect(hydrateDashboard).toHaveBeenCalledWith(
+    expect.objectContaining({
+      dataMask: expect.objectContaining({
+        'NATIVE_FILTER-abc123': expect.objectContaining({
+          filterState: { value: ['California'] },
+        }),
+      }),
+    }),
+  );
+});
+
+test('skips localStorage restore for guest/embedded users (userId is 
undefined)', async () => {
+  // Guest users have no stable identity; reading localStorage could share
+  // filter state across different guest-token sessions, so the restore path
+  // must be skipped entirely when userId is null/undefined.
+  const savedVersioned = {
+    dataMask: {
+      'NATIVE_FILTER-guest': {
+        filterState: { value: ['SomeValue'] },
+        extraFormData: {},
+      },
+    },
+    filterDefinitions: {
+      'NATIVE_FILTER-guest': {
+        targets: [{ column: { name: 'col' } }],
+        type: 'filter_select',
+      },
+    },
+  };
+  // Write under the guest (dashboard-only) key — should never be read.
+  localStorage.setItem(
+    'dashboard__native_filters__1',
+    JSON.stringify(savedVersioned),
+  );
+
+  render(
+    <Suspense fallback="loading">
+      <DashboardPage idOrSlug="1" />
+    </Suspense>,
+    {
+      useRedux: true,
+      useRouter: true,
+      initialState: {
+        dashboardInfo: { id: 1, metadata: {} },
+        dashboardState: { sliceIds: [] },
+        nativeFilters: { filters: {} },
+        dataMask: {},
+        user: { userId: undefined },
+      },
+    },
+  );
+
+  await waitFor(() => {
+    expect(screen.queryByText('loading')).not.toBeInTheDocument();
+  });
+
+  // dataMask should be empty — guest users skip localStorage restoration
+  expect(hydrateDashboard).toHaveBeenCalledWith(

Review Comment:
   This test still rejects the saved entry even if the guest guard is removed: 
the mocked hook returns the configuration in `json_metadata`, but restore reads 
`dashboard.metadata`, and the saved targets/default mask also differ from the 
new fixture. Could it return matching `metadata.native_filter_configuration`, 
targets, and `defaultDataMask` so removing guest exclusion makes the empty-mask 
assertion fail?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to