hackathon-advisor / tests /test_dashboard_search.py
JacobLinCool's picture
feat: add atlas project search
ffcf6c4 verified
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),
)