add merging sentences action
This commit is contained in:
@@ -277,6 +277,102 @@ def test_admin_can_split_sentence_and_reindexes_following_sentences(tmp_path):
|
||||
assert [item.index for item in document.sentences] == [0, 1, 2, 3]
|
||||
|
||||
|
||||
def test_admin_can_merge_adjacent_sentences_and_reindexes_following_sentences(tmp_path):
|
||||
settings = replace(Settings.from_env(), data_dir=tmp_path / "data")
|
||||
settings.ensure_directories()
|
||||
repository = VideoRepository(settings.database_path)
|
||||
repository.upsert_upload(
|
||||
video_hash=VIDEO_HASH,
|
||||
title="Manual merge lesson",
|
||||
filename="lesson.mp4",
|
||||
stored_filename=f"{VIDEO_HASH}.mp4",
|
||||
content_type="video/mp4",
|
||||
size_bytes=5,
|
||||
language="en",
|
||||
)
|
||||
repository.save_processing_result(
|
||||
SentenceBoundaryDocument(
|
||||
video_hash=VIDEO_HASH,
|
||||
duration_ms=12000,
|
||||
algorithm_version="test",
|
||||
sentences=[
|
||||
SentenceBoundary(
|
||||
index=0,
|
||||
start_ms=0,
|
||||
end_ms=2000,
|
||||
text="Before.",
|
||||
language="en",
|
||||
reference_speech_duration_ms=1800,
|
||||
),
|
||||
SentenceBoundary(
|
||||
index=1,
|
||||
start_ms=2000,
|
||||
end_ms=5000,
|
||||
text="First part",
|
||||
language="en",
|
||||
reference_speech_duration_ms=2800,
|
||||
),
|
||||
SentenceBoundary(
|
||||
index=2,
|
||||
start_ms=5000,
|
||||
end_ms=9000,
|
||||
text="second part",
|
||||
language="en",
|
||||
reference_speech_duration_ms=3600,
|
||||
),
|
||||
SentenceBoundary(
|
||||
index=3,
|
||||
start_ms=9000,
|
||||
end_ms=12000,
|
||||
text="Next sentence.",
|
||||
language="en",
|
||||
reference_speech_duration_ms=2800,
|
||||
),
|
||||
],
|
||||
),
|
||||
None,
|
||||
)
|
||||
|
||||
class UnavailableTranscriber:
|
||||
available = False
|
||||
|
||||
client = TestClient(
|
||||
create_app(
|
||||
BoundaryStore(tmp_path / "boundaries.json"),
|
||||
settings=settings,
|
||||
repository=repository,
|
||||
transcriber=UnavailableTranscriber(),
|
||||
)
|
||||
)
|
||||
response = client.put(
|
||||
f"/api/v1/admin/videos/{VIDEO_HASH}/sentences/1/merge",
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
merged = response.json()
|
||||
assert merged["index"] == 1
|
||||
assert merged["text"] == "First part second part"
|
||||
assert merged["start_ms"] == 2000
|
||||
assert merged["end_ms"] == 9000
|
||||
assert merged["reference_speech_duration_ms"] == 6400
|
||||
|
||||
document = repository.get_document(VIDEO_HASH)
|
||||
assert [item.text for item in document.sentences] == [
|
||||
"Before.",
|
||||
"First part second part",
|
||||
"Next sentence.",
|
||||
]
|
||||
assert [item.index for item in document.sentences] == [0, 1, 2]
|
||||
assert [item.start_ms for item in document.sentences] == [0, 2000, 9000]
|
||||
assert [item.end_ms for item in document.sentences] == [2000, 9000, 12000]
|
||||
|
||||
last_response = client.put(
|
||||
f"/api/v1/admin/videos/{VIDEO_HASH}/sentences/2/merge",
|
||||
)
|
||||
assert last_response.status_code == 400
|
||||
assert last_response.json()["detail"] == "No next sentence to merge with."
|
||||
|
||||
|
||||
def test_admin_boundary_adjustment_updates_linked_next_start(tmp_path):
|
||||
settings = replace(Settings.from_env(), data_dir=tmp_path / "data")
|
||||
settings.ensure_directories()
|
||||
|
||||
Reference in New Issue
Block a user