Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added hw4/__init__.py
Empty file.
Empty file added hw4/selenium/__init__.py
Empty file.
Empty file added hw4/selenium/tests/__init__.py
Empty file.
28 changes: 28 additions & 0 deletions hw4/selenium/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import pytest
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait


@pytest.fixture
def chrome_options():
options = Options()
options.add_argument("--window-size=1900x1000")
return options


@pytest.fixture
def driver(chrome_options):
driver = webdriver.Chrome(options=chrome_options)
driver.implicitly_wait(10)
driver.get('http://195.133.27.184/')
yield driver
driver.quit()


@pytest.fixture
def wait(driver):
wait = WebDriverWait(driver, timeout=10)
return wait


162 changes: 162 additions & 0 deletions hw4/selenium/tests/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


def test_register_positive(driver, wait):
# main page
driver.get('http://195.133.27.184/')
assert driver.title == "Объявления"

toggler_nav_locator = "//*[text()='Регистрация']"
driver.find_element(By.XPATH, toggler_nav_locator).click()

# registration form
page_title_locator = "//h1[text() = 'Регистрация']"
page_title = wait.until(EC.visibility_of_element_located((By.XPATH, page_title_locator)))
assert page_title.text == "Регистрация"

# input username
login_locator = "//*[@placeholder = 'Введите имя пользователя']"
driver.find_element(By.XPATH, login_locator).send_keys("Jerry") # John exists

# input password
password_locator = "//*[@placeholder = 'Введите пароль']"
driver.find_element(By.XPATH, password_locator).send_keys("Iamateacher") # password is too spread

# confirm password
confirm_password_locator = "//*[@placeholder = 'Подтвердите пароль']"
driver.find_element(By.XPATH, confirm_password_locator).send_keys("Iamateacher")

# click check-box is_tutor
check_box_locator = "//*[@name = 'is_tutor']"
check_box = driver.find_element(By.XPATH, check_box_locator)
if not check_box.is_selected():
check_box.click()

# submit form
submit_btn_locator = "//*[@type = 'submit']"
driver.find_element(By.XPATH, submit_btn_locator).click()

# new page opens
logout_btn_locator = "//*[text() = 'Выйти']"
logout_btn = wait.until(EC.element_to_be_clickable((By.XPATH, logout_btn_locator)))
assert logout_btn.is_displayed()


# NEGATIVE scenarios

# FOR TEACHER

def test_register_teacher_check_box(driver, wait):

toggler_nav_locator = "//*[text()='Регистрация']"
driver.find_element(By.XPATH, toggler_nav_locator).click()

# registration form
page_title_locator = "//h1[text() = 'Регистрация']"
page_title = wait.until(EC.visibility_of_element_located((By.XPATH, page_title_locator)))
assert page_title.text == "Регистрация"

# input username
login_locator = "//*[@placeholder = 'Введите имя пользователя']"
driver.find_element(By.XPATH, login_locator).send_keys("Jerry") # John exists

# input password
password_locator = "//*[@placeholder = 'Введите пароль']"
driver.find_element(By.XPATH, password_locator).send_keys("Iamateacher") # password is too spread

# confirm password
confirm_password_locator = "//*[@placeholder = 'Подтвердите пароль']"
driver.find_element(By.XPATH, confirm_password_locator).send_keys("Iamateacher")

# click check-box is_tutor
check_box_locator = "//*[@name = 'is_tutor']"
check_box = driver.find_element(By.XPATH, check_box_locator)
if not check_box.is_selected():
check_box.click()

# submit form
submit_btn_locator = "//*[@type = 'submit']"
driver.find_element(By.XPATH, submit_btn_locator).click()

# new page opens
logout_btn_locator = "//*[text() = 'Выйти']"
logout_btn = wait.until(EC.element_to_be_clickable((By.XPATH, logout_btn_locator)))
assert logout_btn.is_displayed()


### FOR STUDENT
@pytest.mark.parametrize("username, password, confirm_password, expected", [
("", "", "", "Обязательное поле."),
("Jerry", "", "", "Пользователь с таким именем уже существует."),
("", "qwertyuiop", "qwertyuiop", "Обязательное поле."),
# ("123456", "qwertyuiop", "qwertyuiop", " ? ") # ? should be an error. In fact, it passes
])
def test_register_student_username_negative(driver, wait, username, password, confirm_password, expected):
# main page
toggler_nav_locator = "//*[text()='Регистрация']"
driver.find_element(By.XPATH, toggler_nav_locator).click()

# registration form
page_title_locator = "//h1[text() = 'Регистрация']"
page_title = wait.until(EC.visibility_of_element_located((By.XPATH, page_title_locator)))
assert page_title.text == "Регистрация"

# input username
login_locator = "//*[@placeholder = 'Введите имя пользователя']"
driver.find_element(By.XPATH, login_locator).send_keys(username)

