Skip to content

Commit

Permalink
QA-7149 added priority cases from 2022-2023
Browse files Browse the repository at this point in the history
  • Loading branch information
kbo001 committed Dec 20, 2024
1 parent 668496e commit d40bd34
Show file tree
Hide file tree
Showing 36 changed files with 2,675 additions and 76 deletions.
54 changes: 53 additions & 1 deletion HQSmokeTests/testPages/android/android_screen.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

from HQSmokeTests.userInputs.user_inputs import UserData
from appium.options.android import UiAutomator2Options
Expand Down Expand Up @@ -69,6 +70,7 @@ def __init__(self, settings):
self.form = "//android.widget.TextView[@text='"+UserData.new_form_name+"']"
self.text_field = "//android.widget.EditText"
self.submit_button = "//android.widget.TextView[@text='FINISH']"
self.log_out = "//android.widget.TextView[@text='Log out of CommCare']"

def click_xpath(self, locator):
element = self.driver.find_element(AppiumBy.XPATH, locator)
Expand All @@ -86,14 +88,19 @@ def send_text_id(self, locator, user_input):
element = self.driver.find_element(AppiumBy.ID, locator)
element.send_keys(user_input)

def wait_for_element(self, *locator, timeout=20):
clickable = ec.element_to_be_clickable(locator)
WebDriverWait(self.driver, timeout, poll_frequency=5).until(clickable,
message="Couldn't find locator: " + str(locator))

def install_app_and_submit_form(self, code, random_text):
self.driver.find_element(AppiumBy.XPATH, self.enter_code).click()
self.driver.find_element(AppiumBy.ID, self.profile_code).send_keys(code)
self.driver.find_element(AppiumBy.ID, self.start_install).click()
time.sleep(3)
self.driver.find_element(AppiumBy.XPATH, self.install).click()
time.sleep(15)
self.driver.find_element(AppiumBy.ID, self.username).send_keys(UserData.app_login)
self.driver.find_element(AppiumBy.ID, self.username).send_keys(UserData.new_app_login)
self.driver.find_element(AppiumBy.ID, self.password).send_keys(UserData.app_password)
self.driver.find_element(AppiumBy.ID, self.login).click()
time.sleep(50)
Expand All @@ -111,5 +118,50 @@ def install_app_and_submit_form(self, code, random_text):
self.driver.find_element(AppiumBy.XPATH, self.sync_button).click()
time.sleep(3)

def verify_app_install(self, code):
time.sleep(10)
self.driver.find_element(AppiumBy.XPATH, self.enter_code).click()
self.driver.find_element(AppiumBy.ID, self.profile_code).send_keys(code)
self.driver.find_element(AppiumBy.ID, self.start_install).click()
time.sleep(3)
self.driver.find_element(AppiumBy.XPATH, self.install).click()
time.sleep(30)
assert self.driver.find_element(AppiumBy.XPATH, "//android.widget.TextView[@text='Welcome back! Please log in.']").is_displayed(), "App not installed"
print("App installed successfully")

def verify_login_with_old_password(self, code, username, password):
time.sleep(10)
self.driver.find_element(AppiumBy.XPATH, self.enter_code).click()
self.driver.find_element(AppiumBy.ID, self.profile_code).send_keys(code)
self.driver.find_element(AppiumBy.ID, self.start_install).click()
time.sleep(3)
self.driver.find_element(AppiumBy.XPATH, self.install).click()
time.sleep(30)
assert self.driver.find_element(AppiumBy.XPATH, "//android.widget.TextView[@text='Welcome back! Please log in.']").is_displayed(), "App not installed"
print("App installed successfully")
self.driver.find_element(AppiumBy.ID, self.username).send_keys(username)
self.driver.find_element(AppiumBy.ID, self.password).send_keys(password)
self.driver.find_element(AppiumBy.ID, self.login).click()
time.sleep(40)
self.driver.find_element(AppiumBy.XPATH, self.log_out).click()
print("Successfully logged in and logged out with old password:", username, password)
time.sleep(3)
assert self.driver.find_element(AppiumBy.XPATH,
"//android.widget.TextView[@text='Welcome back! Please log in.']"
).is_displayed(), "App not installed"

def verify_login_with_new_password(self, username, password):
time.sleep(30)
assert self.driver.find_element(AppiumBy.XPATH, "//android.widget.TextView[@text='Welcome back! Please log in.']").is_displayed(), "App not installed"
print("Welcome screen present")
self.driver.find_element(AppiumBy.ID, self.username).send_keys(username)
self.driver.find_element(AppiumBy.ID, self.password).send_keys(password)
self.driver.find_element(AppiumBy.ID, self.login).click()
time.sleep(40)
self.driver.find_element(AppiumBy.XPATH, self.log_out).click()
print("Successfully logged in and logged out with new password :", username, password)
time.sleep(3)


