active: true
derived: false
groups:
- LIFE
header: |
  Retention テスト
level: 2.17
links:
- SPEC017: fqUVyA-owzYub0Ug6OaSuAEg1ldj7K_h7kqaWmpLoX0=
normative: true
ref: ''
references:
- path: tests/unit/test_lifecycle_extended.py
  type: file
reviewed: A2eMKXEuA2xz7qGDbMVlsuayLct4R_IepfDeseBUdtI=
text: |
  ## 目的

  `Retention` はキャッシュの有効期間をユーザーフレンドリーな形式で指定する値オブジェクトである。パースの不備は意図しない保持期間（例: "7d" を 7秒と誤解釈）を招き、重要なキャッシュの早期削除やディスクの際限ない肥大化に繋がる。

  ## 検証観点

  - **文字列パース**: `"7d"` → 7日、`"12h"` → 12時間、`"30m"` → 30分、`"10s"` → 10秒として正しく解釈されること
  - **timedelta 入力**: `timedelta(days=7)` がそのまま保持期間として受け入れられること
  - **秒数入力**: 整数・浮動小数点数が秒として解釈されること
  - **FOREVER シングルトン**: `Retention.FOREVER` が無期限保持を表し、シングルトンであること（`is` 比較が成立）
  - **バリデーション**: 負値（`"-1d"`）やゼロ（`"0s"`）が `ValidationError` を送出すること。不正な形式（`"abc"`, `""` 等）も拒否されること
