import pytest from jira_hub import mirror, projects, settings @pytest.fixture def conn(open_db): c = open_db() settings.ensure_defaults(c) return c @pytest.mark.parametrize("label", ["", "STOCKS DRRK", "A\tB", "A,B", 'A"B', "A'B", "A(B", "A)B", "X" * 101, 5, None]) def test_bad_label(conn, label): with pytest.raises(projects.ProjectError) as e: projects.create(conn, label, "Название") assert e.value.field == "label" assert projects.list_projects(conn) == [] @pytest.mark.parametrize("name", ["", " ", "Я" * 101, None, 7]) def test_bad_name(conn, name): with pytest.raises(projects.ProjectError) as e: projects.create(conn, "AWPCA", name) assert e.value.field == "name" assert projects.list_projects(conn) == [] @pytest.mark.parametrize("board", [0, -1, True, "5120", 1.5]) def test_bad_board(conn, board): with pytest.raises(projects.ProjectError) as e: projects.create(conn, "AWPCA", "АРМ КА", board) assert e.value.field == "board_id" assert projects.list_projects(conn) == [] def test_create_and_list(conn): a = projects.create(conn, "AWPCA", " АРМ КА ", 4216) assert a == {"label": "AWPCA", "name": "АРМ КА", "board_id": 4216, "board_type": None, "created_at": a["created_at"]} projects.create(conn, "STOCKS_DRRK", "Запасы ДРРК") mirror.apply_state(conn, [{"key": "A-1", "labels": ["AWPCA"]}, {"key": "A-2", "labels": ["awpca", "x"]}], []) got = projects.list_projects(conn) assert [(p["label"], p["board_id"], p["issues_count"]) for p in got] == [("AWPCA", 4216, 1), ("STOCKS_DRRK", None, 0)] def test_order_created_then_label(conn): projects.create(conn, "ZZZ", "z"); projects.create(conn, "AAA", "a"); projects.create(conn, "MMM", "m") conn.execute("UPDATE project SET created_at = '2026-01-01T00:00:00+00:00' WHERE label IN ('AAA', 'MMM')") conn.execute("UPDATE project SET created_at = '2026-01-02T00:00:00+00:00' WHERE label = 'ZZZ'") assert projects.labels(conn) == ["AAA", "MMM", "ZZZ"] def test_same_label_other_case(conn): projects.create(conn, "AWPCA", "АРМ КА") with pytest.raises(projects.ProjectExists) as e: projects.create(conn, "awpca", "…") assert "уже есть" in str(e.value) and len(projects.list_projects(conn)) == 1 def test_base_jql(conn): assert projects.base_jql(conn) is None projects.create(conn, "AWPCA", "АРМ КА"); projects.create(conn, "STOCKS_DRRK", "Запасы ДРРК") assert projects.base_jql(conn) == "project = AURORA AND labels in (AWPCA, STOCKS_DRRK)" settings.set_(conn, "project_key", "AUR") assert projects.base_jql(conn).startswith("project = AUR AND") def test_boards_dedup_and_types(conn): projects.create(conn, "AWPCA", "a", 4216); projects.create(conn, "B", "b", 5120) projects.create(conn, "C", "c", 4216); projects.create(conn, "D", "d") projects.record_board_types(conn, {"4216": "scrum"}) assert projects.boards(conn) == [{"id": 4216, "type": "scrum"}, {"id": 5120, "type": None}] assert projects.get(conn, "C")["board_type"] == "scrum" # тип — у всех проектов с этой доской @pytest.mark.parametrize("boards", [{"5120": None}, {"5120": "simple"}, {"x": "kanban"}, ["5120"], None, {}]) def test_record_board_types_ignores(conn, boards): projects.create(conn, "B", "b", 5120) assert projects.record_board_types(conn, boards) == 0 assert projects.get(conn, "B")["board_type"] is None @pytest.mark.parametrize("jql, labels", [ ("project = AURORA AND labels = AWPCA", ["AWPCA"]), ("project = AURORA AND labels in (AWPCA, STOCKS_DRRK)", ["AWPCA", "STOCKS_DRRK"]), ("project = AURORA AND labels IN (A,B)", ["A", "B"]), ('project = AURORA AND labels = "AWPCA"', ["AWPCA"]), ("project = AURORA AND labels in (AWPCA, awpca)", ["AWPCA"]), ("project = AURORA", None), ("project = AURORA AND labels = AWPCA ORDER BY key", None), ("project = AURORA AND labels in (A B)", None), ("", None), (None, None), (5, None), ]) def test_parse_legacy_labels(jql, labels): assert projects.parse_legacy_labels(jql) == labels def test_add_project_fixture(conn, add_project): p = add_project(conn) assert (p["name"], p["board_id"], p["board_type"]) == ("АРМ КА", 4216, "scrum")