File size: 2,406 Bytes
8348f0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1d7d962
 
 
 
 
 
 
 
 
 
 
 
8348f0b
 
 
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
import unittest

from app.services.running_coaching import build_run_analysis, build_running_profile


class RunningCoachingTests(unittest.TestCase):
    def test_prioritizes_high_load_and_low_cadence(self):
        analysis = build_run_analysis(
            {
                "sample_count": 80,
                "avg_heart_rate_bpm": 154,
                "heart_rate_rise_bpm": 16,
                "avg_cadence_spm": 142,
                "avg_ground_contact_time_ms": 330,
                "avg_vertical_oscillation_cm": 11.4,
                "avg_left_right_asymmetry_pct": 9.2,
            }
        )

        self.assertEqual([item["key"] for item in analysis["focus"]], ["heart_rate", "cadence"])
        self.assertIn("보폭", analysis["focus"][1]["action"])

    def test_does_not_warn_when_form_values_are_stable(self):
        analysis = build_run_analysis(
            {
                "sample_count": 80,
                "avg_heart_rate_bpm": 148,
                "avg_cadence_spm": 170,
                "avg_ground_contact_time_ms": 280,
                "avg_vertical_oscillation_cm": 8.0,
                "avg_left_right_asymmetry_pct": 3.1,
            }
        )

        self.assertEqual(analysis["focus"], [])
        self.assertGreaterEqual(len(analysis["strengths"]), 2)

    def test_profile_uses_repeated_sensor_records(self):
        profile = build_running_profile(
            [
                {"sensor_summary": {"avg_cadence_spm": 142, "avg_ground_contact_time_ms": 325}},
                {"sensor_summary": {"avg_cadence_spm": 145, "avg_ground_contact_time_ms": 320}},
                {"sensor_summary": {"avg_cadence_spm": 148, "avg_ground_contact_time_ms": 315}},
            ]
        )

        self.assertEqual(profile["status"], "ready")
        self.assertEqual(profile["next_focus"]["title"], "러닝 리듬")
        self.assertEqual(profile["sample_size"], 3)

    def test_heart_rate_only_records_do_not_ready_form_profile(self):
        profile = build_running_profile(
            [
                {"sensor_summary": {"avg_heart_rate_bpm": 145}},
                {"sensor_summary": {"avg_heart_rate_bpm": 148}},
                {"sensor_summary": {"avg_heart_rate_bpm": 150}},
            ]
        )

        self.assertEqual(profile["status"], "collecting")
        self.assertEqual(profile["sample_size"], 0)


if __name__ == "__main__":
    unittest.main()