# 2. Podcast Management — Test Cases

User Type: **Super Administrator**
Source: *Mi Digital Academy - Education CRM Features Document*
Spec: podcast_management.md — every feature, sub-feature, and rule covered

---

## Test Execution Policy
- Zero tolerance: any deviation from documented behavior = FAILED = bug
- Every bug is immediately logged/reported (Bug ID, feature, sub-feature,
  expected vs actual, severity) and fixed 100% before the group passes
- Feature group passes only at 100% test pass rate

## Coverage Matrix
| Feature | Sub-feature / Rule | Test IDs |
|---------|--------------------|----------|
| 2.1 Upload Podcasts (Audio Lessons) | Podcast upload: the audio lesson file uploaded to the platform | TC-SA-07-02-001 |
| 2.1 Upload Podcasts (Audio Lessons) | Audio quality: the audio is in the platform's standard quality | TC-SA-07-02-002 |
| 2.1 Upload Podcasts (Audio Lessons) | Upload validation: format, quality, and size checked on upload | TC-SA-07-02-003 |
| 2.1 Upload Podcasts (Audio Lessons) | Processing: the audio processed for streaming (available to play once processed) | TC-SA-07-02-004 |
| 2.1 Upload Podcasts (Audio Lessons) | Upload status: the upload's state (uploading, processing, ready, failed) | TC-SA-07-02-005 |
| 2.1 Upload Podcasts (Audio Lessons) | Upload failure handling: a failed upload reported with the reason | TC-SA-07-02-006 |
| 2.1 Upload Podcasts (Audio Lessons) | Podcast list: the uploaded podcasts with their status and metadata | TC-SA-07-02-007 |
| 2.1 Upload Podcasts (Audio Lessons) | Audit logging of podcast uploads | TC-SA-07-02-008 |
| 2.1 Upload Podcasts (Audio Lessons) | Rule: the upload is validated (format, quality, size); a failing file is rejected with the specific reason, not silently accepted | TC-SA-07-02-003 |
| 2.1 Upload Podcasts (Audio Lessons) | Rule: the audio quality meets the platform's standard; a sub-standard upload is flagged | TC-SA-07-02-009 |
| 2.1 Upload Podcasts (Audio Lessons) | Rule: the podcast is processed for streaming; it is playable only once processing completes | TC-SA-07-02-010 |
| 2.1 Upload Podcasts (Audio Lessons) | Rule: a failed upload is reported with the reason; the corrected file is re-uploaded, and the failure is recorded | TC-SA-07-02-006 |
| 2.1 Upload Podcasts (Audio Lessons) | Rule: the podcast list shows the status per podcast; the pipeline state is visible | TC-SA-07-02-007 |
| 2.1 Upload Podcasts (Audio Lessons) | Rule: podcast uploads are audit-logged with the podcast, actor, and timestamp | TC-SA-07-02-008 |
| 2.2 Downloadable Audio Lessons | Download enablement: the podcast made downloadable (per the platform's download policy) | TC-SA-07-02-011 |
| 2.2 Downloadable Audio Lessons | Entitlement: the download available to the learners entitled (per the policy) | TC-SA-07-02-012 |
| 2.2 Downloadable Audio Lessons | Download cap: the per-learner download limit applied (per the policy) | TC-SA-07-02-013 |
| 2.2 Downloadable Audio Lessons | Retention: the downloaded audio's retention per the policy | TC-SA-07-02-014 |
| 2.2 Downloadable Audio Lessons | Download tracking: a learner's downloads recorded | TC-SA-07-02-015 |
| 2.2 Downloadable Audio Lessons | Download visibility: the download option shown where the learner is entitled | TC-SA-07-02-016 |
| 2.2 Downloadable Audio Lessons | Audit logging of download enablement changes | TC-SA-07-02-017 |
| 2.2 Downloadable Audio Lessons | Rule: the download option is governed by the platform's download policy (entitlement, cap, retention); enabling it does not override the policy | TC-SA-07-02-018 |
| 2.2 Downloadable Audio Lessons | Rule: the cap is enforced per learner; a learner at the cap cannot download more (they can still stream) | TC-SA-07-02-013 |
| 2.2 Downloadable Audio Lessons | Rule: a non-entitled learner does not see the download option; streaming remains available | TC-SA-07-02-019 |
| 2.2 Downloadable Audio Lessons | Rule: downloads are tracked; the usage per podcast is visible | TC-SA-07-02-015 |
| 2.2 Downloadable Audio Lessons | Rule: the retention applies to the downloaded audio; an expired download is handled per the policy | TC-SA-07-02-014 |
| 2.2 Downloadable Audio Lessons | Rule: download enablement changes are audit-logged with the podcast, setting, and timestamp | TC-SA-07-02-017 |

## 2.1 Upload Podcasts (Audio Lessons)

### TC-SA-07-02-001 — Podcast upload: the audio lesson file uploaded to the platform
**Type:** Positive
**Covers:** 2.1 → Podcast upload: the audio lesson file uploaded to the platform
**Preconditions:** A new audio lesson is ready; Super Admin is coordinating the content owner.
**Steps:**
1. Initiate the upload of the podcast file.
2. Complete the upload.
3. Verify the audio lesson file is uploaded to the platform and becomes a content item.
**Expected Result:** The audio lesson file is uploaded to the platform — it becomes a content item that can be organized, assigned, and published.
**Priority:** Critical

### TC-SA-07-02-002 — Audio quality: the audio is in the platform's standard quality
**Type:** Positive
**Covers:** 2.1 → Audio quality: the audio is in the platform's standard quality
**Preconditions:** An audio lesson file meeting the platform's standard quality is ready.
**Steps:**
1. Upload the audio lesson file.
2. Verify the platform accepts it as meeting the standard quality.
3. Verify the podcast plays at the standard quality.
**Expected Result:** The audio is in the platform's standard quality.
**Priority:** High

### TC-SA-07-02-003 — Upload validation: format, quality, and size checked on upload; a failing file is rejected with the specific reason
**Type:** Negative
**Covers:** 2.1 → Upload validation: format, quality, and size checked on upload; Rule: the upload is validated (format, quality, size); a failing file is rejected with the specific reason, not silently accepted
**Preconditions:** An audio file with an unsupported format (or over the size limit) is ready.
**Steps:**
1. Attempt to upload the failing audio file.
2. Verify the platform validates the upload (format, quality, size).
3. Verify the file is rejected with the specific reason (not silently accepted).
**Expected Result:** The upload is validated — the failing file is rejected with the specific reason, not silently accepted.
**Priority:** Critical

### TC-SA-07-02-004 — Processing: the audio processed for streaming (available to play once processed)
**Type:** Positive
**Covers:** 2.1 → Processing: the audio processed for streaming (available to play once processed)
**Preconditions:** A valid audio file is uploaded.
**Steps:**
1. Upload the audio file.
2. Verify the platform processes it for streaming.
3. Verify the podcast is available to play once processing completes.
**Expected Result:** The podcast is processed for streaming — it is available to play once processed.
**Priority:** Critical

### TC-SA-07-02-005 — Upload status: the upload's state (uploading, processing, ready, failed)
**Type:** Positive
**Covers:** 2.1 → Upload status: the upload's state (uploading, processing, ready, failed)
**Preconditions:** A podcast upload is in progress.
**Steps:**
1. Initiate the upload and observe the status.
2. Verify the status shows uploading, then processing.
3. Verify the status shows ready once processed (or failed if it fails).
**Expected Result:** The upload's state is shown: uploading, processing, ready, or failed.
**Priority:** High

### TC-SA-07-02-006 — Upload failure handling: a failed upload reported with the reason; the corrected file is re-uploaded, and the failure is recorded
**Type:** Negative
**Covers:** 2.1 → Upload failure handling: a failed upload reported with the reason; Rule: a failed upload is reported with the reason; the corrected file is re-uploaded, and the failure is recorded
**Preconditions:** A corrupt audio file (or unsupported format) is uploaded.
**Steps:**
1. Upload the corrupt file and verify the failure is reported with the reason.
2. Obtain a corrected file and re-upload it.
3. Verify the failure is recorded in the audit trail.
**Expected Result:** The failed upload is reported with the reason — the corrected file is re-uploaded, and the failure is recorded.
**Priority:** Critical

### TC-SA-07-02-007 — Podcast list: the uploaded podcasts with their status and metadata; the pipeline state is visible
**Type:** Positive
**Covers:** 2.1 → Podcast list: the uploaded podcasts with their status and metadata; Rule: the podcast list shows the status per podcast; the pipeline state is visible
**Preconditions:** Multiple podcasts are uploaded in various states (ready, processing, failed).
**Steps:**
1. Open the podcast list.
2. Verify the uploaded podcasts are shown with their status and metadata.
3. Verify the audio content pipeline state is visible.
**Expected Result:** The podcast list shows the status per podcast — the pipeline state is visible.
**Priority:** High

### TC-SA-07-02-008 — Podcast uploads are audit-logged with the podcast, actor, and timestamp
**Type:** Positive
**Covers:** 2.1 → Audit logging of podcast uploads; Rule: podcast uploads are audit-logged with the podcast, actor, and timestamp
**Preconditions:** Podcast uploads have occurred.
**Steps:**
1. Open the audit trail and filter by "podcast upload".
2. Verify entries show the podcast, the actor, and the timestamp.
**Expected Result:** The podcast uploads are audit-logged with the podcast, actor, and timestamp.
**Priority:** Critical

### TC-SA-07-02-009 — The audio quality meets the platform's standard; a sub-standard upload is flagged
**Type:** Edge
**Covers:** 2.1 → Rule: the audio quality meets the platform's standard; a sub-standard upload is flagged
**Preconditions:** A sub-standard (below the platform's standard quality) audio file is ready for upload.
**Steps:**
1. Upload the sub-standard audio file.
2. Verify the upload is flagged as sub-standard (not silently accepted as standard).
**Expected Result:** The sub-standard upload is flagged — the audio quality meets the platform's standard.
**Priority:** High

### TC-SA-07-02-010 — The podcast is playable only once processing completes
**Type:** Negative
**Covers:** 2.1 → Rule: the podcast is processed for streaming; it is playable only once processing completes
**Preconditions:** A podcast is uploaded and still processing.
**Steps:**
1. Attempt to play the podcast while it is still processing.
2. Verify the podcast is not playable until processing completes.
3. Verify the podcast is playable once processing completes.
**Expected Result:** The podcast is playable only once processing completes.
**Priority:** High

## 2.2 Downloadable Audio Lessons

### TC-SA-07-02-011 — Download enablement: the podcast made downloadable (per the platform's download policy)
**Type:** Positive
**Covers:** 2.2 → Download enablement: the podcast made downloadable (per the platform's download policy)
**Preconditions:** A podcast exists; the platform's download policy is configured.
**Steps:**
1. Enable the download option for the podcast.
2. Verify an entitled learner can save the audio lesson for offline listening.
**Expected Result:** The podcast is made downloadable — an entitled learner can save the audio lesson for offline listening.
**Priority:** High

### TC-SA-07-02-012 — Entitlement: the download available to the learners entitled (per the policy)
**Type:** Positive
**Covers:** 2.2 → Entitlement: the download available to the learners entitled (per the policy)
**Preconditions:** The download policy defines which learners are entitled; a podcast is downloadable.
**Steps:**
1. As an entitled learner, verify the download option is available.
2. Verify the entitlement (who can download) is applied per the policy.
**Expected Result:** The download is available to the learners entitled — per the policy.
**Priority:** High

### TC-SA-07-02-013 — Download cap: the per-learner download limit applied (per the policy); a learner at the cap cannot download more (they can still stream)
**Type:** Negative
**Covers:** 2.2 → Download cap: the per-learner download limit applied (per the policy); Rule: the cap is enforced per learner; a learner at the cap cannot download more (they can still stream)
**Preconditions:** A learner has reached their download cap; a podcast is downloadable.
**Steps:**
1. As the learner at the cap, attempt to download the podcast.
2. Verify the download option is unavailable (the cap is enforced).
3. Verify the learner can still stream in-app.
**Expected Result:** The cap is enforced per learner — a learner at the cap cannot download more (they can still stream).
**Priority:** Critical

### TC-SA-07-02-014 — Retention: the downloaded audio's retention per the policy; an expired download is handled per the policy
**Type:** Edge
**Covers:** 2.2 → Retention: the downloaded audio's retention per the policy; Rule: the retention applies to the downloaded audio; an expired download is handled per the policy
**Preconditions:** A learner has downloaded a podcast; the download's retention period has expired.
**Steps:**
1. Verify the retention applies to the downloaded audio (how long the download is valid).
2. Verify the expired download is handled per the policy.
**Expected Result:** The retention applies to the downloaded audio — an expired download is handled per the policy.
**Priority:** Medium

### TC-SA-07-02-015 — Download tracking: a learner's downloads recorded; the usage per podcast is visible
**Type:** Positive
**Covers:** 2.2 → Download tracking: a learner's downloads recorded; Rule: downloads are tracked; the usage per podcast is visible
**Preconditions:** Learners have downloaded podcasts.
**Steps:**
1. Verify a learner's downloads are recorded (counting toward their cap).
2. Review the download tracking: the downloads per podcast.
3. Verify the usage of the downloadable audio is visible.
**Expected Result:** The downloads are tracked — the usage per podcast is visible.
**Priority:** High

### TC-SA-07-02-016 — Download visibility: the download option shown where the learner is entitled
**Type:** Positive
**Covers:** 2.2 → Download visibility: the download option shown where the learner is entitled
**Preconditions:** A podcast is downloadable; a learner is entitled.
**Steps:**
1. As the entitled learner, view the podcast.
2. Verify the download option appears on the podcast.
**Expected Result:** The download option is shown where the learner is entitled.
**Priority:** Medium

### TC-SA-07-02-017 — Download enablement changes are audit-logged with the podcast, setting, and timestamp
**Type:** Positive
**Covers:** 2.2 → Audit logging of download enablement changes; Rule: download enablement changes are audit-logged with the podcast, setting, and timestamp
**Preconditions:** A podcast's download enablement has been changed.
**Steps:**
1. Open the audit trail and filter by "download enablement".
2. Verify the entry shows the podcast, the setting, and the timestamp.
**Expected Result:** The download enablement change is audit-logged with the podcast, setting, and timestamp.
**Priority:** Critical

### TC-SA-07-02-018 — The download option is governed by the platform's download policy; enabling it does not override the policy
**Type:** Negative
**Covers:** 2.2 → Rule: the download option is governed by the platform's download policy (entitlement, cap, retention); enabling it does not override the policy
**Preconditions:** The platform's download policy sets an entitlement, cap, and retention; a podcast's download is enabled.
**Steps:**
1. Enable the download option for the podcast.
2. Verify the download is governed by the policy (the entitlement, cap, and retention apply).
3. Verify enabling the download does not override the policy.
**Expected Result:** The download option is governed by the platform's download policy — enabling it does not override the policy.
**Priority:** Critical

### TC-SA-07-02-019 — A non-entitled learner does not see the download option; streaming remains available
**Type:** Negative
**Covers:** 2.2 → Rule: a non-entitled learner does not see the download option; streaming remains available
**Preconditions:** A learner is not entitled to download (per the policy); a podcast is downloadable.
**Steps:**
1. As the non-entitled learner, view the podcast.
2. Verify the download option is not shown.
3. Verify the learner can still stream in-app.
**Expected Result:** The non-entitled learner does not see the download option — streaming remains available.
**Priority:** High
