File size: 2,520 Bytes
16e4ad5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9fc7d91
16e4ad5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"""Integration tests for the Pigeon Pea Pangenome Atlas."""

import pytest
from pathlib import Path

from src.state import AppState
from src.callbacks import (
    on_line_selected, build_umap_plot, build_donut_chart,
    build_treasure_table, on_pin_gene, build_hotspot_heatmap,
    get_protein_stats_html, on_generate_report,
)
from src.gene_card import build_gene_card, render_gene_card_html


class TestFullFlow:

    def test_full_flow(self, synthetic_data):
        """Simulate: select line -> UMAP -> thresholds -> gene card -> pin -> report."""
        state = AppState()

        # Step 1: Select line
        line_id = synthetic_data["line_stats"].iloc[0]["line_id"]
        total, unique, neighbor, state = on_line_selected(line_id, state, synthetic_data)
        assert state.selected_line == line_id

        # Step 2: View UMAP
        fig = build_umap_plot("Country", state, synthetic_data)
        assert fig is not None

        # Step 3: Change thresholds
        donut = build_donut_chart(90, 10, synthetic_data)
        assert donut is not None

        # Step 4: View treasure table
        table = build_treasure_table(state, 90, 10, "All", synthetic_data)
        assert len(table) > 0

        # Step 5: Click gene -> gene card
        gene_id = table.iloc[0]["gene_id"]
        card = build_gene_card(gene_id, synthetic_data)
        html = render_gene_card_html(card)
        assert gene_id in html

        # Step 6: Pin gene
        state.selected_gene = gene_id
        _, state = on_pin_gene(gene_id, state)
        assert gene_id in state.backpack_genes

        # Step 7: Generate report
        report_md, json_file, csv_file, badges, state = on_generate_report(state, synthetic_data)
        assert len(report_md) > 100
        assert "Cartographer" in state.achievements


class TestPrecomputedConsistency:

    def test_embedding_line_ids(self, synthetic_data):
        """All line_ids in embedding exist in line_stats."""
        emb_lines = set(synthetic_data["embedding"]["line_id"])
        stat_lines = set(synthetic_data["line_stats"]["line_id"])
        assert emb_lines.issubset(stat_lines)

    def test_marker_gene_ids(self, synthetic_data):
        """All gene_ids in markers exist in gene_freq."""
        if len(synthetic_data["markers"]) == 0:
            pytest.skip("No markers computed")
        marker_genes = set(synthetic_data["markers"]["gene_id"])
        freq_genes = set(synthetic_data["gene_freq"]["gene_id"])
        assert marker_genes.issubset(freq_genes)