feat(@DesktopApp): SignUp Scenario (Squish Test)

Ticket: https://github.com/status-im/status-desktop/issues/5718
This commit is contained in:
femi 2022-05-24 10:58:04 +01:00 committed by Iuri Matias
parent 198db8658c
commit 2be85fd6a5
8 changed files with 203 additions and 22 deletions

View File

@ -0,0 +1,12 @@
class Common:
def __init__(self):
pass
def click_on_an_object(self, obj):
click_obj_by_name(obj)
def input_text(self, obj, text):
type(obj, text)

View File

@ -1,7 +1,7 @@
#******************************************************************************
# Status.im
#*****************************************************************************/
#/**
# /**
# * \file SquishDriver.py
# *
# * \date February 2022
@ -14,13 +14,13 @@ from enum import Enum
import squish
import object
import names
import test
# The default maximum timeout to find ui object
_MAX_WAIT_OBJ_TIMEOUT = 5000 #[milliseconds]
# Waits for the given object is loaded, visible and enabled.
# It returns a tuple: True in case it is found. Otherwise, false. And the object itself.
def is_loaded_visible_and_enabled(objName, timeout = _MAX_WAIT_OBJ_TIMEOUT):
_MAX_WAIT_OBJ_TIMEOUT = 5000
def is_loaded_visible_and_enabled(objName, timeout=_MAX_WAIT_OBJ_TIMEOUT):
obj = None
try:
obj = squish.waitForObject(getattr(names, objName), timeout)
@ -28,8 +28,12 @@ def is_loaded_visible_and_enabled(objName, timeout = _MAX_WAIT_OBJ_TIMEOUT):
except LookupError:
return False, obj
# Waits for the given object is loaded and might be not visible and/or not enabled:
# It returns a tuple: True in case it is found. Otherwise, false. And the object itself.
def verify_screen_is_loaded(objName, timeout=_MAX_WAIT_OBJ_TIMEOUT):
result = is_loaded_visible_and_enabled(objName, timeout)
test.verify(result, True)
def is_loaded(objName):
obj = None
try:
@ -37,27 +41,27 @@ def is_loaded(objName):
return True, obj
except LookupError:
return False, obj
# It checks if the given object is visible and enabled.
def is_visible_and_enabled(obj):
return obj.visible and obj.enabled
# Given a specific object, get a specific child.
def get_child(obj, child_index = None):
def get_child(obj, child_index=None):
if None == child_index:
return object.children(obj)
else:
return object.children(obj)[child_index]
# It executes the click action into the given object:
def click_obj(obj):
try:
squish.mouseClick(obj, squish.Qt.LeftButton)
return True
except LookupError:
return False
# It executes the click action into object with given object name:
def click_obj_by_name(objName):
try:
obj = squish.waitForObject(getattr(names, objName))
@ -65,12 +69,30 @@ def click_obj_by_name(objName):
return True
except LookupError:
return False
# It types the specified text into the given object (as if the user had used the keyboard):
def check_obj_by_name(objName):
try:
obj = squish.waitForObject(getattr(names, objName))
obj.checked = True
return True
except LookupError:
return False
def verify_text(objName, text):
try:
obj = squish.waitForObject(getattr(names, objName))
test.compare(obj.text, text, "Found the following text " + text)
return True
except LookupError:
return False
def type(objName, text):
try:
obj = squish.findObject(getattr(names, objName))
squish.type(obj, text)
return True
except LookupError:
return False
return False

View File

@ -0,0 +1,7 @@
class StatusChatScreen:
def __init__(self):
pass

View File

