diff --git a/test_character_builder.py b/test_character_builder.py new file mode 100644 index 0000000..135f49f --- /dev/null +++ b/test_character_builder.py @@ -0,0 +1,121 @@ +import unittest +from unittest.mock import patch +import json +import pathlib + +from base_mob import BaseMob +from character_builder import CharacterBuilder + +ARTHUR_JSON = """{ + "name": "Arthur", + "max_pv": 100, + "current_pv": 100, + "strength": 20, + "protection": 10, + "speed": 5, + "mob_type": 0 +}""" + +ARTHUR_FILE = pathlib.Path('Arthur.json') + + +class TestCharacterBuilder(unittest.TestCase): + + @classmethod + def tearDownClass(cls): + ARTHUR_FILE.unlink(missing_ok=True) + + @patch("builtins.input") + def test_build_character(self, mock_input): + # Arrange + mock_input.side_effect = [ + "Arthur", # name + "100", # max_pv + "20", # strength + "10", # protection + "5" # speed + ] + + # Act + character = CharacterBuilder.build_character() + + # Assert + self.assertIsInstance(character, BaseMob) + self.assertEqual(character.name, "Arthur") + self.assertEqual(character.max_pv, 100) + self.assertEqual(character.strength, 20) + self.assertEqual(character.protection, 10) + self.assertEqual(character.speed, 5) + self.assertEqual(character.mob_type, 0) + + def test_save_character(self): + # Arrange + character = BaseMob( + name="Arthur", + max_pv=100, + strength=20, + protection=10, + speed=5, + mob_type=0, + ) + + # Act + CharacterBuilder.save_character(character) + + # Assert + self.assertTrue(ARTHUR_FILE.exists()) + self.assertEqual(ARTHUR_JSON, ARTHUR_FILE.read_text(encoding='utf-8')) + + def test_load_character_file_not_found(self): + # Act + result = CharacterBuilder.load_character("Lancelot") + + # Assert + self.assertIsNone(result) + + def test_load_character_success(self): + # Arrange + ARTHUR_FILE.write_text(ARTHUR_JSON, encoding='utf-8') + + # Act + character = CharacterBuilder.load_character("Arthur") + + # Assert + self.assertIsNotNone(character) + self.assertEqual(character.name, "Arthur") + self.assertEqual(character.max_pv, 100) + self.assertEqual(character.strength, 20) + self.assertEqual(character.protection, 10) + self.assertEqual(character.speed, 5) + self.assertEqual(character.mob_type, 0) + + def test_load_character_missing_keys(self): + arthur_dict: dict = json.loads(ARTHUR_JSON) + + for key in arthur_dict: + with self.subTest(f'test without key "{key}"'): + # Arrange + invalid_dict = arthur_dict.copy() + invalid_dict.pop(key) + ARTHUR_FILE.write_text(json.dumps( + invalid_dict), encoding='utf-8') + + # Act + result = CharacterBuilder.load_character("Arthur") + + # Assert + self.assertIsNone(result) + + def test_load_character_invalid_json(self): + # Arrange + ARTHUR_FILE.write_text(ARTHUR_JSON[1:], encoding='utf-8') + + # Act + result = CharacterBuilder.load_character("Arthur") + + # Assert + self.assertIsNone(result) + + +if __name__ == "__main__": + unittest.main()