# input password
password_locator = "//*[@placeholder = 'Введите пароль']"
driver.find_element(By.XPATH, password_locator).send_keys(password)

# confirm password
confirm_password_locator = "//*[@placeholder = 'Подтвердите пароль']"
driver.find_element(By.XPATH, confirm_password_locator).send_keys(confirm_password)

# submit form
submit_btn_locator = "//*[@type = 'submit']"
driver.find_element(By.XPATH, submit_btn_locator).click()

error_message_locator = f"//*[text() = '{expected}']"
error_message = wait.until(EC.visibility_of_element_located((By.XPATH, error_message_locator)))
assert error_message.text == expected


@pytest.mark.parametrize("username, password, confirm_password, expected", [
("Nina", "qwertyuiop", "qwertyuiop", "Введённый пароль слишком широко распространён."),
("Nina", "12345678", "12345678", "Введённый пароль слишком широко распространён."),
("Nina", "poiuytre", "poiuytr", "Введенные пароли не совпадают."),
("Nina", "poiuytre", "poiuytree", "Введенные пароли не совпадают."),
("Nina", "qwertyu", "qwertyu", "Введённый пароль слишком короткий. Он должен содержать как минимум 8 символов.")
])
def test_register_student_password_negative(driver, wait, username, password, confirm_password, expected):
# main page
toggler_nav_locator = "//*[text()='Регистрация']"
driver.find_element(By.XPATH, toggler_nav_locator).click()

# registration form
page_title_locator = "//h1[text() = 'Регистрация']"
page_title = wait.until(EC.visibility_of_element_located((By.XPATH, page_title_locator)))
assert page_title.text == "Регистрация"

# input username
login_locator = "//*[@placeholder = 'Введите имя пользователя']"
driver.find_element(By.XPATH, login_locator).send_keys(username)

# input password
password_locator = "//*[@placeholder = 'Введите пароль']"
driver.find_element(By.XPATH, password_locator).send_keys(password)

# confirm password
confirm_password_locator = "//*[@placeholder = 'Подтвердите пароль']"
driver.find_element(By.XPATH, confirm_password_locator).send_keys(confirm_password)

# submit form
submit_btn_locator = "//*[@type = 'submit']"
driver.find_element(By.XPATH, submit_btn_locator).click()

error_message_locator = f"//*[text() = '{expected}']"
error_message = wait.until(EC.visibility_of_element_located((By.XPATH, error_message_locator)))
assert error_message.text == expected
36 changes: 36 additions & 0 deletions lesson1/api_tests/services/case/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,39 @@
"steps": ["шаг 1", "шаг 2", "шаг 3"],
"expected_result": "Задание выполнено",
}


schema_response_empty_data = {
"detail": [
{
"type": "missing",
"loc": ["body", "name"],
"msg": "Field required",
"input": {},
},
{
"type": "missing",
"loc": ["body", "description"],
"msg": "Field required",
"input": {},
},
{
"type": "missing",
"loc": ["body", "steps"],
"msg": "Field required",
"input": {},
},
{
"type": "missing",
"loc": ["body", "expected_result"],
"msg": "Field required",
"input": {},
},
{
"type": "missing",
"loc": ["body", "priority"],
"msg": "Field required",
"input": {},
},
]
}
61 changes: 60 additions & 1 deletion lesson1/api_tests/services/case/pom.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,65 @@
from utils.api_client import client
from lesson1.api_tests.utils.api_client import client
from lesson1.api_tests.services.case.data import create_case_dict


def create_case(json={}):
response = client.make_request(handle="/testcases", method="POST", json=json)
return response


def get_read_root():
response = client.make_request(
handle="/",
method="GET"
)
return response


def read_cases():
response = client.make_request(
handle="/testcases",
method="GET",
)
return response


def read_case():
response = create_case(json=create_case_dict)
case_id = response.get_value_with_key("id")
response = client.make_request(
handle=f"/testcases/{case_id}",
method="GET",
)
return response


def get_case_id():
response = create_case(json=create_case_dict)
case_id = response.get_value_with_key("id")
return case_id


def update_case():
case_id = get_case_id()
response = client.make_request(
handle=f"/testcases/{case_id}",
method="PUT",
json={
"id": 5,
"name": "string",
"description": "string",
"steps": ["string"],
"expected_result": "string",
"priority": "низкий",
},
)
return response


def delete_case():
case_id = create_case(json=create_case_dict).get_value_with_key("id")
response = client.make_request(
handle=f"/testcases/{case_id}",
method="DELETE",
)
return response
6 changes: 3 additions & 3 deletions lesson1/api_tests/tests/test_case.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from services.case.pom import create_case
from services.case.data import create_case_dict
from services.case.models import Case
from lesson1.api_tests.services.case.pom import create_case
from lesson1.api_tests.services.case.data import create_case_dict
from lesson1.api_tests.services.case.models import Case


def test_create_case():
Expand Down
Loading