diff --git a/src/character/tests/test_pet.py b/src/character/tests/test_pet.py new file mode 100644 index 0000000..de82580 --- /dev/null +++ b/src/character/tests/test_pet.py @@ -0,0 +1,90 @@ +from django.core.management import call_command +from model_bakery import baker +from pytest_django.live_server_helper import LiveServer +from selenium.webdriver.common.by import By +from selenium.webdriver.firefox.webdriver import WebDriver + +from character.models import Character +from common.models import User + + +def test_pet_happy_path(selenium: WebDriver, live_server: LiveServer): + # Load fixtures + call_command("loaddata", "initial_data") + + # Create a user + username, password = "user", "some_password" + player = User.objects.create_user(username, password=password) + character = baker.make(Character, player=player) + + # Starting on the character's sheet. + selenium.get(live_server.url + character.get_absolute_url()) + + # Click on the button to add a pet. + selenium.find_element(By.ID, "add-pet").click() + + pet_start_health = 10 + + # A form appears, asking the pet's details. + # Fill the form. + # Fields are: name, health_max, health_remaining, modifier_strength, + # modifier_dexterity, modifier_constitution, modifier_intelligence, + # modifier_wisdom, modifier_charisma, damage, initiative, defense, attack, + # recovery and notes. + selenium.find_element(By.ID, "id_name").send_keys("My pet") + selenium.find_element(By.ID, "id_health_max").send_keys(str(pet_start_health)) + selenium.find_element(By.ID, "id_health_remaining").send_keys(str(pet_start_health)) + selenium.find_element(By.ID, "id_modifier_strength").send_keys("-3") + selenium.find_element(By.ID, "id_modifier_dexterity").send_keys("-2") + selenium.find_element(By.ID, "id_modifier_constitution").send_keys("-1") + selenium.find_element(By.ID, "id_modifier_intelligence").send_keys("1") + selenium.find_element(By.ID, "id_modifier_wisdom").send_keys("2") + selenium.find_element(By.ID, "id_modifier_charisma").send_keys("3") + selenium.find_element(By.ID, "id_damage").send_keys("4") + selenium.find_element(By.ID, "id_initiative").send_keys("5") + selenium.find_element(By.ID, "id_defense").send_keys("6") + selenium.find_element(By.ID, "id_attack").send_keys("7") + selenium.find_element(By.ID, "id_recovery").send_keys("1 heure 1 dé de vie") + selenium.find_element(By.ID, "id_notes").send_keys("My pet's notes") + + # Save & check redirected to character's sheet. + selenium.find_element(By.ID, "save-pet").click() + assert selenium.current_url == live_server.url + character.get_absolute_url() + + # Fetch pet + pet = character.pets.first() + + # It now displays the pet's information. + # There can be multiple pets. + assert ( + selenium.find_element(By.CSS_SELECTOR, f".pet[data-id='{pet.pk}'] .name").text + == "My pet" + ) + + # The GM and I can edit my pet's life points, + # in order to follow them during the fight. + selenium.find_element( + By.CSS_SELECTOR, + f".pet[data-id='{pet.pk}'] .health .decrease", + ).click() + pet.refresh_from_db() + assert pet.health_remaining == pet_start_health - 1 + + # I can edit my pets. When I click on the edit button of a pet, + # I have the same form as previously, pre-filled with the current values of my pet. + selenium.find_element(By.CSS_SELECTOR, f".pet[data-id='{pet.pk}'] .edit").click() + assert selenium.find_element(By.ID, "id_name").get_attribute("value") == "My pet" + assert selenium.find_element(By.ID, "id_health_max").get_attribute("value") == "10" + assert ( + selenium.find_element(By.ID, "id_health_remaining").get_attribute("value") + == "10" + ) + + # I can delete my pets. When I click on the pet's delete button, + # I'm redirected to a page asking confirmation of my action, + # in order to avoid mistakes. + selenium.find_element(By.CSS_SELECTOR, f".pet[data-id='{pet.pk}'] .delete").click() + assert character.pets.count() == 1 + selenium.find_element(By.ID, "delete-pet").click() + assert selenium.current_url == live_server.url + character.get_absolute_url() + assert character.pets.count() == 0