@ -0,0 +1,63 @@
#******************************************************************************
# Status.im
#*****************************************************************************/
# /**
# * \file StatusWelcomeScreen.py
# *
# * \date May 2022
# * \brief Sign Up and Login for new users to the app.
# *****************************************************************************/
class AgreementPopUp(Enum):
ACKNOWLEDGE_CHECKBOX = "acknowledge_checkbox"
TERMS_OF_USE_CHECK_BOX = "termsOfUseCheckBox_StatusCheckBox"
GET_STARTED_BUTTON = "getStartedStatusButton_StatusButton"
class SignUpComponents(Enum):
NEW_TO_STATUS = "mainWindow_I_am_new_to_Status_StatusBaseText"
GENERATE_NEW_KEYS = "mainWindow_Generate_new_keys_StatusBaseText"
USERNAME_INPUT = "mainWindow_edit_TextEdit"
NEXT_BUTTON = "mainWindow_Next_StatusBaseText"
NEXT_STATUS_BUTTON = "mainWindow_nextBtn_StatusButton"
NEW_PASSWORD_BUTTON = "mainWindow_New_password_PlaceholderText"
PASSWORD_INPUT = "loginView_passwordInput"
CONFIRM_PASSWORD = "mainWindow_Confirm_password_PlaceholderText"
PASSWORD_CONFIRM_INPUT = "mainWindow_inputValue_StyledTextField"
CREATE_PASSWORD = "mainWindow_Create_password_StatusBaseText"
CONFIRM_PASSWORD_AGAIN = "mainWindow_Confirm_you_password_again_PlaceholderText"
FINALIZE_PASSWORD_STEP = "mainWindow_Finalise_Status_Password_Creation_StatusBaseText"
PASSWORD_PREFERENCE = "mainWindow_I_prefer_to_use_my_password_StatusBaseText"
class StatusWelcomeScreen():
def __init__(self):
verify_screen_is_loaded(AgreementPopUp.ACKNOWLEDGE_CHECKBOX.value)
def agree_terms_conditions_and_generate_new_key(self):
verify_text(AgreementPopUp.ACKNOWLEDGE_CHECKBOX.value, "I acknowledge that Status Desktop is in Beta and by using it, I take the full responsibility for all risks concerning my data and funds.")
click_obj_by_name(AgreementPopUp.ACKNOWLEDGE_CHECKBOX.value)
check_obj_by_name(AgreementPopUp.TERMS_OF_USE_CHECK_BOX.value)
click_obj_by_name(AgreementPopUp.GET_STARTED_BUTTON.value)
click_obj_by_name(SignUpComponents.NEW_TO_STATUS.value)
click_obj_by_name(SignUpComponents.GENERATE_NEW_KEYS.value)
def input_username_and_password_and_finalize_sign_up(self, username, password):
type(SignUpComponents.USERNAME_INPUT.value, username)
click_obj_by_name(SignUpComponents.NEXT_BUTTON.value)
click_obj_by_name(SignUpComponents.NEXT_STATUS_BUTTON.value)
click_obj_by_name(SignUpComponents.NEW_PASSWORD_BUTTON.value)
type(SignUpComponents.PASSWORD_INPUT.value, password)
click_obj_by_name(SignUpComponents.CONFIRM_PASSWORD.value)
type(SignUpComponents.PASSWORD_CONFIRM_INPUT.value, password)
click_obj_by_name(SignUpComponents.CREATE_PASSWORD.value)
click_obj_by_name(SignUpComponents.CONFIRM_PASSWORD_AGAIN.value)
type(SignUpComponents.PASSWORD_INPUT.value, password)
click_obj_by_name(SignUpComponents.FINALIZE_PASSWORD_STEP.value)
click_obj_by_name(SignUpComponents.PASSWORD_PREFERENCE.value)

View File

