Initial import: eCW Charge Validation bot and results Portal

Snapshot of the working project as of 2026-10-23 (local 2d4d4fc), one
commit with no earlier history: the tracked files were de-identified
first (synthetic claim ids and patient data only; see Context.md
section 7). Credentials, run logs, screenshots, claim reports and client
workbooks are gitignored and not included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ManikandanandClaude Opus 5.5 committed 2026-10-23 18:38:17 +05:30
commit ba15a574ab
205 files changed
+56772

No files matched your search

+104
View File
@@ -0,0 +1,104 @@
r"""
The Dental Claim screen (mapped from live claim 9125000 — DentaQuest) is a
THIRD claim-form shape, distinct from both the UB form and the
professional/HCFA "Claim" screen — see dental_claim.html's own comment for
exactly what differs.
python tests\test_dental_claim_skip.py
Real bug this guards: before is_dental_claim_form()/SEL_CANCEL_DENTAL
existed, `open_claim()` waited the full NAV_TIMEOUT (5 minutes) for a
UB/HCFA marker that never appears on this screen — the same failure shape
already fixed once for HCFA (claim 9103000) — and `close_claim()` burned
through every UB/HCFA attempt before giving up with the modal still open,
ready to collide with the next claim in the loop. No condition in this
codebase understands the Dental screen's shape (its CPT rows carry no
CPTROW_ id at all), so the fix is to detect it immediately and skip
straight to closing, never attempting an extract().
"""
import sys
import pathlib
import inspect
ROOT = pathlib.Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT / "src"))
FIXTURE = pathlib.Path(__file__).resolve().parent / "fixtures" / "dental_claim.html"
from ecw_bot.pages import claim_form # noqa: E402
from ecw_bot.selectors import claim_form as sel # noqa: E402
CASES = []
def case(fn):
CASES.append(fn)
return fn
@case
def is_dental_claim_form_is_true_for_the_dental_screen(page):
assert claim_form.is_dental_claim_form(page) is True
@case
def is_ub_claim_form_is_false_for_the_dental_screen(page):
assert claim_form.is_ub_claim_form(page) is False
@case
def any_claim_form_open_matches_the_dental_screen(page):
"""
The exact selector open_claim() waits on. Before SEL_CANCEL_DENTAL was
added, this would not match the Dental screen at all, and open_claim()
would burn the full 5-minute NAV_TIMEOUT waiting for it.
"""
assert page.locator(sel.SEL_ANY_CLAIM_FORM_OPEN).first.is_visible()
@case
def close_claim_uses_the_dental_screens_own_cancel_first(page):
assert page.locator("#cancelDentalClaimButton").first.is_visible()
assert claim_form.close_claim(page) is True
assert not page.locator("#cancelDentalClaimButton").first.is_visible()
def main() -> int:
if not FIXTURE.exists():
print(f" FAIL fixture missing: {FIXTURE}")
return 1
try:
from playwright.sync_api import sync_playwright
except ImportError:
print(" SKIP playwright is not installed")
return 0
failures = 0
with sync_playwright() as pw:
browser = pw.chromium.launch(headless=True)
page = browser.new_page()
for fn in CASES:
name = fn.__name__.replace("_", " ")
try:
page.goto(FIXTURE.as_uri())
if len(inspect.signature(fn).parameters) == 0:
fn()
else:
fn(page)
print(f" ok {name}")
except AssertionError as exc:
print(f" FAIL {name}: {exc}")
failures += 1
except Exception as exc:
print(f" ERROR {name}: {type(exc).__name__}: {exc}")
failures += 1
browser.close()
print(f"\n{len(CASES) - failures}/{len(CASES)} passed")
return 1 if failures else 0
if __name__ == "__main__":
sys.exit(main())