From 1886c12fa73f9cfd122b443bed8fad50e0a5d234 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 29 Jun 2026 02:07:47 +0900 Subject: [PATCH 1/2] test: cover chart summary missing export summary --- apps/desktop/src/lib/export.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/apps/desktop/src/lib/export.test.ts b/apps/desktop/src/lib/export.test.ts index 265e983d..2b2729e4 100644 --- a/apps/desktop/src/lib/export.test.ts +++ b/apps/desktop/src/lib/export.test.ts @@ -143,6 +143,25 @@ describe("export generation", () => { expect(parsed.headline).toBe(""); }); + it("generates chart summary JSON when exportSummary is undefined", () => { + const mockSongNoExportSummary: RehearsalSong = { + ...mockSong, + exportSummary: undefined + }; + const parsed = JSON.parse(generateChartSummaryJson(mockSongNoExportSummary)); + + expect(parsed).toMatchObject({ + title: "Test", + headline: "", + sections: [ + { + label: "verse", + groove: "swing" + } + ] + }); + }); + it("generates a metadata-only local handoff without source paths or transcription data", () => { const sourceBootstrap: ProjectBootstrapSummary = { projectId: "project-1", From b9b6c26a97f8149b99313d2e80377ee3f7a14a19 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Mon, 29 Jun 2026 16:30:53 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A7=AA=20[Testing]=20Increase=20cover?= =?UTF-8?q?age=20for=20export=20utilities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/desktop/src/lib/export.test.ts | 58 ++++++++++++++----- .../src/bandscope_analysis/youtube.py | 6 +- .../analysis-engine/tests/test_youtube.py | 11 +--- 3 files changed, 49 insertions(+), 26 deletions(-) diff --git a/apps/desktop/src/lib/export.test.ts b/apps/desktop/src/lib/export.test.ts index 2b2729e4..9248d502 100644 --- a/apps/desktop/src/lib/export.test.ts +++ b/apps/desktop/src/lib/export.test.ts @@ -126,6 +126,30 @@ describe("export generation", () => { expect(lines[1]).toBe('verse,swing,Bass,\'=Cmaj7,"1, 2, 3",high,setup | simple'); }); + + it("generates chart summary JSON as exact string", () => { + const jsonStr = generateChartSummaryJson(mockSong); + const expected = JSON.stringify({ + title: "Test", + headline: "Headline", + sections: [ + { + label: "verse", + groove: "swing", + roles: [ + { + name: "Bass", + chord: "=Cmaj7", + cue: "1, 2, 3", + priority: "high" + } + ] + } + ] + }, null, 2); + expect(jsonStr).toBe(expected); + }); + it("generates chart summary JSON", () => { const jsonStr = generateChartSummaryJson(mockSong); const parsed = JSON.parse(jsonStr); @@ -133,6 +157,17 @@ describe("export generation", () => { expect(parsed.sections[0].roles[0].chord).toBe("=Cmaj7"); }); + + it("generates chart summary JSON when exportSummary is undefined", () => { + const mockSongNoExportSummary = { + ...mockSong, + exportSummary: undefined + }; + const jsonStr = generateChartSummaryJson(mockSongNoExportSummary); + const parsed = JSON.parse(jsonStr); + expect(parsed.headline).toBe(""); + }); + it("generates chart summary JSON when headline is missing", () => { const mockSongNoHeadline: RehearsalSong = { ...mockSong, @@ -143,22 +178,17 @@ describe("export generation", () => { expect(parsed.headline).toBe(""); }); - it("generates chart summary JSON when exportSummary is undefined", () => { - const mockSongNoExportSummary: RehearsalSong = { - ...mockSong, - exportSummary: undefined - }; - const parsed = JSON.parse(generateChartSummaryJson(mockSongNoExportSummary)); - expect(parsed).toMatchObject({ + it("creates a metadata handoff artifact without workspaceId or workspaceTitle", () => { + const json = generateMetadataHandoffJson(mockSong, { + createdAt: "2026-06-15T08:30:00.000Z" + }); + const parsed = JSON.parse(json); + + expect(parsed.workspace).toEqual({ + id: "test", title: "Test", - headline: "", - sections: [ - { - label: "verse", - groove: "swing" - } - ] + workspaceVersion: 1 }); }); diff --git a/services/analysis-engine/src/bandscope_analysis/youtube.py b/services/analysis-engine/src/bandscope_analysis/youtube.py index 612a8a23..aa27d6f7 100644 --- a/services/analysis-engine/src/bandscope_analysis/youtube.py +++ b/services/analysis-engine/src/bandscope_analysis/youtube.py @@ -5,7 +5,6 @@ """ import argparse -import glob import json import os import re @@ -60,8 +59,9 @@ def _find_downloaded_file(actual_filepath: str) -> Optional[str]: if not os.path.exists(actual_filepath): # Try to find the file with a different extension in case of conversion base_path = os.path.splitext(actual_filepath)[0] - for match in glob.iglob(glob.escape(base_path) + ".*"): - if match.endswith(SUPPORTED_AUDIO_EXTENSIONS): + for ext in SUPPORTED_AUDIO_EXTENSIONS: + match = base_path + ext + if os.path.exists(match): return match return None return actual_filepath diff --git a/services/analysis-engine/tests/test_youtube.py b/services/analysis-engine/tests/test_youtube.py index bac281a2..71d7d60d 100644 --- a/services/analysis-engine/tests/test_youtube.py +++ b/services/analysis-engine/tests/test_youtube.py @@ -151,14 +151,10 @@ def exists_side_effect(path: str) -> bool: mock_exists.side_effect = exists_side_effect mock_getsize.return_value = 10 * 1024 * 1024 - with patch("bandscope_analysis.youtube.glob.iglob") as mock_iglob: - mock_iglob.return_value = iter(["/tmp/abc123DEF45.opus"]) - - result = download_youtube_audio("https://youtube.com/watch?v=abc123DEF45", "/tmp") + result = download_youtube_audio("https://youtube.com/watch?v=abc123DEF45", "/tmp") assert result["ok"] is True assert result["metadata"]["filepath"] == "/tmp/abc123DEF45.opus" - mock_iglob.assert_called_once_with("/tmp/abc123DEF45.*") @patch("bandscope_analysis.youtube.os.path.exists") @@ -180,10 +176,7 @@ def test_download_youtube_audio_file_not_found( mock_ydl.prepare_filename.return_value = "/tmp/abc123DEF45.webm" mock_exists.return_value = False - with patch("bandscope_analysis.youtube.glob.iglob") as mock_iglob: - mock_iglob.return_value = iter(()) - - result = download_youtube_audio("https://youtube.com/watch?v=abc123DEF45", "/tmp") + result = download_youtube_audio("https://youtube.com/watch?v=abc123DEF45", "/tmp") assert result["ok"] is False assert result["error"]["code"] == "file_not_found"