File size: 2,619 Bytes
ffcf6c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from hackathon_advisor.dashboard import build_dashboard_payload
from hackathon_advisor.data import Project, ProjectIndex, build_index_payload
from hackathon_advisor.dashboard_search import DashboardSearchIndex


def test_dashboard_search_bm25_ranks_text_matches() -> None:
    project_index = fake_project_index()
    payload = build_dashboard_payload(project_index, generated_at="2026-06-08T00:00:00+00:00")
    search_index = DashboardSearchIndex(project_index.projects, payload)

    result = search_index.search("project 4 summary", limit=3)

    assert result["algorithm"] == "bm25-text-v1"
    assert result["results"]
    assert result["results"][0]["project_id"] == "build-small-hackathon/project-4"
    assert result["results"][0]["score"] == 1.0
    assert result["results"][0]["snippets"]


def test_dashboard_search_splits_slug_tokens() -> None:
    project_index = fake_project_index()
    payload = build_dashboard_payload(project_index, generated_at="2026-06-08T00:00:00+00:00")
    search_index = DashboardSearchIndex(project_index.projects, payload)

    result = search_index.search("project-7", limit=3)

    assert result["results"][0]["project_id"] == "build-small-hackathon/project-7"
    assert "project-7" in result["results"][0]["matched_terms"]


def fake_project_index() -> ProjectIndex:
    projects = [
        Project(
            id=f"build-small-hackathon/project-{index}",
            title=f"Project {index}",
            summary=f"Offline project planner {index}",
            tags=("gradio", "local-first"),
            models=("tiny-model",),
            datasets=(),
            likes=index,
            sdk="gradio",
            license="mit",
            created_at="2026-06-01T00:00:00+00:00",
            last_modified=f"2026-06-{index + 1:02d}T00:00:00+00:00",
            host=f"https://project-{index}.hf.space",
            url=f"https://huggingface.co/spaces/build-small-hackathon/project-{index}",
            app_file="app.py",
            app_file_embedding_text=f"local inference gradio small model artifact project {index}",
            readme_body=f"README evidence for project {index}",
        )
        for index in range(10)
    ]
    embeddings = []
    for index in range(10):
        vector = [0.0] * 10
        vector[index] = 1.0
        embeddings.append(vector)
    generated_at = "2026-06-08T00:00:00+00:00"
    source = "https://example.test/spaces"
    return ProjectIndex(
        projects=projects,
        generated_at=generated_at,
        source=source,
        index_payload=build_index_payload(projects, generated_at, source, embeddings),
    )