Skip to content

fix: add empty state fallback for unanalyzed tabs#401

Open
Medora140 wants to merge 2 commits into
imDarshanGK:mainfrom
Medora140:fix/empty-state-fallback-ui
Open

fix: add empty state fallback for unanalyzed tabs#401
Medora140 wants to merge 2 commits into
imDarshanGK:mainfrom
Medora140:fix/empty-state-fallback-ui

Conversation

@Medora140
Copy link
Copy Markdown

Description

Implemented proper empty-state handling for result tabs to prevent infinite loading skeletons before analysis is executed.

Users now receive clear fallback messages when switching between Explain, Debug, and Improve tabs without running analysis first.

Related Issue

Fixes #263

Type of change

  • Bug fix
  • New feature / enhancement
  • Documentation update
  • Test addition
  • Refactor

Checklist

  • I have read CONTRIBUTING.md
  • My branch is up to date with main
  • I have run pytest -v and all tests pass
  • I have not introduced duplicate issues or features
  • My PR title follows the format: feat/fix/docs/test: short description
  • I have added tests for new features (Level 2 and 3 issues)
  • No hardcoded secrets or API keys in my code
  • This PR is linked to a GSSoC 2026 issue

Screenshots (if frontend change)

Before

  • Debug and Improve tabs displayed endless loading skeletons
  • Empty panels appeared stuck before analysis
  • No guidance was shown to users
Screenshot 2026-05-26 142737

After

  • Proper empty-state messages are displayed instantly
  • Tabs guide users to run analysis first
  • Infinite loading placeholders are removed
  • Result tab UX is more consistent and accessible
Screenshot 2026-05-27 200753 Screenshot 2026-05-27 200822

Test evidence

pytest -v
============================== test session starts ===============================
platform win32 -- Python 3.12.4, pytest-9.0.3, pluggy-1.6.0 -- C:\Users\Medora Gomes\Desktop\GSSOC\AI-dev-assistant2\AI-dev-assistant\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\Medora Gomes\Desktop\GSSOC\AI-dev-assistant2\AI-dev-assistant
plugins: anyio-4.13.0, asyncio-1.3.0
asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collected 126 items                                                               

