{
  "filename": "src/order-search.ts",
  "rule": "- name: search-switches-obsolete-request\n  where: \"src/order-search.ts\"\n  ensure: >-\n    orderSearch must use switchMap for query-dependent requests so subscribing to a new query unsubscribes the previous request.",
  "corrected": "import { HttpClient } from \"@angular/common/http\";\nimport { Observable, of, debounceTime, distinctUntilChanged, switchMap, catchError } from \"rxjs\";\n\nexport function orderSearch(http: HttpClient, query$: Observable<string>) {\n  return query$.pipe(\n    debounceTime(150),\n    distinctUntilChanged(),\n    switchMap(query => http.get<unknown[]>(\"/api/orders\", {params:{q:query}}).pipe(\n      catchError(() => of([])),\n    )),\n  );\n}\n",
  "broken": "import { HttpClient } from \"@angular/common/http\";\nimport { Observable, of, debounceTime, distinctUntilChanged, mergeMap, catchError } from \"rxjs\";\n\nexport function orderSearch(http: HttpClient, query$: Observable<string>) {\n  return query$.pipe(\n    debounceTime(150),\n    distinctUntilChanged(),\n    mergeMap(query => http.get<unknown[]>(\"/api/orders\", {params:{q:query}}).pipe(\n      catchError(() => of([])),\n    )),\n  );\n}\n",
  "regression": [
    "import { HttpClient } from \"@angular/common/http\";\nimport { Observable, of, debounceTime, distinctUntilChanged, switchMap, catchError } from \"rxjs\";\n\nexport function orderSearch(http: HttpClient, query$: Observable<string>) {\n  return query$.pipe(\n    debounceTime(150),\n    distinctUntilChanged(),\n    switchMap(query => http.get<unknown[]>(\"/api/orders\", {params:{q:query}}).pipe(\n      catchError(() => of([])),\n    )),\n  );\n}\n",
    "import { HttpClient } from \"@angular/common/http\";\nimport { Observable, of, debounceTime, distinctUntilChanged, mergeMap, catchError } from \"rxjs\";\n\nexport function orderSearch(http: HttpClient, query$: Observable<string>) {\n  return query$.pipe(\n    debounceTime(150),\n    distinctUntilChanged(),\n    mergeMap(query => http.get<unknown[]>(\"/api/orders\", {params:{q:query}}).pipe(\n      catchError(() => of([])),\n    )),\n  );\n}\n"
  ],
  "test_scenarios": [
    [
      "A then B queries, A slower",
      "Only B result reaches subscriber"
    ],
    [
      "Repeated identical text",
      "No duplicate request"
    ],
    [
      "Component destroyed",
      "Subscription canceled"
    ],
    [
      "Current request fails",
      "Recoverable UI error, future searches still possible"
    ]
  ],
  "test_source": null,
  "test_command": "npx vitest run src/order-search.test.ts"
}