[ { "category": "functional", "description": "Source list auto-refreshes after creating a source via URL - useCreateSource invalidates sourcesInfinite query key so the notebook source list updates without manual refresh", "steps": [ "Step 1: Navigate to a notebook page", "Step 2: Note the current source list contents", "Step 3: Add a new source via URL (which uses useCreateSource with async_processing)", "Step 4: Verify the toast notification appears", "Step 5: Verify the source list automatically updates to include the new source without manual page refresh" ], "passes": true }, { "category": "functional", "description": "Source list auto-refreshes after file upload - useFileUpload invalidates sourcesInfinite query key so the notebook source list updates without manual refresh", "steps": [ "Step 1: Navigate to a notebook page", "Step 2: Note the current source list contents", "Step 3: Upload a file as a new source (which uses useFileUpload)", "Step 4: Verify the toast notification appears", "Step 5: Verify the source list automatically updates to include the new uploaded source without manual page refresh" ], "passes": true }, { "category": "functional", "description": "Source list auto-refreshes after creating a text source - useCreateSource handles text type sources and invalidates sourcesInfinite", "steps": [ "Step 1: Navigate to a notebook page", "Step 2: Add a new text source via the add source dialog", "Step 3: Verify the source list automatically updates to include the new text source" ], "passes": true }, { "category": "functional", "description": "Batch source creation refreshes list - when multiple sources are added in batch mode, the source list updates after each", "steps": [ "Step 1: Navigate to a notebook page", "Step 2: Use the batch mode to add multiple URLs at once", "Step 3: Verify the source list updates to show the newly added sources" ], "passes": true }, { "category": "functional", "description": "Source list shows processing status for async sources - new sources appear with processing indicator while being processed in the background", "steps": [ "Step 1: Navigate to a notebook page", "Step 2: Add a new source with async_processing enabled", "Step 3: Verify the source appears in the list with a processing/queued status indicator", "Step 4: Wait for processing to complete", "Step 5: Verify the source status updates to completed without manual refresh (via useSourceStatus polling)" ], "passes": true }, { "category": "functional", "description": "Existing source operations still work - useDeleteSource, useUpdateSource, useAddSourcesToNotebook, useRemoveSourceFromNotebook continue to properly refresh the source list", "steps": [ "Step 1: Navigate to a notebook with existing sources", "Step 2: Delete a source and verify it disappears from the list", "Step 3: Add an existing source from another notebook and verify it appears", "Step 4: Remove a source from the notebook and verify it disappears" ], "passes": true }, { "category": "functional", "description": "Multi-notebook source creation refreshes all affected notebooks - when a source is created targeting multiple notebooks, sourcesInfinite is invalidated for each", "steps": [ "Step 1: Open a notebook page", "Step 2: Create a source targeting multiple notebooks via the notebooks field", "Step 3: Verify the current notebook's source list updates", "Step 4: Navigate to another targeted notebook", "Step 5: Verify that notebook's source list also shows the new source" ], "passes": true }, { "category": "style", "description": "No visual regressions in source list after fix - the source list layout, infinite scroll, and loading states remain unchanged", "steps": [ "Step 1: Navigate to a notebook with many sources (enough for infinite scroll)", "Step 2: Verify sources display correctly with proper cards", "Step 3: Scroll down to trigger infinite scroll loading", "Step 4: Verify additional sources load correctly", "Step 5: Add a new source and verify the list updates without layout jumps or visual glitches" ], "passes": true } ]