def close_android_driver(self):
self.driver.quit()
39 changes: 39 additions & 0 deletions HQSmokeTests/testPages/applications/application_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ def __init__(self, driver):
self.advanced_settings_tab = (By.XPATH, "//a[@href='#commcare-settings']")
self.advanced_settings_tab_content = (By.ID, "app-settings-options")
self.form_settings_tab = (By.XPATH, "//a[@href='#form-settings']")
self.case_management_tab = (By.XPATH, "//a[@href='#case-configuration']")
self.user_properties = (By.XPATH, "//a[@href='#usercase-configuration']")
self.form_actions_tab = (By.XPATH, "//a[@href='#advanced']")



# Form Field Edit
self.add_new_form = (By.XPATH,"//a[@class='appnav-secondary js-add-new-item']")
Expand Down Expand Up @@ -110,6 +115,8 @@ def __init__(self, driver):
self.override_btn = (By.XPATH, "//button[contains(.,'Overwrite their work')]")
self.enter_app_code_link = (By.LINK_TEXT, "Enter App Code")



# language tab
self.language_option = "//select[contains(@data-bind,'langcode')]/option[.='{}']"
self.add_language_button = (By.XPATH, "//button[contains(@data-bind,'addLanguage')]")
Expand Down Expand Up @@ -428,3 +435,35 @@ def delete_all_application(self, apps):
self.click(self.delete_confirm)
assert self.is_present_and_displayed(self.delete_success, 200), "Application "+app+" not deleted."
print("Deleted the application", app)

def verify_form_settings_page(self, form_name):
self.hover_on_element((By.XPATH, self.form_link.format(form_name)))
self.wait_to_click((By.XPATH, self.form_settings_btn.format(form_name)))
time.sleep(5)
assert self.is_present_and_displayed(self.form_settings_tab)
assert self.is_present_and_displayed(self.case_management_tab)
assert self.is_present_and_displayed(self.form_actions_tab)
assert self.is_present_and_displayed(self.user_properties)
print("Form Settings page correctly displayed")

def verify_app_version_page(self):
self.wait_to_click((By.XPATH, self.field_edit_app_name.format(UserData.reassign_cases_application)))
time.sleep(2)
assert self.is_present_and_displayed(self.make_new_version_button)
print("Make New Version Page is correctly displayed")

def get_app_code(self, app_name):
self.wait_to_click((By.XPATH, self.field_edit_app_name.format(app_name)))
time.sleep(2)
self.wait_for_element(self.make_new_version_button)
self.wait_to_click(self.publish_button)
if self.is_present_and_displayed(self.enter_app_code_link):
self.wait_to_click(self.enter_app_code_link)
else:
print("Enter App Code link is not present")
code_text = self.wait_to_get_text(self.code)
self.wait_to_click(self.close)
# self.wait_to_click(self.delete_form)
# self.wait_to_click(self.delete_form_confirm)
print("App code: ", code_text)
return code_text
51 changes: 36 additions & 15 deletions HQSmokeTests/testPages/data/copy_cases_page.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import time

from selenium.webdriver import ActionChains
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
from common_utilities.selenium.base_page import BasePage
from HQSmokeTests.userInputs.user_inputs import UserData
Expand All @@ -16,9 +16,8 @@ def __init__(self, driver, settings):
self.env_url = settings["url"]
self.copy_cases_menu = (By.LINK_TEXT, "Copy Cases")
self.apply = (By.ID, "apply-btn")
self.case_type = (By.XPATH, "//label[.='Case Type']//following-sibling::div/*[@class='select2 select2-container select2-container--default select2-container--below']")
self.case_type_dropdown = (By.XPATH, "//label[.='Case Type']//following-sibling::div/select[@name='case_type']")

self.case_type = (By.XPATH, "//select[@name='case_type']")
self.case_type_option_value = (By.XPATH, "//option[@value='reassign']")

self.select_first_case = (By.XPATH, "(//td[2][not(contains(.,'no name'))]//preceding-sibling::td/input[@type='checkbox'])[1]")
self.first_case_name = (By.XPATH, "(//a[contains(@class, 'ajax_dialog')][not(contains(.,'no name'))])[1]")
Expand All @@ -38,7 +37,9 @@ def __init__(self, driver, settings):
self.copied_user_from_list = "//li[starts-with(text(), '{}')]"
self.success_message = (By.XPATH, "//*[@data-bind='html: message' and contains(.,'Cases copied')]")
self.empty_list = (By.XPATH, "//td[.='No data available to display. Please try changing your filters.']")

