def test_create_units(self): """ The item collection is populated by models """ item_collection = ItemCollection() effect_collection = EffectCollection() dialogue_collection = UnitDialogueCollection() """ Prepare unit model collection """ unit_models = [] expected_units = [] unit_items = [] unit_effects = [] unit_dialogue = [] unit_items_model = UnitItems(db="quux") unit_effects_model = UnitEffects(db="quux") unit_dialogue_model = UnitDialogueModel(db="quux") total_units = 25 item_types = ("rock", "paper", "scissors", "paper", "spock") total_items_per_unit = len(item_types) total_effects_per_unit = 5 total_dialogue_per_unit = 5 for j in range(0, total_units): """ Add items for each unit """ items = [] effects = [] dialogue = [] unit_model = self._get_unit_model() unit_id = unit_model["id"] unit_type_id = unit_model["unit_type_id"] for it in item_types: item = self._make_item(item_type=it, unit_type_id=unit_type_id) items.append(item) item_collection.add(item) unit_items.append({"item_id": item.id, "unit_id": unit_id}) unit_model["items"] = items """ Base items """ unit_model["base_items"] = \ item_collection.get_base_items_by_unit_type_id(unit_type_id) """ Add effects """ for k in range(0, total_effects_per_unit): effect = self._make_effect() effects.append(effect) effect_collection.add(effect) unit_effects.append( {"effect_id": effect.id, "unit_id": unit_id}) unit_model["effects"] = effects """ Add dialogue """ for q in range(0, total_dialogue_per_unit): a_dialogue = self._make_dialogue() dialogue.append(a_dialogue) dialogue_collection.add(a_dialogue) unit_dialogue.append( {"dialogue_id": a_dialogue.id, "unit_id": unit_id}) unit_model["dialogue"] = dialogue """ Add completed unit to expected """ unit_models.append(unit_model) with LogCapture(): logger = logging.getLogger() unit = Unit(unit=unit_model, log=logger) expected_units.append(unit) unit_items_map = unit_items_model._get_unit_items_map(unit_items) unit_effects_map = unit_effects_model._get_unit_effects_map( unit_effects) unit_dialogue_map = unit_dialogue_model._get_unit_dialogue_map( unit_dialogue) builder = UnitBuilder() with LogCapture(): logger = logging.getLogger() actual_units = builder.build_units(unit_models=unit_models, unit_items_map=unit_items_map, item_collection=item_collection, effect_collection=effect_collection, unit_effects_map=unit_effects_map, dialogue_collection=dialogue_collection, unit_dialogue_map=unit_dialogue_map, log=logger) expected_unit_ids = [unit.id for e_unit in expected_units] actual_unit_ids = [unit.id for a_unit in actual_units] self.assertEqual(expected_unit_ids, actual_unit_ids) """ Test that the actual units contain the expected items and effects """ self.assertEqual(len(actual_units), len(expected_units)) for e_unit in expected_units: self.assertEqual(len(e_unit.items), total_items_per_unit) self.assertEqual(len(e_unit.effects), total_effects_per_unit) self.assertEqual(len(e_unit.dialogue), total_dialogue_per_unit) for a_unit in actual_units: self.assertEqual(len(a_unit.items), total_items_per_unit) self.assertEqual(len(a_unit.effects), total_effects_per_unit) self.assertEqual(len(a_unit.dialogue), total_dialogue_per_unit) """ Ensure each item either has no unit type requirement (0) or it matches the unit in question """ for a_item in a_unit.items: self.assertIn(a_item.unit_type_id, (0, a_unit.unit_type_id))