rbackup/tests/test_repository.py
2019-04-10 18:17:21 -07:00

200 lines
5.7 KiB
Python

import unittest
from unittest.mock import MagicMock, PropertyMock, patch
from hypothesis import given
from hypothesis.strategies import builds, characters, 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"
UNWANTED_SNAPSHOT_CHARS = ["/"]
# ========== 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(
text(
alphabet=characters(blacklist_characters=UNWANTED_SNAPSHOT_CHARS),
min_size=1,
),
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 name or "/" in 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(
text(
alphabet=characters(blacklist_characters=UNWANTED_SNAPSHOT_CHARS),
min_size=1,
),
unique=True,
)
)
def test_empty(self, snapshots):
self.mocked_r_metadata.return_value = snapshots.copy()
repo = Repository("backup")
repo.create_snapshot()
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")
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()