self.users_field = (By.XPATH, "(//textarea[@class='select2-search__field'])[1]")
self.users_list_item = "//ul[@role='listbox']/li[contains(.,'{}')]"
self.remove_buttons = (By.XPATH, "//select[@name='case_list_filter']//following-sibling::span//ul//button")

def sort_for_latest_on_top(self):
self.wait_to_click(self.last_modified)
Expand All @@ -47,14 +48,30 @@ def sort_for_latest_on_top(self):
self.wait_to_click(self.last_modified)
self.wait_for_element(self.last_modified_descending, 50)

def get_cases(self):
def remove_default_users(self):
self.wait_for_element(self.users_field)
count = self.find_elements(self.remove_buttons)
print(len(count))
for i in range(len(count)):
count[0].click()
time.sleep(2)
if len(count) != 1:
ActionChains(self.driver).send_keys(Keys.TAB).perform()
time.sleep(2)
count = self.find_elements(self.remove_buttons)
ActionChains(self.driver).send_keys(Keys.ESCAPE).perform()

def get_cases(self, username):
self.wait_to_click(self.copy_cases_menu)
time.sleep(5)
self.wait_for_element(self.apply, 70)
self.select_by_text(self.user_search_dropdown, UserData.searched_user)
self.select_by_value(self.case_type_dropdown, UserData.case_pregnancy)
self.wait_for_element(self.case_type, 60)
self.select_by_value(self.case_type, UserData.case_reassign)
self.remove_default_users()
self.send_keys(self.users_field, username)
self.wait_to_click((By.XPATH, self.users_list_item.format(username)))
time.sleep(1)
self.wait_to_click(self.apply)


def copy_case(self):
self.sort_for_latest_on_top()
time.sleep(5)
Expand All @@ -66,20 +83,24 @@ def copy_case(self):
time.sleep(1)
assigned_username = self.get_text((By.XPATH,self.copied_user_from_list.format(UserData.mobile_testuser)))
print("Assigned Username:", assigned_username)
self.move_to_element_and_click((By.XPATH,self.copied_user_from_list.format(UserData.mobile_testuser)))
self.move_to_element_and_click((By.XPATH, self.copied_user_from_list.format(UserData.mobile_testuser)))
time.sleep(5)
self.wait_to_click(self.copy_btn)
time.sleep(5)
self.wait_for_element(self.success_message, 30)
self.wait_for_element(self.success_message, 130)
print("Sleeping for sometimes for the case to be copied")
time.sleep(60)
self.wait_to_click(self.copy_cases_menu)
self.driver.refresh()
time.sleep(5)
self.wait_for_element(self.apply, 70)
self.select_by_text(self.user_search_dropdown, assigned_username)
self.remove_default_users()
self.send_keys(self.users_field, assigned_username)
self.wait_to_click((By.XPATH, self.users_list_item.format(assigned_username)))
time.sleep(3)
self.send_keys(self.search_query, case_being_copied)
self.wait_to_click(self.apply)
time.sleep(5)
self.scroll_to_bottom()
self.sort_for_latest_on_top()
if self.is_present(self.empty_list):
print("No Case Copied, List is empty")
assert False
Expand Down
103 changes: 103 additions & 0 deletions HQSmokeTests/testPages/data/export_data_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ def __init__(self, driver):
self.date_range = (By.ID, "id_date_range")
self.close_date_picker = (By.XPATH, "//div[@data-action='close']")
self.case_owner = (By.XPATH, "//span[@class='select2-selection select2-selection--multiple']")
self.export_sharing = (By.XPATH, "//select[@id='sharing-select']")

# Export Form and Case data variables
self.export_form_data_link = (By.LINK_TEXT, 'Export Form Data')
Expand Down Expand Up @@ -169,6 +170,14 @@ def __init__(self, driver):
os.path.join(UserData.USER_INPUT_BASE_DIR, "test_data/import_parent_child_case.xlsx")
)

self.repeat_checkbox = (By.XPATH, "//span[./span[@data-bind='text: table.label()'][contains(.,'Repeat') or contains(.,'repeat')]]//preceding-sibling::span/input[@type='checkbox'][contains(@data-bind,'disabled: false')]")

# Shared Export
self.shared_export_name = "//div[@class='card-header'][.='Exports Shared with Me']//following-sibling::div//td[.//span[.='{}']]"
self.shared_export_view_button = "//td[.//span[.='{}']]//following-sibling::td//a[contains(@data-bind,'editUrl')]//span[contains(.,'View')][not(@style)]"
self.shared_export_edit_button = "//td[.//span[.='{}']]//following-sibling::td//a[contains(@data-bind,'editUrl')]//span[contains(.,'Edit')][not(@style)]"


