import uuid import pytest from factories import seed_job from httpx import AsyncClient @pytest.mark.parametrize( "paging", [{"limit": 0}, {"limit": -1}, {"limit": 501}, {"offset": -1}] ) async def test_out_of_range_paging_is_422_not_500(client: AsyncClient, paging: dict) -> None: r = await client.get("/api/variants", params={"job_id": str(uuid.uuid4()), **paging}) assert r.status_code == 422 async def positions(client: AsyncClient, job_id: uuid.UUID) -> list[tuple[str, int, str]]: r = await client.get("/api/variants", params={"job_id": str(job_id)}) assert r.status_code == 200, r.text return [(v["chrom"], v["pos"], v["alt"]) for v in r.json()["items"]] @pytest.mark.usefixtures("db") async def test_chromosomes_sort_naturally(client: AsyncClient) -> None: job_id = await seed_job([{"chrom": c} for c in ["10", "MT", "2", "X", "chr3", "1", "Y"]]) assert [c for c, _, _ in await positions(client, job_id)] == [ "1", "2", "chr3", "10", "X", "Y", "MT", ] @pytest.mark.usefixtures("db") async def test_same_position_keeps_insertion_order_across_pages(client: AsyncClient) -> None: # Split multiallelics share chrom/pos; without a tiebreak, pages can repeat or skip rows. job_id = await seed_job([{"pos": 5, "alt": a} for a in "CGT"]) assert [a for _, _, a in await positions(client, job_id)] == ["C", "G", "T"] @pytest.mark.usefixtures("db") async def test_long_vep_strings_are_stored(client: AsyncClient) -> None: clin_sig = ",".join(["conflicting_classifications_of_pathogenicity"] * 8) consequence = ( "splice_region_variant&splice_polypyrimidine_tract_variant&intron_variant" "&NMD_transcript_variant&non_coding_transcript_variant" ) job_id = await seed_job([{"clinvar_sig": clin_sig, "consequence": consequence}]) [v] = (await client.get("/api/variants", params={"job_id": str(job_id)})).json()["items"] assert (v["clinvar_sig"], v["consequence"]) == (clin_sig, consequence)