backend/tests/test_ai_provider.py::test_call_llm_success PASSED             [  0%]
backend/tests/test_ai_provider.py::test_call_llm_timeout_retries PASSED     [  1%]
backend/tests/test_ai_provider.py::test_call_llm_timeout_exhausted PASSED   [  2%]
backend/tests/test_ai_provider.py::test_call_llm_http_5xx_retries PASSED    [  3%]
backend/tests/test_ai_provider.py::test_call_llm_http_400_no_retry PASSED   [  3%]
backend/tests/test_ai_provider.py::test_call_llm_http_429_retries PASSED    [  4%]
backend/tests/test_ai_provider.py::test_call_llm_disabled PASSED            [  5%]
backend/tests/test_ast_analyzer.py::test_unreachable_code PASSED            [  6%]
backend/tests/test_ast_analyzer.py::test_unused_import PASSED               [  7%]
backend/tests/test_ast_analyzer.py::test_unused_argument PASSED             [  7%]
backend/tests/test_ast_analyzer.py::test_clean_code_no_false_positives PASSED [  8%]
backend/tests/test_ast_analyzer.py::test_correct_line_number_unreachable PASSED [  9%]
backend/tests/test_ast_analyzer.py::test_self_not_flagged_as_unused PASSED  [ 10%]
backend/tests/test_ast_analyzer.py::test_underscore_param_not_flagged PASSED [ 11%]
backend/tests/test_ast_analyzer.py::test_used_alias_not_flagged PASSED      [ 11%]
backend/tests/test_ast_analyzer.py::test_too_many_returns_exact_boundary PASSED [ 12%]
backend/tests/test_ast_analyzer.py::test_unreachable_only_flags_after_not_before PASSED [ 13%]
backend/tests/test_ast_analyzer.py::test_nested_function_returns_not_counted_in_outer PASSED [ 14%]
backend/tests/test_ast_analyzer.py::test_deep_nesting_exact_boundary PASSED [ 15%]
backend/tests/test_digest.py::test_subscribe_success PASSED                 [ 15%]
backend/tests/test_digest.py::test_subscribe_duplicate_returns_409 PASSED   [ 16%]
backend/tests/test_digest.py::test_subscribe_re_activates_after_unsubscribe PASSED [ 17%]
backend/tests/test_digest.py::test_unsubscribe_success PASSED               [ 18%]
backend/tests/test_digest.py::test_unsubscribe_wrong_token PASSED           [ 19%]
backend/tests/test_digest.py::test_unsubscribe_nonexistent PASSED           [ 19%]
backend/tests/test_digest.py::test_get_unsubscribe_link PASSED              [ 20%]
backend/tests/test_digest.py::test_invalid_email PASSED                     [ 21%]
backend/tests/test_digest.py::test_subscribe_stores_token PASSED            [ 22%]
backend/tests/test_endpoints.py::test_root PASSED                           [ 23%]
backend/tests/test_endpoints.py::test_health PASSED                         [ 23%]
backend/tests/test_endpoints.py::test_rate_limit_headers_on_success_response PASSED [ 24%]
backend/tests/test_endpoints.py::test_rate_limit_returns_429_with_retry_after_header PASSED [ 25%]
backend/tests/test_endpoints.py::test_explanation_python PASSED             [ 26%]
backend/tests/test_endpoints.py::test_explanation_no_language_hint PASSED   [ 26%]
backend/tests/test_endpoints.py::test_explanation_rust PASSED               [ 27%]
backend/tests/test_endpoints.py::test_explanation_detects_rust_without_hint PASSED [ 28%]
backend/tests/test_endpoints.py::test_explanation_accepts_rust_hint_alias PASSED [ 29%]
backend/tests/test_endpoints.py::test_explanation_empty_code PASSED         [ 30%]
backend/tests/test_endpoints.py::test_explanation_too_long PASSED           [ 30%]
backend/tests/test_endpoints.py::test_explanation_typescript PASSED         [ 31%]
backend/tests/test_endpoints.py::test_explanation_java PASSED               [ 32%]
backend/tests/test_endpoints.py::test_explanation_cpp PASSED                [ 33%]
backend/tests/test_endpoints.py::test_explanation_cyclomatic_fields_present PASSED [ 34%]
backend/tests/test_endpoints.py::test_explanation_cyclomatic_simple PASSED  [ 34%]
backend/tests/test_endpoints.py::test_explanation_cyclomatic_moderate PASSED [ 35%]
backend/tests/test_endpoints.py::test_explanation_cyclomatic_high PASSED    [ 36%]
backend/tests/test_endpoints.py::test_explanation_cyclomatic_very_high PASSED [ 37%]
backend/tests/test_endpoints.py::test_debug_detects_zero_division PASSED    [ 38%]
backend/tests/test_endpoints.py::test_debug_detects_hardcoded_secret PASSED [ 38%]
backend/tests/test_endpoints.py::test_debug_detects_bare_except PASSED      [ 39%]
backend/tests/test_endpoints.py::test_debug_detects_eval PASSED             [ 40%]
backend/tests/test_endpoints.py::test_debug_clean_code PASSED               [ 41%]
backend/tests/test_endpoints.py::test_debug_javascript PASSED               [ 42%]
backend/tests/test_endpoints.py::test_debug_java PASSED                     [ 42%]
backend/tests/test_endpoints.py::test_debug_cpp PASSED                      [ 43%]
backend/tests/test_endpoints.py::test_explanation_php PASSED                [ 44%]
backend/tests/test_endpoints.py::test_explanation_detects_php_without_hint PASSED [ 45%]
backend/tests/test_endpoints.py::test_debug_php PASSED                      [ 46%]
backend/tests/test_endpoints.py::test_debug_php_buggy_patterns PASSED       [ 46%]
backend/tests/test_endpoints.py::test_debug_rust PASSED                     [ 47%]
backend/tests/test_endpoints.py::test_debug_rust_buggy_patterns PASSED      [ 48%]
backend/tests/test_endpoints.py::test_debug_kotlin PASSED                   [ 49%]
backend/tests/test_endpoints.py::test_debug_cpp_syntax_errors PASSED        [ 50%]
backend/tests/test_endpoints.py::test_debug_issue_has_required_fields PASSED [ 50%]
backend/tests/test_endpoints.py::test_js_ts_security_patterns PASSED        [ 51%]
backend/tests/test_endpoints.py::test_suggestions_returns_score PASSED      [ 52%]
backend/tests/test_endpoints.py::test_suggestions_perfect_score PASSED      [ 53%]
backend/tests/test_endpoints.py::test_suggestions_observability_print_only_python PASSED [ 53%]
backend/tests/test_endpoints.py::test_full_analyze PASSED                   [ 54%]
backend/tests/test_endpoints.py::test_full_analyze_uses_cache_for_identical_inputs PASSED [ 55%]
backend/tests/test_endpoints.py::test_analyze_cache_expires PASSED          [ 56%]
backend/tests/test_endpoints.py::test_memory_cache_evicts_least_recently_used_entries PASSED [ 57%]
backend/tests/test_endpoints.py::test_full_analyze_all_languages PASSED     [ 57%]
backend/tests/test_endpoints.py::test_missing_code_field PASSED             [ 58%]
backend/tests/test_endpoints.py::test_unicode_code PASSED                   [ 59%]
backend/tests/test_endpoints.py::test_single_line_code PASSED               [ 60%]
backend/tests/test_endpoints.py::test_post_stream_returns_event_stream_content_type PASSED [ 61%]
backend/tests/test_endpoints.py::test_post_stream_emits_all_sections PASSED [ 61%]
backend/tests/test_endpoints.py::test_get_stream_returns_event_stream_content_type PASSED [ 62%]
backend/tests/test_endpoints.py::test_get_stream_emits_all_sections PASSED  [ 63%]
backend/tests/test_endpoints.py::test_get_stream_done_event_present PASSED  [ 64%]
backend/tests/test_endpoints.py::test_get_stream_with_language_hint PASSED  [ 65%]
backend/tests/test_endpoints.py::test_get_stream_empty_code_rejected PASSED [ 65%]
backend/tests/test_file_upload.py::test_upload_allowed_files[test.py-print('hello')-text/x-python] PASSED [ 66%]
backend/tests/test_file_upload.py::test_upload_allowed_files[test.js-console.log('hello')-application/javascript] PASSED [ 67%]
backend/tests/test_file_upload.py::test_upload_allowed_files[test.ts-const x: number = 10;-application/typescript] PASSED [ 68%]
backend/tests/test_file_upload.py::test_upload_allowed_files[test.java-class Main {}-text/x-java-source] PASSED [ 69%]
backend/tests/test_file_upload.py::test_upload_allowed_files[test.cpp-#include <iostream>-text/x-c++src] PASSED [ 69%]
backend/tests/test_file_upload.py::test_upload_allowed_files[test.txt-hello world-text/plain] PASSED [ 70%]
backend/tests/test_file_upload.py::test_upload_blocked_files[virus.exe-malware] PASSED [ 71%]
backend/tests/test_file_upload.py::test_upload_blocked_files[script.bat-echo hacked] PASSED [ 72%]
backend/tests/test_file_upload.py::test_upload_blocked_files[shell.sh-rm -rf /] PASSED [ 73%]
backend/tests/test_file_upload.py::test_upload_blocked_files[powershell.ps1-Write-Host hacked] PASSED [ 73%]
backend/tests/test_file_upload.py::test_upload_blocked_files[payload.dll-binarydata] PASSED [ 74%]
backend/tests/test_file_upload.py::test_upload_blocked_files[installer.msi-installer] PASSED [ 75%]
backend/tests/test_file_upload.py::test_invalid_mime_type PASSED            [ 76%]
backend/tests/test_file_upload.py::test_double_extension PASSED             [ 76%]
backend/tests/test_file_upload.py::test_no_file_uploaded PASSED             [ 77%]
backend/tests/test_file_upload.py::test_large_file PASSED                   [ 78%]
backend/tests/test_ping.py::test_ping PASSED                                [ 79%]
backend/tests/test_python_ast_analyzer.py::test_detects_missing_bracket_syntax_error PASSED [ 80%]
backend/tests/test_python_ast_analyzer.py::test_detects_invalid_indentation_syntax_error PASSED [ 80%]
backend/tests/test_python_ast_analyzer.py::test_detects_division_by_zero_expression PASSED [ 81%]
backend/tests/test_python_ast_analyzer.py::test_detects_division_by_zero_inside_function_call PASSED [ 82%]
backend/tests/test_python_ast_analyzer.py::test_detects_out_of_range_list_index PASSED [ 83%]
backend/tests/test_python_ast_analyzer.py::test_detects_out_of_range_string_index PASSED [ 84%]
backend/tests/test_python_ast_analyzer.py::test_detects_string_integer_concatenation PASSED [ 84%]
backend/tests/test_share.py::test_create_and_fetch_share PASSED             [ 85%]
backend/tests/test_share.py::test_expired_share_returns_404 PASSED          [ 86%]
tests/test_api_integration.py::test_debugging_endpoint_with_line_numbers PASSED [ 87%]
tests/test_api_integration.py::test_suggestions_endpoint_with_line_ranges PASSED [ 88%]
tests/test_api_integration.py::test_analyze_endpoint_integration PASSED     [ 88%]
tests/test_api_integration.py::test_context_in_response PASSED              [ 89%]
tests/test_api_integration.py::test_line_numbers_are_correct PASSED         [ 90%]
tests/test_line_references.py::test_format_code_snippet PASSED              [ 91%]
tests/test_line_references.py::test_find_lines_matching_pattern PASSED      [ 92%]
tests/test_line_references.py::test_find_function_lines_python PASSED       [ 92%]
tests/test_line_references.py::test_find_undocumented_lines PASSED          [ 93%]
tests/test_line_references.py::test_bug_detection_has_line_numbers PASSED   [ 94%]
tests/test_line_references.py::test_suggestions_include_line_ranges PASSED  [ 95%]
tests/test_line_references.py::test_magic_numbers_detection_with_lines PASSED [ 96%]
tests/test_line_references.py::test_documentation_quality_with_lines PASSED [ 96%]
tests/test_line_references.py::test_response_schema PASSED                  [ 97%]
tests/test_line_references.py::test_line_numbers_are_one_based PASSED       [ 98%]
tests/test_line_references.py::test_empty_code_edge_case PASSED             [ 99%]
tests/test_line_references.py::test_large_code_performance PASSED           [100%]

============================== 126 passed in 9.54s ===============================

@Medora140 Medora140 requested a review from imDarshanGK as a code owner May 27, 2026 14:51
@Medora140
Copy link
Copy Markdown
Author

Hi @imDarshanGK , All merge conflicts have been resolved. Please let me know if any changes are needed.

@imDarshanGK
Copy link
Copy Markdown
Owner

@Medora140 update your branch with the latest main changes and resolve conflicts

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.

[Bug] Add Empty State Fallback for Unanalyzed Sections in Analysis Results UI

2 participants