46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from garmin_coach_clone.redact import redact
|
|
|
|
|
|
def test_redact_preserves_workout_schema_ids() -> None:
|
|
data = {
|
|
"stepType": {"stepTypeId": 1, "stepTypeKey": "warmup"},
|
|
"targetType": {"workoutTargetTypeId": 1, "workoutTargetTypeKey": "no.target"},
|
|
"endCondition": {"conditionTypeId": 2, "conditionTypeKey": "time"},
|
|
}
|
|
|
|
assert redact(data) == data
|
|
|
|
|
|
def test_redact_private_account_and_device_fields() -> None:
|
|
data = {
|
|
"email": "rider@example.com",
|
|
"displayName": "Rider",
|
|
"unitId": 123456,
|
|
"ownerId": 999,
|
|
"deviceId": 888,
|
|
}
|
|
|
|
redacted = redact(data)
|
|
|
|
assert redacted["email"] == "<redacted>"
|
|
assert redacted["displayName"] == "<redacted>"
|
|
assert redacted["unitId"] == "<redacted>"
|
|
assert redacted["ownerId"] == "<redacted>"
|
|
assert redacted["deviceId"] == "<redacted>"
|
|
|
|
|
|
def test_redact_sensitive_values_inside_strings() -> None:
|
|
data = {
|
|
"message": "Contact rider@example.com with Authorization: Bearer abc.def.ghi",
|
|
}
|
|
|
|
redacted = redact(data)
|
|
|
|
assert "rider@example.com" not in redacted["message"]
|
|
assert "abc.def.ghi" not in redacted["message"]
|
|
assert "<redacted-email>" in redacted["message"]
|
|
assert "Bearer <redacted-token>" in redacted["message"]
|
|
|