diff --git a/beets/test/_common.py b/beets/test/_common.py index 50dbde43f..76456ca7f 100644 --- a/beets/test/_common.py +++ b/beets/test/_common.py @@ -16,7 +16,6 @@ import os import sys -import tempfile import unittest from contextlib import contextmanager @@ -66,13 +65,6 @@ _item_ident = 0 HAVE_SYMLINK = sys.platform != "win32" HAVE_HARDLINK = sys.platform != "win32" -try: - import reflink - - HAVE_REFLINK = reflink.supported_at(tempfile.gettempdir()) -except ImportError: - HAVE_REFLINK = False - def item(lib=None): global _item_ident diff --git a/beets/test/helper.py b/beets/test/helper.py index cd09ccf66..19f7299ed 100644 --- a/beets/test/helper.py +++ b/beets/test/helper.py @@ -42,7 +42,7 @@ from enum import Enum from functools import cached_property from io import StringIO from pathlib import Path -from tempfile import mkdtemp, mkstemp +from tempfile import gettempdir, mkdtemp, mkstemp from typing import Any, ClassVar from unittest.mock import patch @@ -147,6 +147,20 @@ def has_program(cmd, args=["--version"]): return True +def check_reflink_support(path: str) -> bool: + try: + import reflink + except ImportError: + return False + + return reflink.supported_at(path) + + +NEEDS_REFLINK = unittest.skipUnless( + check_reflink_support(gettempdir()), "no reflink support for libdir" +) + + class TestHelper(_common.Assertions): """Helper mixin for high-level cli and plugin tests. diff --git a/test/test_files.py b/test/test_files.py index e189fe73c..6490c5b55 100644 --- a/test/test_files.py +++ b/test/test_files.py @@ -12,8 +12,7 @@ # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. -"""Test file manipulation functionality of Item. -""" +"""Test file manipulation functionality of Item.""" import os import shutil @@ -27,7 +26,7 @@ import beets.library from beets import util from beets.test import _common from beets.test._common import item, touch -from beets.test.helper import BeetsTestCase +from beets.test.helper import NEEDS_REFLINK, BeetsTestCase from beets.util import MoveOperation, bytestring_path, syspath @@ -87,22 +86,22 @@ class MoveTest(BeetsTestCase): self.i.move(operation=MoveOperation.COPY) self.assertExists(self.path) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflink") + @NEEDS_REFLINK def test_reflink_arrives(self): self.i.move(operation=MoveOperation.REFLINK_AUTO) self.assertExists(self.dest) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflink") + @NEEDS_REFLINK def test_reflink_does_not_depart(self): self.i.move(operation=MoveOperation.REFLINK_AUTO) self.assertExists(self.path) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflink") + @NEEDS_REFLINK def test_force_reflink_arrives(self): self.i.move(operation=MoveOperation.REFLINK) self.assertExists(self.dest) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflink") + @NEEDS_REFLINK def test_force_reflink_does_not_depart(self): self.i.move(operation=MoveOperation.REFLINK) self.assertExists(self.path) @@ -286,7 +285,7 @@ class AlbumFileTest(BeetsTestCase): self.assertExists(oldpath) self.assertExists(self.i.path) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflink") + @NEEDS_REFLINK def test_albuminfo_move_reflinks_file(self): oldpath = self.i.path self.ai.album = "newAlbumName" @@ -571,7 +570,7 @@ class SafeMoveCopyTest(BeetsTestCase): self.assertExists(self.dest) self.assertExists(self.path) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflink") + @NEEDS_REFLINK def test_successful_reflink(self): util.reflink(self.path, self.dest) self.assertExists(self.dest) @@ -585,7 +584,7 @@ class SafeMoveCopyTest(BeetsTestCase): with pytest.raises(util.FilesystemError): util.copy(self.path, self.otherpath) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflink") + @NEEDS_REFLINK def test_unsuccessful_reflink(self): with pytest.raises(util.FilesystemError): util.reflink(self.path, self.otherpath) diff --git a/test/test_importer.py b/test/test_importer.py index a47903a29..b9fde2a03 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -13,8 +13,8 @@ # included in all copies or substantial portions of the Software. -"""Tests for the general importer functionality. -""" +"""Tests for the general importer functionality.""" + import os import re import shutil @@ -37,6 +37,7 @@ from beets.autotag import AlbumInfo, AlbumMatch, TrackInfo from beets.importer import albums_in_dir from beets.test import _common from beets.test.helper import ( + NEEDS_REFLINK, AsIsImporterMixin, AutotagStub, BeetsTestCase, @@ -209,7 +210,7 @@ class NonAutotaggedImportTest(AsIsImporterMixin, ImportTestCase): s2[stat.ST_DEV], ) - @unittest.skipUnless(_common.HAVE_REFLINK, "need reflinks") + @NEEDS_REFLINK def test_import_reflink_arrives(self): # Detecting reflinks is currently tricky due to various fs # implementations, we'll just check the file exists. @@ -392,7 +393,7 @@ class ImportSingletonTest(ImportTestCase): assert len(self.lib.albums()) == 2 def test_set_fields(self): - genre = "\U0001F3B7 Jazz" + genre = "\U0001f3b7 Jazz" collection = "To Listen" config["import"]["set_fields"] = { @@ -579,7 +580,7 @@ class ImportTest(ImportTestCase): self.lib.items().get().data_source def test_set_fields(self): - genre = "\U0001F3B7 Jazz" + genre = "\U0001f3b7 Jazz" collection = "To Listen" comments = "managed by beets"