| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- """Tests for resolve_display_stem — Bambu Studio filename normalisation (#1152).
- Bambu Studio's "Send to printer" dialog typically writes ``Plate_1.gcode.3mf``
- (a sliced gcode payload wrapped in a 3MF container). ``Path(name).stem`` only
- strips the last suffix and leaves ``Plate_1.gcode``, which then surfaces in
- the archive UI as a confusing ``Plate_1.gcode`` rather than ``Plate_1``.
- Pin the canonicalisation rules so a future refactor can't silently regress
- this path. We don't need a dedicated test for ``archive_print``'s consumption
- of the helper — the existing test suite covers that flow end-to-end via the
- integration tests and a behaviour change there would surface as a different
- ``archive.print_name`` value.
- """
- import pytest
- from backend.app.services.archive import resolve_display_stem
- @pytest.mark.parametrize(
- ("filename", "expected"),
- [
- # The headline case: Bambu Studio's default name for a sliced 3MF.
- ("Plate_1.gcode.3mf", "Plate_1"),
- # User-renamed file with the double-suffix pattern.
- ("MyAwesomeBenchy.gcode.3mf", "MyAwesomeBenchy"),
- # Plain .3mf (already-clean export from Bambu Studio's Save As).
- ("Benchy.3mf", "Benchy"),
- # Standalone gcode upload — rare but supported.
- ("standalone.gcode", "standalone"),
- # Mixed-case suffix — many slicers / OSes preserve user-typed case.
- ("UPPERCASE.GCODE.3MF", "UPPERCASE"),
- ("mixed.GCode.3mf", "mixed"),
- # Names that contain dots in the middle should keep them.
- ("my.cool.model.gcode.3mf", "my.cool.model"),
- ("v1.2.3-prototype.3mf", "v1.2.3-prototype"),
- # No recognised suffix → fall through to Path.stem.
- ("Cura_export.zip", "Cura_export"),
- ("README.md", "README"),
- # Edge: just the suffix with nothing in front. Strip honestly — the
- # caller is responsible for sanity-checking empty stems.
- (".gcode.3mf", ""),
- (".3mf", ""),
- # Path components must not leak in. The helper takes a filename, but
- # callers occasionally pass a full path string.
- ("/some/dir/Plate_1.gcode.3mf", "Plate_1"),
- ("subdir/MyModel.3mf", "MyModel"),
- ],
- )
- def test_resolve_display_stem(filename: str, expected: str) -> None:
- assert resolve_display_stem(filename) == expected
|