""" .. author:: Eric Torres Tests for the rbackup.struct.repository module. """ import re import unittest from unittest.mock import PropertyMock, patch from hypothesis import given from hypothesis.strategies import from_regex, lists, text from rbackup.struct.repository import Repository from rbackup.struct.snapshot import Snapshot # ========== Constants ========== TESTING_PACKAGE = "rbackup.struct" REPO_MODULE = f"{TESTING_PACKAGE}.repository" SS_MODULE = f"{TESTING_PACKAGE}.snapshot" VALID_SNAPSHOT_NAME = r"[\w._+-]+[^/]*" # ========== Integration Tests ========== class TestRepositoryPreCreate(unittest.TestCase): """Test properties of the Repository before running create_snapshot(). Mocked Modules/Classes ---------------------- rbackup.struct.repository.Snapshot Mocked Attributes ----------------- * Repository.metadata_path * Repository.read_metadata * Repository.write_metadata """ def setUp(self): self.patched_path = patch.object( Repository, "metadata_path", new_callable=PropertyMock ) self.patched_r_metadata = patch.object( Repository, "read_metadata", spec_set=list ) self.patched_w_metadata = patch.object( Repository, "write_metadata", spec_set=list ) self.patched_snapshot = patch( f"{TESTING_PACKAGE}.repository.Snapshot", spec_set=Snapshot ) self.mocked_r_metadata = self.patched_r_metadata.start() self.mocked_w_metadata = self.patched_w_metadata.start() self.mocked_path = self.patched_path.start() self.mocked_snapshot = self.patched_snapshot.start() self.mocked_path.return_value.exists.return_value = True @given(lists(from_regex(VALID_SNAPSHOT_NAME, fullmatch=True), unique=True)) def test_empty(self, snapshots): self.mocked_r_metadata.return_value = snapshots.copy() repo = Repository("backup") if not snapshots: self.assertTrue(repo.empty) else: self.assertFalse(repo.empty) @given( lists( text( alphabet=characters(blacklist_characters=UNWANTED_SNAPSHOT_CHARS), min_size=1, ), unique=True, ) ) def test_len(self, snapshots): self.mocked_r_metadata.return_value = snapshots.copy() repo = Repository("backup") self.assertEqual(len(repo.snapshots), len(snapshots)) @given(text(min_size=1)) def test_contains(self, name): self.mocked_r_metadata = [] repo = Repository("backup") self.assertFalse(name in repo) @given(text()) def test_valid_name(self, name): self.mocked_r_metadata.return_value = [] if not re.match(VALID_SNAPSHOT_NAME, name): self.assertFalse(Repository.is_valid_snapshot_name(name)) else: self.assertTrue(Repository.is_valid_snapshot_name(name)) def test_snapshots_returns_empty_list(self): r = Repository("backup") self.assertListEqual(r.snapshots, []) def tearDown(self): self.patched_path.stop() self.patched_r_metadata.stop() self.patched_w_metadata.stop() self.patched_snapshot.stop() class TestRepositoryPostCreate(unittest.TestCase): """Test properties of the Repository after running create_snapshot(). Mocked Modules/Classes ---------------------- rbackup.struct.repository.Snapshot Mocked Attributes ----------------- * Repository.metadata_path * Repository.read_metadata * Repository.write_metadata """ def setUp(self): self.patched_path = patch.object( Repository, "metadata_path", new_callable=PropertyMock ) self.patched_r_metadata = patch.object( Repository, "read_metadata", spec_set=list ) self.patched_w_metadata = patch.object( Repository, "write_metadata", spec_set=list ) self.patched_snapshot = patch( f"{TESTING_PACKAGE}.repository.Snapshot", spec_set=Snapshot ) self.mocked_path = self.patched_path.start() self.mocked_r_metadata = self.patched_r_metadata.start() self.mocked_w_metadata = self.patched_w_metadata.start() self.mocked_snapshot = self.patched_snapshot.start() @given(lists(from_regex(VALID_SNAPSHOT_NAME, fullmatch=True), unique=True)) def test_dunder_len(self, snapshots): self.mocked_r_metadata.return_value = snapshots.copy() repo = Repository("backup") repo.create_snapshot() self.assertFalse(repo.empty) @given(from_regex(VALID_SNAPSHOT_NAME, fullmatch=True)) def test_dunder_contains(self, name): self.mocked_path.return_value.exists.return_value = False repo = Repository("backup") repo.create_snapshot(name) self.assertTrue(name in repo) def test_empty(self): self.mocked_r_metadata.return_value = [] repo = Repository("backup") repo.create_snapshot() self.assertEqual(len(repo), len(snapshots) + 1) self.assertEqual(len(repo.snapshots), len(snapshots) + 1) @given( text( alphabet=characters(blacklist_characters=UNWANTED_SNAPSHOT_CHARS), min_size=1, ) ) def test_contains(self, name): self.mocked_path.return_value.exists.return_value = False repo = Repository("backup") repo.create_snapshot(name) self.assertTrue(name in repo) def tearDown(self): self.patched_path.stop() self.patched_r_metadata.stop() self.patched_w_metadata.stop() self.patched_snapshot.stop()