@ -11,3 +11,23 @@ loginView_main = {"container": statusDesktop_mainWindow, "type": "LoginView", "v
loginView_errMsgLabel = {"container": statusDesktop_mainWindow, "id": "errMsg", "type": "StyledText", "visible": True}
statusDesktop_mainWindow_overlay = {"container": statusDesktop_mainWindow, "type": "Overlay", "unnamed": 1, "visible": True}
accountsView_accountListPanel = {"container": statusDesktop_mainWindow_overlay, "type": "AccountListPanel", "visible": True}
acknowledge_checkbox = {"checkable": True, "container": statusDesktop_mainWindow_overlay, "objectName": "acknowledgeCheckBox", "type": "StatusCheckBox", "visible": True}
termsOfUseCheckBox_StatusCheckBox = {"checkable": True, "container": statusDesktop_mainWindow_overlay, "id":"termsOfUse", "type": "StatusCheckBox", "visible": True}
getStartedStatusButton_StatusButton = {"container": statusDesktop_mainWindow_overlay, "objectName": "getStartedStatusButton", "type": "StatusButton", "visible": True}
mainWindow_I_am_new_to_Status_StatusBaseText = {"container": statusDesktop_mainWindow, "text": "I am new to Status", "type": "StatusBaseText", "unnamed": 1, "visible": True}
mainWindow_Generate_new_keys_StatusBaseText = {"container": statusDesktop_mainWindow, "text": "Generate new keys", "type": "StatusBaseText", "unnamed": 1, "visible": True}
get_Started_StatusBaseText = {"container": statusDesktop_mainWindow_overlay, "text": "Get Started", "type": "StatusBaseText", "unnamed": 1, "visible": True}
i_accept_Status_StatusBaseText = {"container": statusDesktop_mainWindow_overlay, "text": "I accept Status", "type": "StatusBaseText", "unnamed": 1, "visible": True}
termsOfUseLink_StatusBaseText = {"container": statusDesktop_mainWindow_overlay, "objectName": "termsOfUseLink", "type": "StatusBaseText", "visible": True}
mainWindow_edit_TextEdit = {"container": statusDesktop_mainWindow, "id": "edit", "type": "TextEdit", "unnamed": 1, "visible": True}
mainWindow_Next_StatusBaseText = {"container": statusDesktop_mainWindow, "text": "Next", "type": "StatusBaseText", "unnamed": 1, "visible": True}
mainWindow_Confirm_password_PlaceholderText = {"container": statusDesktop_mainWindow, "text": "Confirm password", "type": "PlaceholderText", "unnamed": 1, "visible": True}
mainWindow_Display_name_StatusBaseText = {"container": statusDesktop_mainWindow, "text": "Display name", "type": "StatusBaseText", "unnamed": 1, "visible": True}
mainWindow_nextBtn_StatusButton = {"container": statusDesktop_mainWindow, "id": "nextBtn", "type": "StatusButton", "unnamed": 1, "visible": True}
mainWindow_New_password_PlaceholderText = {"container": statusDesktop_mainWindow, "text": "New password", "type": "PlaceholderText", "unnamed": 1, "visible": True}
mainWindow_inputValue_StyledTextField = {"container": statusDesktop_mainWindow, "echoMode": 2, "id": "inputValue", "occurrence": 2, "passwordCharacter": "", "type": "StyledTextField", "unnamed": 1, "visible": True}
mainWindow_Rectangle = {"container": statusDesktop_mainWindow, "occurrence": 11, "type": "Rectangle", "unnamed": 1, "visible": True}
mainWindow_Create_password_StatusBaseText = {"container": statusDesktop_mainWindow, "text": "Create password", "type": "StatusBaseText", "unnamed": 1, "visible": True}
mainWindow_Confirm_you_password_again_PlaceholderText = {"container": statusDesktop_mainWindow, "text": "Confirm you password (again)", "type": "PlaceholderText", "unnamed": 1, "visible": True}
mainWindow_Finalise_Status_Password_Creation_StatusBaseText = {"container": statusDesktop_mainWindow, "text": "Finalise Status Password Creation", "type": "StatusBaseText", "unnamed": 1, "visible": True}
mainWindow_I_prefer_to_use_my_password_StatusBaseText = {"container": statusDesktop_mainWindow, "text": "I prefer to use my password", "type": "StatusBaseText", "unnamed": 1, "visible": True}

View File

@ -3,7 +3,7 @@
#******************************************************************************
# Status.im
#*****************************************************************************/
#/**
# /**
# * \file steps.py
# *
# * \test Status Desktop - Login
@ -14,10 +14,15 @@
# * with a pattern which is matched against the steps being executed.
# *****************************************************************************
from data.StatusAccount import StatusAccount
from processes.StatusLoginProcess import StatusLoginProcess
from processes.StatusLoginProcess import StatusLoginProcess
from screens.StatusWelcomeScreen import StatusWelcomeScreen
from screens.StatusChatScreen import StatusChatScreen
welcomeScreen = StatusWelcomeScreen()
@Given("A Status Desktop |any| and |word|")
def step(context,account,password):
def step(context, account, password):
# Create new data domain:
accountObj = StatusAccount(account, password)
@ -31,6 +36,7 @@ def step(context,account,password):
# Verify process can be executed:
test.verify(process.can_execute_process(), "Not possible to start login process. Check if expected Login Screen is available.")
@When("the user tries to login with valid credentials")
def step(context):
@ -39,6 +45,7 @@ def step(context):
# Check valid process behavior:
loginProcess.execute_process(True)
@When("the user tries to login with invalid credentials")
def step(context):
loginProcess = context.userData['process']
@ -46,16 +53,35 @@ def step(context):
# Check invalid process behavior:
loginProcess.execute_process(False)
@Then("the user is able to login to Status Desktop application")
def step(context):
get_process_result(context)
@Then("the user is NOT able to login to Status Desktop application")
def step(context):
get_process_result(context)
@Given("A first time user lands on the status desktop and generates new key")
def step(context):
welcomeScreen.agree_terms_conditions_and_generate_new_key()
@When("user inputs username |any| and password |any|")
def step(context, username, password):
welcomeScreen.input_username_and_password_and_finalize_sign_up(username, password)
@Then("the user lands on the signed in app")
def step(context):
StatusChatScreen()
# Common:
def get_process_result(context):
loginProcess = context.userData['process']
result, description = loginProcess.get_process_result()
test.verify(result, description)

View File

@ -0,0 +1,23 @@
#******************************************************************************
# Status.im
#*****************************************************************************/
#/**
# * \file test.feature
# *
# * \test Status Sign up
# * \date May 2022
# **
# *****************************************************************************/
Feature: Status Desktop Sign Up
As a user I want to Sign-up into the Status Desktop application.
The following scenarios cover Sign up process.
Scenario: User signs up with password
Given A first time user lands on the status desktop and generates new key
When user inputs username tester123 and password TesTEr16843/!@00
Then the user lands on the signed in app

View File

@ -0,0 +1,8 @@
source(findFile('scripts', 'python/bdd.py'))
setupHooks('../shared/scripts/bdd_hooks.py')
collectStepDefinitions('./steps', '../shared/steps')
def main():
testSettings.throwOnFailure = True
runFeatureFile('test.feature')