def get_url_paste_browser(self, username, password, item):
if item == 'cases':
odata_feed_link = self.wait_to_get_value(self.copy_odata_link_case)
Expand Down Expand Up @@ -840,3 +849,97 @@ def verify_case_import(self, text):
self.wait_for_element((By.XPATH, self.case_id_value.format(parent_id)))
assert self.is_present(self.related_cases_tab), "Parent not reassigned"
self.validate_child_case_data()

def add_repeat_form_exports(self, app, case, form, export_name):
self.wait_for_element(self.add_export_button, 100)
self.delete_bulk_exports()
self.wait_and_sleep_to_click(self.add_export_button)
time.sleep(100)
self.is_visible_and_displayed(self.app_type, 200)
self.wait_for_element(self.app_type, 200)
self.is_clickable(self.app_type)
self.select_by_text(self.app_type, UserData.app_type)
self.select_by_text(self.application, app)
self.select_by_text(self.module, case)
self.select_by_text(self.form, form)
self.wait_to_click(self.add_export_conf)
self.wait_for_element(self.export_name, 200)
self.clear(self.export_name)
self.send_keys(self.export_name, export_name+Keys.TAB)
time.sleep(5)
self.scroll_to_bottom()
list_repeat = self.find_elements(self.repeat_checkbox)
if len(list_repeat) > 0:
assert True
else:
print("Repeat checkbox are either absent or not enabled")
assert False
time.sleep(5)
self.js_click(self.export_settings_create)
print("Export created!!")

def check_for_case_id(self, case_id):
self.wait_for_element(self.find_data_by_ID)
self.wait_to_click(self.find_data_by_ID)
self.wait_to_clear_and_send_keys(self.find_data_by_case_ID_textbox, case_id)
self.wait_and_sleep_to_click(self.find_data_by_case_ID_button)
self.wait_for_element(self.view_FormID_CaseID)
link = self.get_attribute(self.view_FormID_CaseID, "href")
print(link)
self.driver.get(link)
self.wait_for_element((By.XPATH, self.case_id_value.format(case_id)))
if self.is_present_and_displayed((By.XPATH, self.case_id_value.format(case_id))):
assert True, "Case ID not present"
print("Case ID present")
else:
print("Case ID not present")
assert False

def add_shared_form_exports(self, name, private='NO'):
self.wait_for_element(self.add_export_button, 100)
self.wait_and_sleep_to_click(self.add_export_button)
time.sleep(100)
self.is_visible_and_displayed(self.app_type, 200)
self.wait_for_element(self.app_type, 200)
self.is_clickable(self.app_type)
self.select_by_text(self.app_type, UserData.app_type)
self.select_by_text(self.application, UserData.village_application)
self.select_by_text(self.module, UserData.case_list_name)
self.select_by_text(self.form, UserData.form_name)
self.wait_to_click(self.add_export_conf)
self.wait_for_element(self.export_name, 200)
self.clear(self.export_name)
self.send_keys(self.export_name, name+Keys.TAB)
time.sleep(5)
if private == 'YES':
self.scroll_to_element(self.export_sharing)
self.select_by_value(self.export_sharing, 'private')
time.sleep(2)
else:
self.scroll_to_element(self.export_sharing)
self.select_by_value(self.export_sharing, 'edit_and_export')
time.sleep(2)
self.scroll_to_bottom()
time.sleep(5)
self.js_click(self.export_settings_create)
print("Export created!!")
time.sleep(10)

def verify_shared_export_section(self, shared_export, private_export, permission='YES'):
self.wait_to_click(self.export_form_data_link)
self.wait_for_element(self.add_export_button)
assert self.is_present_and_displayed((By.XPATH, self.shared_export_name.format(shared_export))), "Shared export not present"
assert not self.is_present_and_displayed((By.XPATH, self.shared_export_name.format(private_export)), 5
), "Private export present"
if permission == 'YES':
assert self.is_present_and_displayed((By.XPATH, self.shared_export_edit_button.format(shared_export))
), "Shared export edit button not present"
assert not self.is_present_and_displayed((By.XPATH, self.shared_export_view_button.format(private_export)), 5
), "Shared export view button present"
elif permission == 'NO':
assert self.is_present_and_displayed((By.XPATH, self.shared_export_view_button.format(shared_export))
), "Shared export view button not present"
assert not self.is_present_and_displayed((By.XPATH, self.shared_export_edit_button.format(private_export)), 5
), "Shared export edit button present"
else:
print("Permission value is missing.")
Loading

0 comments on commit d40bd34

Please sign in to comment.