File size: 3,947 Bytes
3291500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""Tests for src.parser — natural language time query parsing."""
import sys
from pathlib import Path
from datetime import datetime, timedelta
from unittest.mock import patch

sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from src.parser import parse_query, describe_query


class TestParseQuery:
    def test_latest_week(self):
        assert parse_query("最新一周") == {"mode": "latest"}
        assert parse_query("分析最新一周") == {"mode": "latest"}

    def test_prev_week(self):
        assert parse_query("上周") == {"mode": "prev"}
        assert parse_query("分析上一周") == {"mode": "prev"}

    def test_yesterday(self):
        result = parse_query("昨天")
        expected_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
        assert result == {"mode": "day", "date": expected_date}

    def test_day_before_yesterday(self):
        result = parse_query("前天")
        expected_date = (datetime.now() - timedelta(days=2)).strftime("%Y-%m-%d")
        assert result == {"mode": "day", "date": expected_date}

    def test_today(self):
        result = parse_query("今天")
        expected_date = datetime.now().strftime("%Y-%m-%d")
        assert result == {"mode": "day", "date": expected_date}

    def test_specific_date_iso(self):
        result = parse_query("2026-03-15")
        assert result == {"mode": "day", "date": "2026-03-15"}

    def test_specific_date_chinese(self):
        result = parse_query("26年3月15日")
        assert result == {"mode": "day", "date": "2026-03-15"}

    def test_month_chinese(self):
        result = parse_query("26年2月")
        assert result == {"mode": "month", "year": 2026, "month": 2}

    def test_month_full_year(self):
        result = parse_query("2025年12月")
        assert result == {"mode": "month", "year": 2025, "month": 12}

    def test_month_previous(self):
        result = parse_query("上个月")
        now = datetime.now()
        expected_month = now.month - 1
        expected_year = now.year
        if expected_month < 1:
            expected_month = 12
            expected_year -= 1
        assert result == {"mode": "month", "year": expected_year, "month": expected_month}

    def test_week_w_notation(self):
        result = parse_query("W9")
        assert result == {"mode": "week", "year": datetime.now().year, "week": 9}

    def test_year_week(self):
        result = parse_query("2026年W12")
        assert result == {"mode": "week", "year": 2026, "week": 12}

    def test_range_tilde(self):
        result = parse_query("1.15~3.3")
        year = datetime.now().year
        assert result == {"mode": "range", "start": f"{year}-01-15", "end": f"{year}-03-03"}

    def test_range_chinese_dates(self):
        result = parse_query("2026-01-15~2026-03-03")
        assert result == {"mode": "range", "start": "2026-01-15", "end": "2026-03-03"}

    def test_unrecognized_returns_none(self):
        assert parse_query("hello world") is None

    def test_prefix_stripped(self):
        result = parse_query("分析昨天")
        expected_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
        assert result == {"mode": "day", "date": expected_date}


class TestDescribeQuery:
    def test_latest(self):
        assert describe_query({"mode": "latest"}) == "最新一周"

    def test_prev(self):
        assert describe_query({"mode": "prev"}) == "上一周"

    def test_week(self):
        assert describe_query({"mode": "week", "year": 2026, "week": 9}) == "2026年 第9周"

    def test_month(self):
        assert describe_query({"mode": "month", "year": 2026, "month": 3}) == "2026年3月"

    def test_day(self):
        assert describe_query({"mode": "day", "date": "2026-03-15"}) == "2026-03-15"

    def test_range(self):
        assert describe_query({"mode": "range", "start": "2026-01-15", "end": "2026-03-03"}) == "2026-01-15 ~ 2026-03-03"