From 717d1d8f8547bfc5bda2197e366fce42dabdc595 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Thu, 29 Feb 2024 13:28:48 +0100 Subject: [PATCH 01/20] Init --- .../girevance/feedback/test_feedback.py | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 backend/selenium_tests/girevance/feedback/test_feedback.py diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py new file mode 100644 index 0000000000..f110f26196 --- /dev/null +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -0,0 +1,100 @@ +import random + +import pytest +from page_object.grievance.details_feedback_page import FeedbackDetailsPage +from page_object.grievance.feedback import Feedback +from page_object.grievance.new_feedback import NewFeedback + +pytestmark = pytest.mark.django_db(transaction=True) + + +@pytest.mark.skip(reason="ToDo") +@pytest.mark.usefixtures("login") +class TestFeedback: + @pytest.mark.parametrize( + "test_data", + [ + pytest.param( + { + "description": "New Feedback - " + str(random.random()), + "type": "Negative", + }, + id="Negative", + ), + ], + [ + pytest.param( + { + "description": "New Feedback - " + str(random.random()), + "type": "Positive", + }, + id="Positive", + ), + ], + ) + def test_create_feedback_mandatory_fields( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + # Create Feedback + + # Check Details page + + def test_create_feedback_optional_fields( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + def test_create_feedback_with_household( + self, + pageFeedback: Feedback, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + def test_create_feedback_with_individual( + self, + pageFeedback: Feedback, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + def test_create_feedback_error_messages( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + def test_create_linked_ticket( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + def test_edit_feedback( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() From c220a5e833fd55e20b5b4e56aa90665475dec8c6 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Thu, 29 Feb 2024 15:16:15 +0100 Subject: [PATCH 02/20] Init --- .../girevance/feedback/test_feedback.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index f110f26196..978dbf92d9 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -4,10 +4,57 @@ from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.grievance.new_feedback import NewFeedback +from page_object.filters import Filters pytestmark = pytest.mark.django_db(transaction=True) +@pytest.mark.skip(reason="ToDo") +@pytest.mark.usefixtures("login") +class TestSmokeFeedback: + def test_check_feedback_page( + self, + pageFeedback: Feedback, + test_data: dict, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + # Check Feedback page + + def test_check_feedback_details_page( + self, + pageFeedback: Feedback, + test_data: dict, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + # Check Feedback details page + + +@pytest.mark.skip(reason="ToDo") +@pytest.mark.usefixtures("login") +class TestFeedbackFilters: + def feedback_search_filter(self): + pass + + def feedback_programme_filter(self): + pass + + def feedback_issue_type_filter(self): + pass + + def feedback_created_by_filter(self): + pass + + def feedback_creation_date_filter(self): + pass + + def feedback_programme_state_filter(self): + pass + + def feedback_clear_button(self): + pass + @pytest.mark.skip(reason="ToDo") @pytest.mark.usefixtures("login") class TestFeedback: From 8a7f63e2d40b73427d46b3a79c61842710a757fb Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Mon, 4 Mar 2024 21:22:28 +0100 Subject: [PATCH 03/20] Init filters --- .../girevance/feedback/test_feedback.py | 92 ++++++++++--------- .../page_object/base_components.py | 6 ++ backend/selenium_tests/page_object/filters.py | 5 + 3 files changed, 60 insertions(+), 43 deletions(-) create mode 100644 backend/selenium_tests/page_object/filters.py diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 978dbf92d9..78c98f207a 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -4,7 +4,6 @@ from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.grievance.new_feedback import NewFeedback -from page_object.filters import Filters pytestmark = pytest.mark.django_db(transaction=True) @@ -13,18 +12,24 @@ @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( - self, - pageFeedback: Feedback, - test_data: dict, + self, + pageFeedback: Feedback, + test_data: dict, ) -> None: + """ + "Go to Grievance page", + "Go to Feedback page", + "Elements of Grievance menu are visible", + "Check if all elements on page exist", + """ # Go to Feedback pageFeedback.getNavFeedback().click() # Check Feedback page def test_check_feedback_details_page( - self, - pageFeedback: Feedback, - test_data: dict, + self, + pageFeedback: Feedback, + test_data: dict, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() @@ -34,27 +39,28 @@ def test_check_feedback_details_page( @pytest.mark.skip(reason="ToDo") @pytest.mark.usefixtures("login") class TestFeedbackFilters: - def feedback_search_filter(self): + def feedback_search_filter(self) -> None: pass - def feedback_programme_filter(self): + def feedback_programme_filter(self) -> None: pass - def feedback_issue_type_filter(self): + def feedback_issue_type_filter(self) -> None: pass - def feedback_created_by_filter(self): + def feedback_created_by_filter(self) -> None: pass - def feedback_creation_date_filter(self): + def feedback_creation_date_filter(self) -> None: pass - def feedback_programme_state_filter(self): + def feedback_programme_state_filter(self) -> None: pass - def feedback_clear_button(self): + def feedback_clear_button(self) -> None: pass + @pytest.mark.skip(reason="ToDo") @pytest.mark.usefixtures("login") class TestFeedback: @@ -80,11 +86,11 @@ class TestFeedback: ], ) def test_create_feedback_mandatory_fields( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() @@ -93,55 +99,55 @@ def test_create_feedback_mandatory_fields( # Check Details page def test_create_feedback_optional_fields( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() def test_create_feedback_with_household( - self, - pageFeedback: Feedback, + self, + pageFeedback: Feedback, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() def test_create_feedback_with_individual( - self, - pageFeedback: Feedback, + self, + pageFeedback: Feedback, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() def test_create_feedback_error_messages( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() def test_create_linked_ticket( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() def test_edit_feedback( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + test_data: dict, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() diff --git a/backend/selenium_tests/page_object/base_components.py b/backend/selenium_tests/page_object/base_components.py index da7781de28..005eaf403c 100644 --- a/backend/selenium_tests/page_object/base_components.py +++ b/backend/selenium_tests/page_object/base_components.py @@ -4,6 +4,12 @@ class BaseComponents(Common): navProgrammeManagement = 'a[data-cy="nav-Programme Management"]' + navGrievance = '' + navFeedback = '' + navGrievanceTicket = '' def getNavProgrammeManagement(self) -> WebElement: return self.wait_for(self.navProgrammeManagement) + + def getNavFeedback(self) -> WebElement: + return self.wait_for(self.navFeedback) diff --git a/backend/selenium_tests/page_object/filters.py b/backend/selenium_tests/page_object/filters.py new file mode 100644 index 0000000000..8f75ace036 --- /dev/null +++ b/backend/selenium_tests/page_object/filters.py @@ -0,0 +1,5 @@ +from helpers.helper import Common + + +class Filters(Common): + search = "" From d396c95f067880b128b3e99b5e8f91afc55ce351 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Tue, 5 Mar 2024 14:57:41 +0100 Subject: [PATCH 04/20] Added fixture --- backend/selenium_tests/conftest.py | 5 + .../girevance/feedback/test_feedback.py | 187 +++++++++--------- .../page_object/base_components.py | 3 + 3 files changed, 104 insertions(+), 91 deletions(-) diff --git a/backend/selenium_tests/conftest.py b/backend/selenium_tests/conftest.py index 1ac2094ee8..8a691409a4 100644 --- a/backend/selenium_tests/conftest.py +++ b/backend/selenium_tests/conftest.py @@ -8,6 +8,8 @@ from _pytest.fixtures import FixtureRequest from _pytest.nodes import Item from _pytest.runner import CallInfo + +from page_object.grievance.feedback import Feedback from page_object.admin_panel.admin_panel import AdminPanel from page_object.programme_details.programme_details import ProgrammeDetails from page_object.programme_management.programme_management import ProgrammeManagement @@ -88,6 +90,9 @@ def pageProgrammeDetails(request: FixtureRequest, browser: Chrome) -> ProgrammeD def pageAdminPanel(request: FixtureRequest, browser: Chrome) -> AdminPanel: yield AdminPanel(browser) +@pytest.fixture +def pageFeedback(request: FixtureRequest, browser: Chrome) -> Feedback: + yield Feedback(browser) @pytest.fixture def change_super_user() -> None: diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 78c98f207a..2477398779 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -8,6 +8,11 @@ pytestmark = pytest.mark.django_db(transaction=True) +@pytest.fixture(autouse=True) +def go_to_feedback_page(pageFeedback): + pageFeedback.getNavGrievance().click() + pageFeedback.getNavFeedback().click() + @pytest.mark.skip(reason="ToDo") @pytest.mark.usefixtures("login") class TestSmokeFeedback: @@ -60,94 +65,94 @@ def feedback_programme_state_filter(self) -> None: def feedback_clear_button(self) -> None: pass - -@pytest.mark.skip(reason="ToDo") -@pytest.mark.usefixtures("login") -class TestFeedback: - @pytest.mark.parametrize( - "test_data", - [ - pytest.param( - { - "description": "New Feedback - " + str(random.random()), - "type": "Negative", - }, - id="Negative", - ), - ], - [ - pytest.param( - { - "description": "New Feedback - " + str(random.random()), - "type": "Positive", - }, - id="Positive", - ), - ], - ) - def test_create_feedback_mandatory_fields( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, - ) -> None: - # Go to Feedback - pageFeedback.getNavFeedback().click() - # Create Feedback - - # Check Details page - - def test_create_feedback_optional_fields( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, - ) -> None: - # Go to Feedback - pageFeedback.getNavFeedback().click() - - def test_create_feedback_with_household( - self, - pageFeedback: Feedback, - ) -> None: - # Go to Feedback - pageFeedback.getNavFeedback().click() - - def test_create_feedback_with_individual( - self, - pageFeedback: Feedback, - ) -> None: - # Go to Feedback - pageFeedback.getNavFeedback().click() - - def test_create_feedback_error_messages( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, - ) -> None: - # Go to Feedback - pageFeedback.getNavFeedback().click() - - def test_create_linked_ticket( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, - ) -> None: - # Go to Feedback - pageFeedback.getNavFeedback().click() - - def test_edit_feedback( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - test_data: dict, - ) -> None: - # Go to Feedback - pageFeedback.getNavFeedback().click() +# +# @pytest.mark.skip(reason="ToDo") +# @pytest.mark.usefixtures("login") +# class TestFeedback: +# @pytest.mark.parametrize( +# "test_data", +# [ +# pytest.param( +# { +# "description": "New Feedback - " + str(random.random()), +# "type": "Negative", +# }, +# id="Negative", +# ), +# ], +# [ +# pytest.param( +# { +# "description": "New Feedback - " + str(random.random()), +# "type": "Positive", +# }, +# id="Positive", +# ), +# ], +# ) +# def test_create_feedback_mandatory_fields( +# self, +# pageFeedback: Feedback, +# pageFeedbackDetails: FeedbackDetailsPage, +# pageNewFeedback: NewFeedback, +# test_data: dict, +# ) -> None: +# # Go to Feedback +# pageFeedback.getNavFeedback().click() +# # Create Feedback +# +# # Check Details page +# +# def test_create_feedback_optional_fields( +# self, +# pageFeedback: Feedback, +# pageFeedbackDetails: FeedbackDetailsPage, +# pageNewFeedback: NewFeedback, +# test_data: dict, +# ) -> None: +# # Go to Feedback +# pageFeedback.getNavFeedback().click() +# +# def test_create_feedback_with_household( +# self, +# pageFeedback: Feedback, +# ) -> None: +# # Go to Feedback +# pageFeedback.getNavFeedback().click() +# +# def test_create_feedback_with_individual( +# self, +# pageFeedback: Feedback, +# ) -> None: +# # Go to Feedback +# pageFeedback.getNavFeedback().click() +# +# def test_create_feedback_error_messages( +# self, +# pageFeedback: Feedback, +# pageFeedbackDetails: FeedbackDetailsPage, +# pageNewFeedback: NewFeedback, +# test_data: dict, +# ) -> None: +# # Go to Feedback +# pageFeedback.getNavFeedback().click() +# +# def test_create_linked_ticket( +# self, +# pageFeedback: Feedback, +# pageFeedbackDetails: FeedbackDetailsPage, +# pageNewFeedback: NewFeedback, +# test_data: dict, +# ) -> None: +# # Go to Feedback +# pageFeedback.getNavFeedback().click() +# +# def test_edit_feedback( +# self, +# pageFeedback: Feedback, +# pageFeedbackDetails: FeedbackDetailsPage, +# pageNewFeedback: NewFeedback, +# test_data: dict, +# ) -> None: +# # Go to Feedback +# pageFeedback.getNavFeedback().click() diff --git a/backend/selenium_tests/page_object/base_components.py b/backend/selenium_tests/page_object/base_components.py index 005eaf403c..87545ddf0f 100644 --- a/backend/selenium_tests/page_object/base_components.py +++ b/backend/selenium_tests/page_object/base_components.py @@ -13,3 +13,6 @@ def getNavProgrammeManagement(self) -> WebElement: def getNavFeedback(self) -> WebElement: return self.wait_for(self.navFeedback) + + def getNavGrievance(self) -> WebElement: + return self.wait_for(self.navGrievance) \ No newline at end of file From caacc6db1d238ed1110a1e210d5736ff006d0e23 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Wed, 6 Mar 2024 08:09:37 +0100 Subject: [PATCH 05/20] test --- backend/selenium_tests/girevance/feedback/test_feedback.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 2477398779..7657615e38 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -13,7 +13,6 @@ def go_to_feedback_page(pageFeedback): pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() -@pytest.mark.skip(reason="ToDo") @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( From b0d9e859a3b0cdab3ec93659c0fc7d2dfe03ef41 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Wed, 6 Mar 2024 11:42:14 +0100 Subject: [PATCH 06/20] Smoke tests added --- .../accountability/fixtures/data-cypress.json | 8 +-- backend/selenium_tests/conftest.py | 9 +++ .../girevance/feedback/test_feedback.py | 66 +++++++++++++++---- .../page_object/base_components.py | 7 +- .../page_object/grievance/feedback.py | 18 ++--- 5 files changed, 76 insertions(+), 32 deletions(-) diff --git a/backend/hct_mis_api/apps/accountability/fixtures/data-cypress.json b/backend/hct_mis_api/apps/accountability/fixtures/data-cypress.json index 9ca4b86af9..b2a2b4f6b3 100644 --- a/backend/hct_mis_api/apps/accountability/fixtures/data-cypress.json +++ b/backend/hct_mis_api/apps/accountability/fixtures/data-cypress.json @@ -16,9 +16,7 @@ "area": "", "language": "", "consent": true, - "created_by": "4196c2c5-c2dd-48d2-887f-3a9d39e78916", - "linked_grievance": null, - "program": "de3a43bf-a755-41ff-a5c0-acd02cf3d244" + "linked_grievance": null } }, { @@ -38,9 +36,7 @@ "area": "", "language": "", "consent": false, - "created_by": "4196c2c5-c2dd-48d2-887f-3a9d39e78916", - "linked_grievance": null, - "program": "de3a43bf-a755-41ff-a5c0-acd02cf3d244" + "linked_grievance": null } } ] \ No newline at end of file diff --git a/backend/selenium_tests/conftest.py b/backend/selenium_tests/conftest.py index 8a691409a4..620d6fca9d 100644 --- a/backend/selenium_tests/conftest.py +++ b/backend/selenium_tests/conftest.py @@ -9,6 +9,7 @@ from _pytest.nodes import Item from _pytest.runner import CallInfo +from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.admin_panel.admin_panel import AdminPanel from page_object.programme_details.programme_details import ProgrammeDetails @@ -90,10 +91,17 @@ def pageProgrammeDetails(request: FixtureRequest, browser: Chrome) -> ProgrammeD def pageAdminPanel(request: FixtureRequest, browser: Chrome) -> AdminPanel: yield AdminPanel(browser) + @pytest.fixture def pageFeedback(request: FixtureRequest, browser: Chrome) -> Feedback: yield Feedback(browser) + +@pytest.fixture +def pageFeedbackDetails(request: FixtureRequest, browser: Chrome) -> FeedbackDetailsPage: + yield FeedbackDetailsPage(browser) + + @pytest.fixture def change_super_user() -> None: user = User.objects.filter(email="test@example.com").first() @@ -117,6 +125,7 @@ def create_super_user() -> User: country = Country.objects.get(name="Afghanistan") business_area = BusinessArea.objects.create( **{ + "pk": "c259b1a0-ae3a-494e-b343-f7c8eb060c68", "code": "0060", "name": "Afghanistan", "long_name": "THE ISLAMIC REPUBLIC OF AFGHANISTAN", diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 7657615e38..6f813bdbf3 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -4,40 +4,78 @@ from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.grievance.new_feedback import NewFeedback +from django.conf import settings +from django.core.management import call_command + +from hct_mis_api.apps.core.models import BusinessArea pytestmark = pytest.mark.django_db(transaction=True) -@pytest.fixture(autouse=True) -def go_to_feedback_page(pageFeedback): - pageFeedback.getNavGrievance().click() - pageFeedback.getNavFeedback().click() +@pytest.fixture +def add_feedbacks(): + call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/accountability/fixtures/data-cypress.json") + return @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( - self, - pageFeedback: Feedback, - test_data: dict, + self, + pageFeedback: Feedback, ) -> None: """ - "Go to Grievance page", - "Go to Feedback page", - "Elements of Grievance menu are visible", - "Check if all elements on page exist", + Go to Grievance page + Go to Feedback page + Check if all elements on page exist """ # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() # Check Feedback page + pageFeedback.getTitlePage() + pageFeedback.getButtonSubmitNewFeedback() + pageFeedback.getFilterSearch() + pageFeedback.getFilterIssueType() + pageFeedback.getFilterCreatedBy() + pageFeedback.getFilterCreationDateFrom() + pageFeedback.getFilterCreationDateTo() + pageFeedback.getButtonClear() + pageFeedback.getButtonApply() + assert pageFeedback.textTableTitle in pageFeedback.getTableTitle().text + assert pageFeedback.textFeedbackID in pageFeedback.getFeedbackID().text + assert pageFeedback.textIssueType in pageFeedback.getIssueType().text + assert pageFeedback.textHouseholdID in pageFeedback.getHouseholdID().text + assert pageFeedback.textLinkedGrievance in pageFeedback.getLinkedGrievance().text + assert pageFeedback.textCreatedBy in pageFeedback.getCreatedBy().text + assert pageFeedback.textCreationDate in pageFeedback.getCreationDate().text def test_check_feedback_details_page( - self, - pageFeedback: Feedback, - test_data: dict, + self, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, ) -> None: + """ + Go to Grievance page + Go to Feedback page + Choose Feedback + Check if all elements on page exist + """ # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + pageFeedback.getRows()[0].click() # Check Feedback details page + assert pageFeedbackDetails.textTitle in pageFeedbackDetails.getTitlePage().text + pageFeedbackDetails.getButtonEdit() + assert pageFeedbackDetails.textCategory in pageFeedbackDetails.getCategory().text + assert pageFeedbackDetails.textIssueType in pageFeedbackDetails.getIssueType().text + pageFeedbackDetails.getHouseholdID() + pageFeedbackDetails.getIndividualID() + pageFeedbackDetails.getCreatedBy() + pageFeedbackDetails.getDateCreated() + pageFeedbackDetails.getLastModifiedDate() + pageFeedbackDetails.getAdministrativeLevel2() @pytest.mark.skip(reason="ToDo") diff --git a/backend/selenium_tests/page_object/base_components.py b/backend/selenium_tests/page_object/base_components.py index 87545ddf0f..36a1ff685b 100644 --- a/backend/selenium_tests/page_object/base_components.py +++ b/backend/selenium_tests/page_object/base_components.py @@ -4,9 +4,10 @@ class BaseComponents(Common): navProgrammeManagement = 'a[data-cy="nav-Programme Management"]' - navGrievance = '' - navFeedback = '' - navGrievanceTicket = '' + navGrievance = 'div[data-cy="nav-Grievance"]' + navFeedback = 'a[data-cy="nav-Feedback"]' + navGrievanceTicket = 'a[data-cy="nav-Grievance Tickets"]' + navGrievanceDashboard = 'a[data-cy="nav-Grievance Dashboard"]' def getNavProgrammeManagement(self) -> WebElement: return self.wait_for(self.navProgrammeManagement) diff --git a/backend/selenium_tests/page_object/grievance/feedback.py b/backend/selenium_tests/page_object/grievance/feedback.py index 79358d62f8..2a66ba34b9 100644 --- a/backend/selenium_tests/page_object/grievance/feedback.py +++ b/backend/selenium_tests/page_object/grievance/feedback.py @@ -8,7 +8,7 @@ class Feedback(BaseComponents): buttonSubmitNewFeedback = 'a[data-cy="button-submit-new-feedback"]' filterSearch = 'div[data-cy="filters-search"]' filterIssueType = 'div[data-cy="filters-issue-type"]' - filterCreatedBy = 'div[data-cy="filters-created-by"]' + filterCreatedBy = 'div[data-cy="Created by-input"]' filterCreationDateFrom = 'div[data-cy="filters-creation-date-from"]' filterCreationDateTo = 'div[data-cy="filters-creation-date-to"]' buttonClear = 'button[data-cy="button-filters-clear"]' @@ -70,25 +70,25 @@ def getTableTitle(self) -> WebElement: return self.wait_for(self.tableTitle) def getFeedbackID(self) -> WebElement: - return self.wait_for(self.tableColumns).eq(0) + return self.get_elements(self.tableColumns)[0] def getIssueType(self) -> WebElement: - return self.wait_for(self.tableColumns).eq(1) + return self.get_elements(self.tableColumns)[1] def getHouseholdID(self) -> WebElement: - return self.wait_for(self.tableColumns).eq(2) + return self.get_elements(self.tableColumns)[2] def getLinkedGrievance(self) -> WebElement: - return self.wait_for(self.tableColumns).eq(3) + return self.get_elements(self.tableColumns)[3] def getCreatedBy(self) -> WebElement: - return self.wait_for(self.tableColumns).eq(4) + return self.get_elements(self.tableColumns)[4] def getCreationDate(self) -> WebElement: - return self.wait_for(self.tableColumns).eq(5) + return self.get_elements(self.tableColumns)[5] - def getRows(self) -> WebElement: - return self.wait_for(self.tableRow) + def getRows(self) -> list[WebElement]: + return self.get_elements(self.tableRow) def getDaysFilterPopup(self) -> WebElement: return self.wait_for(self.daysFilterPopup) From d81b9405c128370365693a32ce294ce8540f15b0 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Thu, 7 Mar 2024 18:32:27 +0100 Subject: [PATCH 07/20] Added tests --- backend/selenium_tests/conftest.py | 6 + .../girevance/feedback/test_feedback.py | 186 +++++++++--------- backend/selenium_tests/helpers/helper.py | 8 + .../grievance/details_feedback_page.py | 4 + .../page_object/grievance/new_feedback.py | 32 +-- 5 files changed, 131 insertions(+), 105 deletions(-) diff --git a/backend/selenium_tests/conftest.py b/backend/selenium_tests/conftest.py index 620d6fca9d..03a9e12c18 100644 --- a/backend/selenium_tests/conftest.py +++ b/backend/selenium_tests/conftest.py @@ -9,6 +9,7 @@ from _pytest.nodes import Item from _pytest.runner import CallInfo +from page_object.grievance.new_feedback import NewFeedback from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.admin_panel.admin_panel import AdminPanel @@ -102,6 +103,11 @@ def pageFeedbackDetails(request: FixtureRequest, browser: Chrome) -> FeedbackDet yield FeedbackDetailsPage(browser) +@pytest.fixture +def pageNewFeedback(request: FixtureRequest, browser: Chrome) -> NewFeedback: + yield NewFeedback(browser) + + @pytest.fixture def change_super_user() -> None: user = User.objects.filter(email="test@example.com").first() diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 6f813bdbf3..6f69cd287f 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -17,6 +17,8 @@ def add_feedbacks(): call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/accountability/fixtures/data-cypress.json") return + +@pytest.mark.skip(reason="Done!") @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( @@ -78,7 +80,7 @@ def test_check_feedback_details_page( pageFeedbackDetails.getAdministrativeLevel2() -@pytest.mark.skip(reason="ToDo") +@pytest.mark.skip(reason="ToDo: Filters") @pytest.mark.usefixtures("login") class TestFeedbackFilters: def feedback_search_filter(self) -> None: @@ -102,94 +104,94 @@ def feedback_programme_state_filter(self) -> None: def feedback_clear_button(self) -> None: pass -# -# @pytest.mark.skip(reason="ToDo") -# @pytest.mark.usefixtures("login") -# class TestFeedback: -# @pytest.mark.parametrize( -# "test_data", -# [ -# pytest.param( -# { -# "description": "New Feedback - " + str(random.random()), -# "type": "Negative", -# }, -# id="Negative", -# ), -# ], -# [ -# pytest.param( -# { -# "description": "New Feedback - " + str(random.random()), -# "type": "Positive", -# }, -# id="Positive", -# ), -# ], -# ) -# def test_create_feedback_mandatory_fields( -# self, -# pageFeedback: Feedback, -# pageFeedbackDetails: FeedbackDetailsPage, -# pageNewFeedback: NewFeedback, -# test_data: dict, -# ) -> None: -# # Go to Feedback -# pageFeedback.getNavFeedback().click() -# # Create Feedback -# -# # Check Details page -# -# def test_create_feedback_optional_fields( -# self, -# pageFeedback: Feedback, -# pageFeedbackDetails: FeedbackDetailsPage, -# pageNewFeedback: NewFeedback, -# test_data: dict, -# ) -> None: -# # Go to Feedback -# pageFeedback.getNavFeedback().click() -# -# def test_create_feedback_with_household( -# self, -# pageFeedback: Feedback, -# ) -> None: -# # Go to Feedback -# pageFeedback.getNavFeedback().click() -# -# def test_create_feedback_with_individual( -# self, -# pageFeedback: Feedback, -# ) -> None: -# # Go to Feedback -# pageFeedback.getNavFeedback().click() -# -# def test_create_feedback_error_messages( -# self, -# pageFeedback: Feedback, -# pageFeedbackDetails: FeedbackDetailsPage, -# pageNewFeedback: NewFeedback, -# test_data: dict, -# ) -> None: -# # Go to Feedback -# pageFeedback.getNavFeedback().click() -# -# def test_create_linked_ticket( -# self, -# pageFeedback: Feedback, -# pageFeedbackDetails: FeedbackDetailsPage, -# pageNewFeedback: NewFeedback, -# test_data: dict, -# ) -> None: -# # Go to Feedback -# pageFeedback.getNavFeedback().click() -# -# def test_edit_feedback( -# self, -# pageFeedback: Feedback, -# pageFeedbackDetails: FeedbackDetailsPage, -# pageNewFeedback: NewFeedback, -# test_data: dict, -# ) -> None: -# # Go to Feedback -# pageFeedback.getNavFeedback().click() + +@pytest.mark.usefixtures("login") +class TestFeedback: + + @pytest.mark.parametrize("issue_type", ["Positive", "Negative"]) + def test_create_feedback_mandatory_fields( + self, + issue_type: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + ) -> None: + # Go to Feedback + pageFeedback.getNavGrievance().click() + pageFeedback.getNavFeedback().click() + # Create Feedback + pageFeedback.getButtonSubmitNewFeedback().click() + from time import sleep + sleep(1) + pageNewFeedback.chooseOptionByName(issue_type) + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getHouseholdTab() + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getReceivedConsent().click() + pageNewFeedback.getButtonNext().click() + assert "Feedback" in pageNewFeedback.getLabelCategory().text + pageNewFeedback.getDescription().send_keys("Test") + programme_creation_url = pageNewFeedback.driver.current_url + pageNewFeedback.getButtonNext().click() + # Check Details page + assert "=" in pageNewFeedback.wait_for_new_url(programme_creation_url).split("/")[-1] + assert pageFeedbackDetails.textCategory in pageFeedbackDetails.getCategory().text + assert issue_type in pageFeedbackDetails.getIssueType().text + assert "-" in pageFeedbackDetails.getHouseholdID().text + assert "-" in pageFeedbackDetails.getIndividualID().text + print(pageFeedbackDetails.getCreatedBy().text) + print(pageFeedbackDetails.getProgramme().text) + pageFeedbackDetails.getLastModifiedDate() + pageFeedbackDetails.getAdministrativeLevel2() + + @pytest.mark.skip(reason="ToDo") + def test_create_feedback_optional_fields( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + @pytest.mark.skip(reason="ToDo") + def test_create_feedback_with_household( + self, + pageFeedback: Feedback, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + @pytest.mark.skip(reason="ToDo") + def test_create_feedback_with_individual( + self, + pageFeedback: Feedback, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + @pytest.mark.skip(reason="ToDo") + def test_create_feedback_error_messages( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + @pytest.mark.skip(reason="ToDo") + def test_create_linked_ticket( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() + + @pytest.mark.skip(reason="ToDo") + def test_edit_feedback( + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + ) -> None: + # Go to Feedback + pageFeedback.getNavFeedback().click() diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index 0fd67daf33..ead2469224 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -36,6 +36,14 @@ def wait_for_new_url(self, old_url: str, retry: int = 5) -> str: break return self.driver.current_url + @staticmethod + def choose_option(list_options: list, name: str) -> None: + for option in list_options: + if name in option.text: + option.click() + return + assert False + @staticmethod def find_in_element(element: WebElement, locator: str, element_type: str = By.CSS_SELECTOR) -> list[WebElement]: return element.find_elements(element_type, locator) diff --git a/backend/selenium_tests/page_object/grievance/details_feedback_page.py b/backend/selenium_tests/page_object/grievance/details_feedback_page.py index 69d1e7d6a9..854ef82144 100644 --- a/backend/selenium_tests/page_object/grievance/details_feedback_page.py +++ b/backend/selenium_tests/page_object/grievance/details_feedback_page.py @@ -11,6 +11,7 @@ class FeedbackDetailsPage(BaseComponents): labelIssueType = 'div[data-cy="label-Issue Type"]' labelHouseholdID = 'div[data-cy="label-Household ID"]' labelIndividualID = 'div[data-cy="label-Individual ID"]' + labelProgramme = 'div[data-cy="label-Programme"]' labelCreatedBy = 'div[data-cy="label-Created By"]' labelDateCreated = 'div[data-cy="label-Date Created"]' labelLastModifiedDate = 'div[data-cy="label-Last Modified Date"]' @@ -50,6 +51,9 @@ def getHouseholdID(self) -> WebElement: def getIndividualID(self) -> WebElement: return self.wait_for(self.labelIndividualID) + def getProgramme(self) -> WebElement: + return self.wait_for(self.labelProgramme) + def getCreatedBy(self) -> WebElement: return self.wait_for(self.labelCreatedBy) diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index 741b91bf07..7d4d45ddad 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -1,5 +1,6 @@ from page_object.base_components import BaseComponents from selenium.webdriver.remote.webelement import WebElement +from selenium.webdriver.support.select import Select class NewFeedback(BaseComponents): @@ -49,20 +50,20 @@ def getButtonBack(self) -> WebElement: def getButtonNext(self) -> WebElement: return self.wait_for(self.buttonNext) - def getOption(self) -> WebElement: - return self.wait_for(self.option) + def getOptions(self) -> list[WebElement]: + return self.get_elements(self.option) - def getHouseholdTab(self) -> WebElement: - return self.wait_for(self.lookUpTabs).contains(self.textLookUpHousehold) + def getHouseholdTab(self) -> None: + assert self.textLookUpHousehold in self.wait_for(self.lookUpTabs).text - def getLookUpIndividual(self) -> WebElement: - return self.wait_for(self.lookUpTabs).contains(self.textLookUpIndividual) + def getLookUpIndividual(self) -> None: + assert self.textLookUpIndividual in self.wait_for(self.lookUpTabs).text def getHouseholdTableRows(self, number: int) -> WebElement: - return self.wait_for(self.householdTableRow).eq(number) + return self.get_elements(self.householdTableRow)[number] def getIndividualTableRow(self, number: int) -> WebElement: - return self.wait_for(self.individualTableRow).eq(number) + return self.get_elements(self.individualTableRow)[number] def getReceivedConsent(self) -> WebElement: return self.wait_for(self.receivedConsent) @@ -91,11 +92,16 @@ def getInputIssueType(self) -> WebElement: def checkElementsOnPage(self) -> None: self.getTitlePage().contains(self.textTitle) self.getLabelCategory().contains(self.textCategory) - self.getSelectIssueType().should("be.visible") - self.getButtonCancel().should("be.visible") - self.getButtonBack().should("be.visible") - self.getButtonNext().should("be.visible") + self.getSelectIssueType() + self.getButtonCancel() + self.getButtonBack() + self.getButtonNext() def chooseOptionByName(self, name: str) -> None: self.getSelectIssueType().click() - self.getOption().contains(name).click() + select_element = self.wait_for('ul[data-cy="select-options-container"]') + select = Select(select_element) + print(select.options) + select.select_by_visible_text('name') + # self.getSelectIssueType().click() + # self.choose_option(self.getOptions(), name) From 061440a2bc9a50740ca94178bf81bcbea54417fd Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Mon, 11 Mar 2024 09:30:04 +0100 Subject: [PATCH 08/20] Added tests --- .../girevance/feedback/test_feedback.py | 4 +--- backend/selenium_tests/helpers/helper.py | 15 ++++++++++++++- .../page_object/grievance/new_feedback.py | 12 ++++-------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 6f69cd287f..df70f153e7 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -131,10 +131,8 @@ def test_create_feedback_mandatory_fields( pageNewFeedback.getButtonNext().click() assert "Feedback" in pageNewFeedback.getLabelCategory().text pageNewFeedback.getDescription().send_keys("Test") - programme_creation_url = pageNewFeedback.driver.current_url - pageNewFeedback.getButtonNext().click() + pageNewFeedback.check_page_after_click(pageNewFeedback.getButtonNext(), "=") # Check Details page - assert "=" in pageNewFeedback.wait_for_new_url(programme_creation_url).split("/")[-1] assert pageFeedbackDetails.textCategory in pageFeedbackDetails.getCategory().text assert issue_type in pageFeedbackDetails.getIssueType().text assert "-" in pageFeedbackDetails.getHouseholdID().text diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index ead2469224..8903862d7b 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -25,7 +25,7 @@ def wait_for(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElem return self._wait.until(EC.visibility_of_element_located((element_type, locator))) def wait_for_disappear( - self, locator: str, element_type: str = By.CSS_SELECTOR + self, locator: str, element_type: str = By.CSS_SELECTOR ) -> Union[Literal[False, True], WebElement]: return self._wait.until_not(EC.visibility_of_element_located((element_type, locator))) @@ -36,6 +36,19 @@ def wait_for_new_url(self, old_url: str, retry: int = 5) -> str: break return self.driver.current_url + def select_listbox_element(self, name: str, listbox: str = 'ul[role="listbox"]', + tag_name: str = 'li') -> WebElement: + select_element = self.wait_for(listbox) + items = select_element.find_elements("tag name", tag_name) + for item in items: + if name in item.text: + return item + + def check_page_after_click(self, button: WebElement, url_fragment) -> None: + programme_creation_url = self.driver.current_url + button.click() + assert url_fragment in self.wait_for_new_url(programme_creation_url).split("/")[-1] + @staticmethod def choose_option(list_options: list, name: str) -> None: for option in list_options: diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index 7d4d45ddad..d362032348 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -1,4 +1,5 @@ from page_object.base_components import BaseComponents +from selenium.webdriver.common.by import By from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.support.select import Select @@ -90,8 +91,8 @@ def getInputIssueType(self) -> WebElement: return self.wait_for(self.inputIssueType) def checkElementsOnPage(self) -> None: - self.getTitlePage().contains(self.textTitle) - self.getLabelCategory().contains(self.textCategory) + assert self.textTitle in self.getTitlePage() + assert self.textCategory in self.getLabelCategory() self.getSelectIssueType() self.getButtonCancel() self.getButtonBack() @@ -99,9 +100,4 @@ def checkElementsOnPage(self) -> None: def chooseOptionByName(self, name: str) -> None: self.getSelectIssueType().click() - select_element = self.wait_for('ul[data-cy="select-options-container"]') - select = Select(select_element) - print(select.options) - select.select_by_visible_text('name') - # self.getSelectIssueType().click() - # self.choose_option(self.getOptions(), name) + self.select_listbox_element(name).click() From 82409022c0289aa68fe37632c5e368cd7462b503 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Mon, 11 Mar 2024 10:40:34 +0100 Subject: [PATCH 09/20] Added tests --- .../girevance/feedback/test_feedback.py | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index df70f153e7..9200817702 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -7,8 +7,6 @@ from django.conf import settings from django.core.management import call_command -from hct_mis_api.apps.core.models import BusinessArea - pytestmark = pytest.mark.django_db(transaction=True) @@ -121,8 +119,6 @@ def test_create_feedback_mandatory_fields( pageFeedback.getNavFeedback().click() # Create Feedback pageFeedback.getButtonSubmitNewFeedback().click() - from time import sleep - sleep(1) pageNewFeedback.chooseOptionByName(issue_type) pageNewFeedback.getButtonNext().click() pageNewFeedback.getHouseholdTab() @@ -137,19 +133,44 @@ def test_create_feedback_mandatory_fields( assert issue_type in pageFeedbackDetails.getIssueType().text assert "-" in pageFeedbackDetails.getHouseholdID().text assert "-" in pageFeedbackDetails.getIndividualID().text - print(pageFeedbackDetails.getCreatedBy().text) - print(pageFeedbackDetails.getProgramme().text) + assert "-" in pageFeedbackDetails.getProgramme().text + assert "Test" in pageFeedbackDetails.getDescription().text pageFeedbackDetails.getLastModifiedDate() pageFeedbackDetails.getAdministrativeLevel2() @pytest.mark.skip(reason="ToDo") def test_create_feedback_optional_fields( self, + issue_type: None, pageFeedback: Feedback, pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + # Create Feedback + pageFeedback.getButtonSubmitNewFeedback().click() + pageNewFeedback.chooseOptionByName(issue_type) + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getHouseholdTab() + pageNewFeedback.getHouseholdTableRows()[0].click() + # I + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getReceivedConsent().click() + pageNewFeedback.getButtonNext().click() + assert "Feedback" in pageNewFeedback.getLabelCategory().text + pageNewFeedback.getDescription().send_keys("Test") + pageNewFeedback.check_page_after_click(pageNewFeedback.getButtonNext(), "=") + # Check Details page + assert pageFeedbackDetails.textCategory in pageFeedbackDetails.getCategory().text + assert issue_type in pageFeedbackDetails.getIssueType().text + assert "-" in pageFeedbackDetails.getHouseholdID().text + assert "-" in pageFeedbackDetails.getIndividualID().text + assert "-" in pageFeedbackDetails.getProgramme().text + assert "Test" in pageFeedbackDetails.getDescription().text + pageFeedbackDetails.getLastModifiedDate() + pageFeedbackDetails.getAdministrativeLevel2() @pytest.mark.skip(reason="ToDo") def test_create_feedback_with_household( From 24f0e1f42d2058896112f8c79aa8c430f6c65a28 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Fri, 15 Mar 2024 13:26:53 +0100 Subject: [PATCH 10/20] Enebale tests --- backend/selenium_tests/girevance/feedback/test_feedback.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 9200817702..f2652d12b2 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -16,7 +16,6 @@ def add_feedbacks(): return -@pytest.mark.skip(reason="Done!") @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( From e52c0b0c792aa003c5747da70c352fd968dbb8cc Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Mon, 18 Mar 2024 10:05:58 +0100 Subject: [PATCH 11/20] Test Automation: Fixed locator for Grievance --- backend/selenium_tests/page_object/base_components.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/selenium_tests/page_object/base_components.py b/backend/selenium_tests/page_object/base_components.py index 36a1ff685b..7363ac873d 100644 --- a/backend/selenium_tests/page_object/base_components.py +++ b/backend/selenium_tests/page_object/base_components.py @@ -4,7 +4,7 @@ class BaseComponents(Common): navProgrammeManagement = 'a[data-cy="nav-Programme Management"]' - navGrievance = 'div[data-cy="nav-Grievance"]' + navGrievance = 'a[data-cy="nav-Grievance"]' navFeedback = 'a[data-cy="nav-Feedback"]' navGrievanceTicket = 'a[data-cy="nav-Grievance Tickets"]' navGrievanceDashboard = 'a[data-cy="nav-Grievance Dashboard"]' From cdc8fa06d1ae26fca866fb11760dbabf778d333b Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Tue, 19 Mar 2024 08:17:18 +0100 Subject: [PATCH 12/20] Added tests --- .../apps/core/fixtures/data-selenium.json | 17 +++++ .../girevance/feedback/test_feedback.py | 73 +++++++++++++++++-- backend/selenium_tests/helpers/helper.py | 9 +++ .../page_object/base_components.py | 12 ++- .../page_object/grievance/feedback.py | 8 +- .../page_object/grievance/new_feedback.py | 8 ++ 6 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 backend/hct_mis_api/apps/core/fixtures/data-selenium.json diff --git a/backend/hct_mis_api/apps/core/fixtures/data-selenium.json b/backend/hct_mis_api/apps/core/fixtures/data-selenium.json new file mode 100644 index 0000000000..a1eac6294c --- /dev/null +++ b/backend/hct_mis_api/apps/core/fixtures/data-selenium.json @@ -0,0 +1,17 @@ +[{ + "model": "core.datacollectingtype", + "pk": 1, + "fields": { + "created": "2023-09-25T17:57:16.284Z", + "modified": "2023-09-25T17:57:16.284Z", + "label": "Full_TEST", + "code": "full_test", + "description": "Full individual collected", + "active": true, + "individual_filters_available": true, + "household_filters_available": true, + "compatible_types": [], + "limit_to": [] + } + } +] diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index f2652d12b2..2818a1034a 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -7,6 +7,8 @@ from django.conf import settings from django.core.management import call_command +from page_object.programme_details.programme_details import ProgrammeDetails + pytestmark = pytest.mark.django_db(transaction=True) @@ -16,6 +18,13 @@ def add_feedbacks(): return +@pytest.fixture +def create_programs(): + call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/core/fixtures/data-selenium.json") + call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/program/fixtures/data-cypress.json") + return + + @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( @@ -61,6 +70,7 @@ def test_check_feedback_details_page( Check if all elements on page exist """ # Go to Feedback + pageFeedback.driver.refresh() pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() pageFeedback.getRows()[0].click() @@ -154,7 +164,6 @@ def test_create_feedback_optional_fields( pageNewFeedback.getButtonNext().click() pageNewFeedback.getHouseholdTab() pageNewFeedback.getHouseholdTableRows()[0].click() - # I pageNewFeedback.getButtonNext().click() pageNewFeedback.getReceivedConsent().click() pageNewFeedback.getButtonNext().click() @@ -171,27 +180,77 @@ def test_create_feedback_optional_fields( pageFeedbackDetails.getLastModifiedDate() pageFeedbackDetails.getAdministrativeLevel2() - @pytest.mark.skip(reason="ToDo") - def test_create_feedback_with_household( + def test_check_feedback_filtering_by_chosen_programme( self, + create_programs: None, + add_feedbacks: None, pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + pageProgrammeDetails: ProgrammeDetails, ) -> None: # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + # Edit field Programme in Feedback + pageFeedback.getRows()[0].click() + assert "-" in pageFeedbackDetails.getProgramme().text + pageFeedbackDetails.getButtonEdit().click() + pageNewFeedback.selectProgramme("Test Programm").click() + pageNewFeedback.getButtonNext().click() + # Check Feedback filtering by chosen Programme + assert "Test Programm" in pageFeedbackDetails.getProgramme().text + assert pageFeedback.globalProgramFilterText in pageFeedback.getGlobalProgramFilter().text + pageFeedback.selectGlobalProgramFilter("Test Programm").click() + assert "Test Programm" in pageProgrammeDetails.getHeaderTitle().text + pageFeedback.wait_for_disappear(pageFeedback.navGrievanceDashboard) + pageFeedback.getNavGrievance().click() + pageFeedback.getNavFeedback().click() + assert 1 == len(pageFeedback.getRows()) + assert "Negative Feedback" in pageFeedback.getRows()[0].find_elements("tag name", 'td')[1].text - @pytest.mark.skip(reason="ToDo") - def test_create_feedback_with_individual( + pageFeedback.selectGlobalProgramFilter("Draft Program").click() + assert "Draft Program" in pageProgrammeDetails.getHeaderTitle().text + pageFeedback.wait_for_disappear(pageFeedback.navGrievanceDashboard) + pageFeedback.getNavGrievance().click() + pageFeedback.getNavFeedback().click() + assert 0 == len(pageFeedback.getRows()) + + pageFeedback.selectGlobalProgramFilter("All Programmes").click() + assert "Programme Management" in pageProgrammeDetails.getHeaderTitle().text + pageFeedback.wait_for_disappear(pageFeedback.navGrievanceDashboard) + pageFeedback.getNavGrievance().click() + pageFeedback.getNavFeedback().click() + assert 2 == len(pageFeedback.getRows()) + + def test_create_feedback_with_household( self, + create_programs: None, pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + # Create Feedback + pageFeedback.getButtonSubmitNewFeedback().click() + pageNewFeedback.chooseOptionByName("Negative Feedback") + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getHouseholdTab() + pageNewFeedback.getHouseholdTableRows()[0].click() + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getReceivedConsent().click() + pageNewFeedback.getButtonNext().click() + assert "Feedback" in pageNewFeedback.getLabelCategory().text + pageNewFeedback.getDescription().send_keys("Test") + pageNewFeedback.check_page_after_click(pageNewFeedback.getButtonNext(), "=") + # Check Details page @pytest.mark.skip(reason="ToDo") - def test_create_feedback_error_messages( + def test_create_feedback_with_individual( self, pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index 8903862d7b..975f92fbf9 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -1,3 +1,4 @@ +import os from time import sleep from typing import Literal, Union @@ -60,3 +61,11 @@ def choose_option(list_options: list, name: str) -> None: @staticmethod def find_in_element(element: WebElement, locator: str, element_type: str = By.CSS_SELECTOR) -> list[WebElement]: return element.find_elements(element_type, locator) + + def screenshot(self, + file_name: str = "test", + file_type: str = "png", + file_path: str = "screenshot", + delay_sec: int = 1) -> None: + sleep(delay_sec) + self.driver.get_screenshot_as_file(os.path.join(f'{file_path}', f'{file_name}.{file_type}')) diff --git a/backend/selenium_tests/page_object/base_components.py b/backend/selenium_tests/page_object/base_components.py index 7363ac873d..e2d08dfd69 100644 --- a/backend/selenium_tests/page_object/base_components.py +++ b/backend/selenium_tests/page_object/base_components.py @@ -3,12 +3,15 @@ class BaseComponents(Common): + globalProgramFilter = 'div[data-cy="global-program-filter"]' navProgrammeManagement = 'a[data-cy="nav-Programme Management"]' navGrievance = 'a[data-cy="nav-Grievance"]' navFeedback = 'a[data-cy="nav-Feedback"]' navGrievanceTicket = 'a[data-cy="nav-Grievance Tickets"]' navGrievanceDashboard = 'a[data-cy="nav-Grievance Dashboard"]' + globalProgramFilterText = "All Programmes" + def getNavProgrammeManagement(self) -> WebElement: return self.wait_for(self.navProgrammeManagement) @@ -16,4 +19,11 @@ def getNavFeedback(self) -> WebElement: return self.wait_for(self.navFeedback) def getNavGrievance(self) -> WebElement: - return self.wait_for(self.navGrievance) \ No newline at end of file + return self.wait_for(self.navGrievance) + + def getGlobalProgramFilter(self) -> WebElement: + return self.wait_for(self.globalProgramFilter) + + def selectGlobalProgramFilter(self, name: str) -> WebElement: + self.getGlobalProgramFilter().click() + return self.select_listbox_element(name) diff --git a/backend/selenium_tests/page_object/grievance/feedback.py b/backend/selenium_tests/page_object/grievance/feedback.py index 2a66ba34b9..da43283209 100644 --- a/backend/selenium_tests/page_object/grievance/feedback.py +++ b/backend/selenium_tests/page_object/grievance/feedback.py @@ -9,8 +9,8 @@ class Feedback(BaseComponents): filterSearch = 'div[data-cy="filters-search"]' filterIssueType = 'div[data-cy="filters-issue-type"]' filterCreatedBy = 'div[data-cy="Created by-input"]' - filterCreationDateFrom = 'div[data-cy="filters-creation-date-from"]' - filterCreationDateTo = 'div[data-cy="filters-creation-date-to"]' + filterCreationDateFrom = 'div[data-cy="date-picker-filter"]' + filterCreationDateTo = 'div[data-cy="date-picker-filter"]' buttonClear = 'button[data-cy="button-filters-clear"]' buttonApply = 'button[data-cy="button-filters-apply"]' tableTitle = 'h6[data-cy="table-title"]' @@ -52,10 +52,10 @@ def getFilterCreatedBy(self) -> WebElement: return self.wait_for(self.filterCreatedBy) def getFilterCreationDateFrom(self) -> WebElement: - return self.wait_for(self.filterCreationDateFrom) + return self.get_elements(self.filterCreationDateFrom)[0] def getFilterCreationDateTo(self) -> WebElement: - return self.wait_for(self.filterCreationDateTo) + return self.get_elements(self.filterCreationDateTo)[1] def getButtonClear(self) -> WebElement: return self.wait_for(self.buttonClear) diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index d362032348..65c869dbf1 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -24,6 +24,7 @@ class NewFeedback(BaseComponents): adminAreaAutocomplete = 'div[data-cy="input-admin2"]' inputLanguage = 'textarea[data-cy="input-language"]' inputArea = 'input[data-cy="input-area"]' + programmeSelect = 'div[data-cy="select-program"]' # Texts textTitle = "New Feedback" @@ -90,6 +91,13 @@ def getIssueType(self) -> WebElement: def getInputIssueType(self) -> WebElement: return self.wait_for(self.inputIssueType) + def getProgrammeSelect(self) -> WebElement: + return self.wait_for(self.programmeSelect) + + def selectProgramme(self, name: str) -> WebElement: + self.getProgrammeSelect().click() + return self.select_listbox_element(name) + def checkElementsOnPage(self) -> None: assert self.textTitle in self.getTitlePage() assert self.textCategory in self.getLabelCategory() From a372294c33892960fb9fd6ffaacbebec2f744085 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Tue, 19 Mar 2024 10:17:36 +0100 Subject: [PATCH 13/20] Added tests; black & isort & flake8 & mypy. --- .../apps/household/fixtures/data-cypress.json | 1 - backend/selenium_tests/conftest.py | 6 +- .../girevance/feedback/test_feedback.py | 99 ++++++++++--------- backend/selenium_tests/helpers/helper.py | 38 +++---- .../page_object/grievance/new_feedback.py | 21 ++-- 5 files changed, 90 insertions(+), 75 deletions(-) diff --git a/backend/hct_mis_api/apps/household/fixtures/data-cypress.json b/backend/hct_mis_api/apps/household/fixtures/data-cypress.json index 0fa4b09cbb..555312b1c2 100644 --- a/backend/hct_mis_api/apps/household/fixtures/data-cypress.json +++ b/backend/hct_mis_api/apps/household/fixtures/data-cypress.json @@ -493,7 +493,6 @@ "model": "household.individualidentity", "pk": 7, "fields": { - "partner": 1, "individual": "bc5a5b20-74a4-4d48-ab63-99a0c913850d", "number": "johniak pany", "country": "d1eb1574-8146-4c70-a804-caf163d451a6" diff --git a/backend/selenium_tests/conftest.py b/backend/selenium_tests/conftest.py index 03a9e12c18..1c75c8fc15 100644 --- a/backend/selenium_tests/conftest.py +++ b/backend/selenium_tests/conftest.py @@ -8,11 +8,10 @@ from _pytest.fixtures import FixtureRequest from _pytest.nodes import Item from _pytest.runner import CallInfo - -from page_object.grievance.new_feedback import NewFeedback +from page_object.admin_panel.admin_panel import AdminPanel from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback -from page_object.admin_panel.admin_panel import AdminPanel +from page_object.grievance.new_feedback import NewFeedback from page_object.programme_details.programme_details import ProgrammeDetails from page_object.programme_management.programme_management import ProgrammeManagement from pytest_django.live_server_helper import LiveServer @@ -146,6 +145,7 @@ def create_super_user() -> User: business_area.countries.add(country) user = UserFactory.create( + pk="4196c2c5-c2dd-48d2-887f-3a9d39e78916", is_superuser=True, is_staff=True, username="superuser", diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 2818a1034a..d8cbcdffde 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -1,25 +1,30 @@ -import random +from django.conf import settings +from django.core.management import call_command import pytest from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.grievance.new_feedback import NewFeedback -from django.conf import settings -from django.core.management import call_command - from page_object.programme_details.programme_details import ProgrammeDetails pytestmark = pytest.mark.django_db(transaction=True) @pytest.fixture -def add_feedbacks(): +def add_feedbacks() -> None: call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/accountability/fixtures/data-cypress.json") return @pytest.fixture -def create_programs(): +def add_households() -> None: + call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/registration_data/fixtures/data-cypress.json") + call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/household/fixtures/data-cypress.json") + return + + +@pytest.fixture +def create_programs() -> None: call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/core/fixtures/data-selenium.json") call_command("loaddata", f"{settings.PROJECT_ROOT}/apps/program/fixtures/data-cypress.json") return @@ -28,8 +33,8 @@ def create_programs(): @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( - self, - pageFeedback: Feedback, + self, + pageFeedback: Feedback, ) -> None: """ Go to Grievance page @@ -58,10 +63,10 @@ def test_check_feedback_page( assert pageFeedback.textCreationDate in pageFeedback.getCreationDate().text def test_check_feedback_details_page( - self, - add_feedbacks: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, + self, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, ) -> None: """ Go to Grievance page @@ -114,14 +119,13 @@ def feedback_clear_button(self) -> None: @pytest.mark.usefixtures("login") class TestFeedback: - @pytest.mark.parametrize("issue_type", ["Positive", "Negative"]) def test_create_feedback_mandatory_fields( - self, - issue_type: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + issue_type: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -149,11 +153,11 @@ def test_create_feedback_mandatory_fields( @pytest.mark.skip(reason="ToDo") def test_create_feedback_optional_fields( - self, - issue_type: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + issue_type: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -181,13 +185,13 @@ def test_create_feedback_optional_fields( pageFeedbackDetails.getAdministrativeLevel2() def test_check_feedback_filtering_by_chosen_programme( - self, - create_programs: None, - add_feedbacks: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - pageProgrammeDetails: ProgrammeDetails, + self, + create_programs: None, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + pageProgrammeDetails: ProgrammeDetails, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -207,7 +211,7 @@ def test_check_feedback_filtering_by_chosen_programme( pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() assert 1 == len(pageFeedback.getRows()) - assert "Negative Feedback" in pageFeedback.getRows()[0].find_elements("tag name", 'td')[1].text + assert "Negative Feedback" in pageFeedback.getRows()[0].find_elements("tag name", "td")[1].text pageFeedback.selectGlobalProgramFilter("Draft Program").click() assert "Draft Program" in pageProgrammeDetails.getHeaderTitle().text @@ -224,21 +228,24 @@ def test_check_feedback_filtering_by_chosen_programme( assert 2 == len(pageFeedback.getRows()) def test_create_feedback_with_household( - self, - create_programs: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + create_programs: None, + add_households: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() # Create Feedback pageFeedback.getButtonSubmitNewFeedback().click() - pageNewFeedback.chooseOptionByName("Negative Feedback") + pageNewFeedback.chooseOptionByName("Negative feedback") pageNewFeedback.getButtonNext().click() pageNewFeedback.getHouseholdTab() - pageNewFeedback.getHouseholdTableRows()[0].click() + pageNewFeedback.getHouseholdTableRows(1).click() + pageNewFeedback.getIndividualTab().click() + pageNewFeedback.screenshot("0") pageNewFeedback.getButtonNext().click() pageNewFeedback.getReceivedConsent().click() pageNewFeedback.getButtonNext().click() @@ -249,26 +256,26 @@ def test_create_feedback_with_household( @pytest.mark.skip(reason="ToDo") def test_create_feedback_with_individual( - self, - pageFeedback: Feedback, + self, + pageFeedback: Feedback, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() @pytest.mark.skip(reason="ToDo") def test_create_linked_ticket( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() @pytest.mark.skip(reason="ToDo") def test_edit_feedback( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, + self, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, ) -> None: # Go to Feedback pageFeedback.getNavFeedback().click() diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index 975f92fbf9..361d061c44 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -11,10 +11,14 @@ class Common: + DEFAULT_TIMEOUT = 60 + def __init__(self, driver: Chrome): self.driver = driver self.action = ActionChains(self.driver) - self._wait = WebDriverWait(self.driver, 60) + + def _wait(self, timeout: int = DEFAULT_TIMEOUT) -> WebDriverWait: + return WebDriverWait(self.driver, timeout) def get(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElement: return self.driver.find_element(element_type, locator) @@ -22,13 +26,13 @@ def get(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElement: def get_elements(self, locator: str, element_type: str = By.CSS_SELECTOR) -> list[WebElement]: return self.driver.find_elements(element_type, locator) - def wait_for(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElement: - return self._wait.until(EC.visibility_of_element_located((element_type, locator))) + def wait_for(self, locator: str, element_type: str = By.CSS_SELECTOR, timeout: int = DEFAULT_TIMEOUT) -> WebElement: + return self._wait(timeout).until(EC.visibility_of_element_located((element_type, locator))) def wait_for_disappear( - self, locator: str, element_type: str = By.CSS_SELECTOR + self, locator: str, element_type: str = By.CSS_SELECTOR, timeout: int = DEFAULT_TIMEOUT ) -> Union[Literal[False, True], WebElement]: - return self._wait.until_not(EC.visibility_of_element_located((element_type, locator))) + return self._wait(timeout).until_not(EC.visibility_of_element_located((element_type, locator))) def wait_for_new_url(self, old_url: str, retry: int = 5) -> str: for _ in range(retry): @@ -37,35 +41,35 @@ def wait_for_new_url(self, old_url: str, retry: int = 5) -> str: break return self.driver.current_url - def select_listbox_element(self, name: str, listbox: str = 'ul[role="listbox"]', - tag_name: str = 'li') -> WebElement: + def select_listbox_element( + self, name: str, listbox: str = 'ul[role="listbox"]', tag_name: str = "li" + ) -> WebElement: select_element = self.wait_for(listbox) items = select_element.find_elements("tag name", tag_name) for item in items: if name in item.text: return item + return select_element - def check_page_after_click(self, button: WebElement, url_fragment) -> None: + def check_page_after_click(self, button: WebElement, url_fragment: str) -> None: programme_creation_url = self.driver.current_url button.click() assert url_fragment in self.wait_for_new_url(programme_creation_url).split("/")[-1] @staticmethod - def choose_option(list_options: list, name: str) -> None: + def choose_option(list_options: list, name: str) -> bool: for option in list_options: if name in option.text: option.click() - return - assert False + return True + return False @staticmethod def find_in_element(element: WebElement, locator: str, element_type: str = By.CSS_SELECTOR) -> list[WebElement]: return element.find_elements(element_type, locator) - def screenshot(self, - file_name: str = "test", - file_type: str = "png", - file_path: str = "screenshot", - delay_sec: int = 1) -> None: + def screenshot( + self, file_name: str = "test", file_type: str = "png", file_path: str = "screenshot", delay_sec: int = 1 + ) -> None: sleep(delay_sec) - self.driver.get_screenshot_as_file(os.path.join(f'{file_path}', f'{file_name}.{file_type}')) + self.driver.get_screenshot_as_file(os.path.join(f"{file_path}", f"{file_name}.{file_type}")) diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index 65c869dbf1..efe621342d 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -1,7 +1,5 @@ from page_object.base_components import BaseComponents -from selenium.webdriver.common.by import By from selenium.webdriver.remote.webelement import WebElement -from selenium.webdriver.support.select import Select class NewFeedback(BaseComponents): @@ -17,7 +15,8 @@ class NewFeedback(BaseComponents): option = 'li[role="option"]' householdTableRow = 'tr[data-cy="household-table-row"]' individualTableRow = 'tr[data-cy="individual-table-row"' - lookUpTabs = 'button[role="tab"]' + lookUpTabsHouseHold = 'button[role="tab"]' + lookUpTabsIndividual = 'button[role="tab"]' receivedConsent = 'span[data-cy="input-consent"]' description = 'textarea[data-cy="input-description"]' comments = 'textarea[data-cy="input-comments"]' @@ -25,6 +24,7 @@ class NewFeedback(BaseComponents): inputLanguage = 'textarea[data-cy="input-language"]' inputArea = 'input[data-cy="input-area"]' programmeSelect = 'div[data-cy="select-program"]' + hhRadioButton = 'span[data-cy="input-radio-household"]' # Texts textTitle = "New Feedback" @@ -56,12 +56,17 @@ def getOptions(self) -> list[WebElement]: return self.get_elements(self.option) def getHouseholdTab(self) -> None: - assert self.textLookUpHousehold in self.wait_for(self.lookUpTabs).text + household_tab = self.get_elements(self.lookUpTabsHouseHold)[0] + assert self.textLookUpHousehold in household_tab.text + return household_tab - def getLookUpIndividual(self) -> None: - assert self.textLookUpIndividual in self.wait_for(self.lookUpTabs).text + def getIndividualTab(self) -> WebElement: + individual_tab = self.get_elements(self.lookUpTabsIndividual)[1] + assert self.textLookUpIndividual in individual_tab.text + return individual_tab def getHouseholdTableRows(self, number: int) -> WebElement: + self.get_elements(self.hhRadioButton) return self.get_elements(self.householdTableRow)[number] def getIndividualTableRow(self, number: int) -> WebElement: @@ -99,8 +104,8 @@ def selectProgramme(self, name: str) -> WebElement: return self.select_listbox_element(name) def checkElementsOnPage(self) -> None: - assert self.textTitle in self.getTitlePage() - assert self.textCategory in self.getLabelCategory() + assert self.textTitle in self.getTitlePage().text + assert self.textCategory in self.getLabelCategory().text self.getSelectIssueType() self.getButtonCancel() self.getButtonBack() From 8a185bc6ac8fd5658e0eed18e2e356ab75635ef5 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Tue, 19 Mar 2024 20:29:52 +0100 Subject: [PATCH 14/20] Added tests --- .../girevance/feedback/test_feedback.py | 163 +++++++++++++----- backend/selenium_tests/helpers/helper.py | 12 +- .../page_object/grievance/feedback.py | 4 + .../page_object/grievance/new_feedback.py | 12 +- 4 files changed, 139 insertions(+), 52 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index d8cbcdffde..a1cc6632e3 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -5,6 +5,7 @@ from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.grievance.new_feedback import NewFeedback + from page_object.programme_details.programme_details import ProgrammeDetails pytestmark = pytest.mark.django_db(transaction=True) @@ -33,8 +34,8 @@ def create_programs() -> None: @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( - self, - pageFeedback: Feedback, + self, + pageFeedback: Feedback, ) -> None: """ Go to Grievance page @@ -63,10 +64,10 @@ def test_check_feedback_page( assert pageFeedback.textCreationDate in pageFeedback.getCreationDate().text def test_check_feedback_details_page( - self, - add_feedbacks: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, + self, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, ) -> None: """ Go to Grievance page @@ -121,11 +122,11 @@ def feedback_clear_button(self) -> None: class TestFeedback: @pytest.mark.parametrize("issue_type", ["Positive", "Negative"]) def test_create_feedback_mandatory_fields( - self, - issue_type: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + issue_type: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -151,13 +152,13 @@ def test_create_feedback_mandatory_fields( pageFeedbackDetails.getLastModifiedDate() pageFeedbackDetails.getAdministrativeLevel2() - @pytest.mark.skip(reason="ToDo") + @pytest.mark.parametrize("issue_type", ["Positive", "Negative"]) def test_create_feedback_optional_fields( - self, - issue_type: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + issue_type: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -167,7 +168,6 @@ def test_create_feedback_optional_fields( pageNewFeedback.chooseOptionByName(issue_type) pageNewFeedback.getButtonNext().click() pageNewFeedback.getHouseholdTab() - pageNewFeedback.getHouseholdTableRows()[0].click() pageNewFeedback.getButtonNext().click() pageNewFeedback.getReceivedConsent().click() pageNewFeedback.getButtonNext().click() @@ -185,13 +185,13 @@ def test_create_feedback_optional_fields( pageFeedbackDetails.getAdministrativeLevel2() def test_check_feedback_filtering_by_chosen_programme( - self, - create_programs: None, - add_feedbacks: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - pageProgrammeDetails: ProgrammeDetails, + self, + create_programs: None, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + pageProgrammeDetails: ProgrammeDetails, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -210,6 +210,7 @@ def test_check_feedback_filtering_by_chosen_programme( pageFeedback.wait_for_disappear(pageFeedback.navGrievanceDashboard) pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + pageFeedback.disappearTableRowLoading() assert 1 == len(pageFeedback.getRows()) assert "Negative Feedback" in pageFeedback.getRows()[0].find_elements("tag name", "td")[1].text @@ -225,15 +226,44 @@ def test_check_feedback_filtering_by_chosen_programme( pageFeedback.wait_for_disappear(pageFeedback.navGrievanceDashboard) pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + pageFeedback.disappearTableRowLoading() assert 2 == len(pageFeedback.getRows()) def test_create_feedback_with_household( - self, - create_programs: None, - add_households: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + create_programs: None, + add_households: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + ) -> None: + # Go to Feedback + pageFeedback.getNavGrievance().click() + pageFeedback.getNavFeedback().click() + # Create Feedback + pageFeedback.getButtonSubmitNewFeedback().click() + pageNewFeedback.chooseOptionByName("Negative feedback") + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getHouseholdTab() + pageNewFeedback.getHouseholdTableRows(1).click() + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getReceivedConsent().click() + pageNewFeedback.getButtonNext().click() + assert "Feedback" in pageNewFeedback.getLabelCategory().text + pageNewFeedback.getDescription().send_keys("Test") + pageNewFeedback.check_page_after_click(pageNewFeedback.getButtonNext(), "=") + # Check Details page + assert "Test Programm" in pageFeedbackDetails.getProgramme().text + pageFeedback.getNavFeedback().click() + pageFeedback.getRows() + + def test_create_feedback_with_household_and_individual( + self, + create_programs: None, + add_households: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -245,7 +275,7 @@ def test_create_feedback_with_household( pageNewFeedback.getHouseholdTab() pageNewFeedback.getHouseholdTableRows(1).click() pageNewFeedback.getIndividualTab().click() - pageNewFeedback.screenshot("0") + pageNewFeedback.getIndividualTableRow(2).click() pageNewFeedback.getButtonNext().click() pageNewFeedback.getReceivedConsent().click() pageNewFeedback.getButtonNext().click() @@ -253,29 +283,72 @@ def test_create_feedback_with_household( pageNewFeedback.getDescription().send_keys("Test") pageNewFeedback.check_page_after_click(pageNewFeedback.getButtonNext(), "=") # Check Details page + assert "Test Programm" in pageFeedbackDetails.getProgramme().text + pageFeedback.getNavFeedback().click() + pageFeedback.getRows() - @pytest.mark.skip(reason="ToDo") def test_create_feedback_with_individual( - self, - pageFeedback: Feedback, + self, + create_programs: None, + add_households: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + # Create Feedback + pageFeedback.getButtonSubmitNewFeedback().click() + pageNewFeedback.chooseOptionByName("Negative feedback") + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getHouseholdTab() + pageNewFeedback.getHouseholdTableRows(1).click() + pageNewFeedback.getIndividualTab().click() + pageNewFeedback.getIndividualTableRow(2).click() + pageNewFeedback.getButtonNext().click() + pageNewFeedback.getReceivedConsent().click() + pageNewFeedback.getButtonNext().click() + assert "Feedback" in pageNewFeedback.getLabelCategory().text + pageNewFeedback.getDescription().send_keys("Test") + pageNewFeedback.check_page_after_click(pageNewFeedback.getButtonNext(), "=") + # Check Details page + assert "Test Programm" in pageFeedbackDetails.getProgramme().text + pageFeedback.getNavFeedback().click() + pageFeedback.getRows() - @pytest.mark.skip(reason="ToDo") - def test_create_linked_ticket( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, + def test_edit_feedback( + self, + create_programs: None, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() + # Edit field Programme in Feedback + pageFeedback.getRows()[0].click() + assert "-" in pageFeedbackDetails.getProgramme().text + pageFeedbackDetails.getButtonEdit().click() + pageEditFeedback.selectProgramme("Draft Programm").click() + pageEditFeedback.getDescription().clear() + pageEditFeedback.getDescription().send_keys("New description") + pageEditFeedback.getComments().clear() + pageEditFeedback.getComments().send_keys("New comment, new comment. New comment?") + pageEditFeedback.getInputArea().clear() + pageEditFeedback.getInputArea().send_keys("Abkamari") + pageEditFeedback.getInputLanguage().clear() + pageEditFeedback.getInputLanguage().send_keys("English") + pageEditFeedback.getAdminAreaAutocomplete().click() + pageEditFeedback.screenshot("tutu") - @pytest.mark.skip(reason="ToDo") - def test_edit_feedback( - self, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, + @pytest.mark.skip(reason="Create during Grievance tickets creation tests") + def test_create_linked_ticket( + self, + pageFeedback: Feedback, ) -> None: # Go to Feedback + pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index 361d061c44..bd16db2084 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -11,7 +11,7 @@ class Common: - DEFAULT_TIMEOUT = 60 + DEFAULT_TIMEOUT = 100 def __init__(self, driver: Chrome): self.driver = driver @@ -23,8 +23,14 @@ def _wait(self, timeout: int = DEFAULT_TIMEOUT) -> WebDriverWait: def get(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElement: return self.driver.find_element(element_type, locator) - def get_elements(self, locator: str, element_type: str = By.CSS_SELECTOR) -> list[WebElement]: - return self.driver.find_elements(element_type, locator) + def get_elements(self, locator: str, element_type: str = By.CSS_SELECTOR, attempts: int = 1) -> list[WebElement]: + for _ in range(attempts): + try: + return self.driver.find_elements(element_type, locator) + except: + sleep(1) + else: + raise Exception("No elements found") def wait_for(self, locator: str, element_type: str = By.CSS_SELECTOR, timeout: int = DEFAULT_TIMEOUT) -> WebElement: return self._wait(timeout).until(EC.visibility_of_element_located((element_type, locator))) diff --git a/backend/selenium_tests/page_object/grievance/feedback.py b/backend/selenium_tests/page_object/grievance/feedback.py index da43283209..011c5c8195 100644 --- a/backend/selenium_tests/page_object/grievance/feedback.py +++ b/backend/selenium_tests/page_object/grievance/feedback.py @@ -24,6 +24,7 @@ class Feedback(BaseComponents): dateTitleFilterPopup = 'div[class="MuiPaper-root MuiPopover-paper MuiPaper-elevation8 MuiPaper-rounded"]' issueTypeFilter = 'div[data-cy="filters-issue-type"]' option = 'li[role="option"]' + tableRowLoading = 'tr[data-cy="table-row"]' # Texts textTitle = "Feedback" @@ -102,5 +103,8 @@ def getDateTitleFilterPopup(self) -> WebElement: def getIssueTypeFilter(self) -> WebElement: return self.wait_for(self.issueTypeFilter) + def disappearTableRowLoading(self) -> WebElement: + return self.wait_for_disappear(self.tableRowLoading) + def getOption(self) -> WebElement: return self.wait_for(self.option) diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index efe621342d..83a44ecafb 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -1,3 +1,5 @@ +from time import sleep + from page_object.base_components import BaseComponents from selenium.webdriver.remote.webelement import WebElement @@ -14,7 +16,7 @@ class NewFeedback(BaseComponents): buttonNext = 'button[data-cy="button-submit"]' option = 'li[role="option"]' householdTableRow = 'tr[data-cy="household-table-row"]' - individualTableRow = 'tr[data-cy="individual-table-row"' + individualTableRow = 'tr[data-cy="individual-table-row"]' lookUpTabsHouseHold = 'button[role="tab"]' lookUpTabsIndividual = 'button[role="tab"]' receivedConsent = 'span[data-cy="input-consent"]' @@ -25,6 +27,7 @@ class NewFeedback(BaseComponents): inputArea = 'input[data-cy="input-area"]' programmeSelect = 'div[data-cy="select-program"]' hhRadioButton = 'span[data-cy="input-radio-household"]' + individualRadioButton = 'span[data-cy="input-radio-individual"]' # Texts textTitle = "New Feedback" @@ -61,16 +64,17 @@ def getHouseholdTab(self) -> None: return household_tab def getIndividualTab(self) -> WebElement: - individual_tab = self.get_elements(self.lookUpTabsIndividual)[1] + individual_tab = self.get_elements(self.lookUpTabsIndividual, attempts=5)[1] assert self.textLookUpIndividual in individual_tab.text return individual_tab def getHouseholdTableRows(self, number: int) -> WebElement: self.get_elements(self.hhRadioButton) - return self.get_elements(self.householdTableRow)[number] + return self.get_elements(self.householdTableRow, attempts=5)[number] def getIndividualTableRow(self, number: int) -> WebElement: - return self.get_elements(self.individualTableRow)[number] + self.get_elements(self.individualRadioButton) + return self.get_elements(self.individualTableRow, attempts=5)[number] def getReceivedConsent(self) -> WebElement: return self.wait_for(self.receivedConsent) From 87d9a622f222038c3d91c6a01e02fe6b49b4a690 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Tue, 19 Mar 2024 20:33:10 +0100 Subject: [PATCH 15/20] Isort --- .../girevance/feedback/test_feedback.py | 121 +++++++++--------- backend/selenium_tests/helpers/helper.py | 2 +- .../page_object/grievance/new_feedback.py | 2 - 3 files changed, 61 insertions(+), 64 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index a1cc6632e3..60691b0119 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -5,7 +5,6 @@ from page_object.grievance.details_feedback_page import FeedbackDetailsPage from page_object.grievance.feedback import Feedback from page_object.grievance.new_feedback import NewFeedback - from page_object.programme_details.programme_details import ProgrammeDetails pytestmark = pytest.mark.django_db(transaction=True) @@ -34,8 +33,8 @@ def create_programs() -> None: @pytest.mark.usefixtures("login") class TestSmokeFeedback: def test_check_feedback_page( - self, - pageFeedback: Feedback, + self, + pageFeedback: Feedback, ) -> None: """ Go to Grievance page @@ -64,10 +63,10 @@ def test_check_feedback_page( assert pageFeedback.textCreationDate in pageFeedback.getCreationDate().text def test_check_feedback_details_page( - self, - add_feedbacks: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, + self, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, ) -> None: """ Go to Grievance page @@ -122,11 +121,11 @@ def feedback_clear_button(self) -> None: class TestFeedback: @pytest.mark.parametrize("issue_type", ["Positive", "Negative"]) def test_create_feedback_mandatory_fields( - self, - issue_type: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + issue_type: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -154,11 +153,11 @@ def test_create_feedback_mandatory_fields( @pytest.mark.parametrize("issue_type", ["Positive", "Negative"]) def test_create_feedback_optional_fields( - self, - issue_type: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + issue_type: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -185,13 +184,13 @@ def test_create_feedback_optional_fields( pageFeedbackDetails.getAdministrativeLevel2() def test_check_feedback_filtering_by_chosen_programme( - self, - create_programs: None, - add_feedbacks: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, - pageProgrammeDetails: ProgrammeDetails, + self, + create_programs: None, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, + pageProgrammeDetails: ProgrammeDetails, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -230,12 +229,12 @@ def test_check_feedback_filtering_by_chosen_programme( assert 2 == len(pageFeedback.getRows()) def test_create_feedback_with_household( - self, - create_programs: None, - add_households: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + create_programs: None, + add_households: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -258,12 +257,12 @@ def test_create_feedback_with_household( pageFeedback.getRows() def test_create_feedback_with_household_and_individual( - self, - create_programs: None, - add_households: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + create_programs: None, + add_households: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -288,12 +287,12 @@ def test_create_feedback_with_household_and_individual( pageFeedback.getRows() def test_create_feedback_with_individual( - self, - create_programs: None, - add_households: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + create_programs: None, + add_households: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -318,12 +317,12 @@ def test_create_feedback_with_individual( pageFeedback.getRows() def test_edit_feedback( - self, - create_programs: None, - add_feedbacks: None, - pageFeedback: Feedback, - pageFeedbackDetails: FeedbackDetailsPage, - pageNewFeedback: NewFeedback, + self, + create_programs: None, + add_feedbacks: None, + pageFeedback: Feedback, + pageFeedbackDetails: FeedbackDetailsPage, + pageNewFeedback: NewFeedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() @@ -332,22 +331,22 @@ def test_edit_feedback( pageFeedback.getRows()[0].click() assert "-" in pageFeedbackDetails.getProgramme().text pageFeedbackDetails.getButtonEdit().click() - pageEditFeedback.selectProgramme("Draft Programm").click() - pageEditFeedback.getDescription().clear() - pageEditFeedback.getDescription().send_keys("New description") - pageEditFeedback.getComments().clear() - pageEditFeedback.getComments().send_keys("New comment, new comment. New comment?") - pageEditFeedback.getInputArea().clear() - pageEditFeedback.getInputArea().send_keys("Abkamari") - pageEditFeedback.getInputLanguage().clear() - pageEditFeedback.getInputLanguage().send_keys("English") - pageEditFeedback.getAdminAreaAutocomplete().click() - pageEditFeedback.screenshot("tutu") + pageNewFeedback.selectProgramme("Draft Programm").click() + pageNewFeedback.getDescription().clear() + pageNewFeedback.getDescription().send_keys("New description") + pageNewFeedback.getComments().clear() + pageNewFeedback.getComments().send_keys("New comment, new comment. New comment?") + pageNewFeedback.getInputArea().clear() + pageNewFeedback.getInputArea().send_keys("Abkamari") + pageNewFeedback.getInputLanguage().clear() + pageNewFeedback.getInputLanguage().send_keys("English") + pageNewFeedback.getAdminAreaAutocomplete().click() + pageNewFeedback.screenshot("tutu") @pytest.mark.skip(reason="Create during Grievance tickets creation tests") def test_create_linked_ticket( - self, - pageFeedback: Feedback, + self, + pageFeedback: Feedback, ) -> None: # Go to Feedback pageFeedback.getNavGrievance().click() diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index bd16db2084..bc712d51ca 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -27,7 +27,7 @@ def get_elements(self, locator: str, element_type: str = By.CSS_SELECTOR, attemp for _ in range(attempts): try: return self.driver.find_elements(element_type, locator) - except: + except BaseException: sleep(1) else: raise Exception("No elements found") diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index 83a44ecafb..7f9188a4c1 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -1,5 +1,3 @@ -from time import sleep - from page_object.base_components import BaseComponents from selenium.webdriver.remote.webelement import WebElement From cd5bba369a06b6cc8140ba1c3028e7c844e1ec8a Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Tue, 19 Mar 2024 21:38:06 +0100 Subject: [PATCH 16/20] Fixed tests --- .../girevance/feedback/test_feedback.py | 20 ++++++++++++------- backend/selenium_tests/helpers/helper.py | 6 ++++-- .../page_object/grievance/new_feedback.py | 6 +++++- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 60691b0119..0c55f27378 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -6,6 +6,7 @@ from page_object.grievance.feedback import Feedback from page_object.grievance.new_feedback import NewFeedback from page_object.programme_details.programme_details import ProgrammeDetails +from selenium.webdriver import Keys pytestmark = pytest.mark.django_db(transaction=True) @@ -331,17 +332,22 @@ def test_edit_feedback( pageFeedback.getRows()[0].click() assert "-" in pageFeedbackDetails.getProgramme().text pageFeedbackDetails.getButtonEdit().click() - pageNewFeedback.selectProgramme("Draft Programm").click() - pageNewFeedback.getDescription().clear() + pageNewFeedback.selectProgramme("Draft Programme").click() + pageNewFeedback.getDescription().click() + pageNewFeedback.getDescription().send_keys(Keys.CONTROL, "a") pageNewFeedback.getDescription().send_keys("New description") - pageNewFeedback.getComments().clear() pageNewFeedback.getComments().send_keys("New comment, new comment. New comment?") - pageNewFeedback.getInputArea().clear() pageNewFeedback.getInputArea().send_keys("Abkamari") - pageNewFeedback.getInputLanguage().clear() pageNewFeedback.getInputLanguage().send_keys("English") - pageNewFeedback.getAdminAreaAutocomplete().click() - pageNewFeedback.screenshot("tutu") + # ToDo: Enable after Fix bug + # pageNewFeedback.selectArea("Abband").click() + pageNewFeedback.getButtonNext().click() + # Check edited Feedback + assert "Test Programm" in pageFeedbackDetails.getProgramme().text + assert "New description" in pageFeedbackDetails.getDescription().text + assert "New comment, new comment. New comment?" in pageFeedbackDetails.getComments().text + assert "Abkamari" in pageFeedbackDetails.getAreaVillagePayPoint().text + assert "English" in pageFeedbackDetails.getLanguagesSpoken().text @pytest.mark.skip(reason="Create during Grievance tickets creation tests") def test_create_linked_ticket( diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index bc712d51ca..beeb042852 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -26,9 +26,11 @@ def get(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElement: def get_elements(self, locator: str, element_type: str = By.CSS_SELECTOR, attempts: int = 1) -> list[WebElement]: for _ in range(attempts): try: - return self.driver.find_elements(element_type, locator) - except BaseException: + elements = self.driver.find_elements(element_type, locator) + except (ValueError, IndexError): sleep(1) + else: + return elements else: raise Exception("No elements found") diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index 7f9188a4c1..1e7c5a5593 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -20,7 +20,7 @@ class NewFeedback(BaseComponents): receivedConsent = 'span[data-cy="input-consent"]' description = 'textarea[data-cy="input-description"]' comments = 'textarea[data-cy="input-comments"]' - adminAreaAutocomplete = 'div[data-cy="input-admin2"]' + adminAreaAutocomplete = 'div[data-cy="admin-area-autocomplete"]' inputLanguage = 'textarea[data-cy="input-language"]' inputArea = 'input[data-cy="input-area"]' programmeSelect = 'div[data-cy="select-program"]' @@ -92,6 +92,10 @@ def getInputArea(self) -> WebElement: def getAdminAreaAutocomplete(self) -> WebElement: return self.wait_for(self.adminAreaAutocomplete) + def selectArea(self, name: str) -> WebElement: + self.getAdminAreaAutocomplete().click() + return self.select_listbox_element(name) + def getIssueType(self) -> WebElement: return self.wait_for(self.issueType) From aeaf6602688df7675d1db468f44d7f4c832ce5a1 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Tue, 19 Mar 2024 22:15:07 +0100 Subject: [PATCH 17/20] Fixed tests --- .../girevance/feedback/test_feedback.py | 4 ++-- backend/selenium_tests/helpers/helper.py | 2 +- .../page_object/grievance/new_feedback.py | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 0c55f27378..55c001f629 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -332,7 +332,7 @@ def test_edit_feedback( pageFeedback.getRows()[0].click() assert "-" in pageFeedbackDetails.getProgramme().text pageFeedbackDetails.getButtonEdit().click() - pageNewFeedback.selectProgramme("Draft Programme").click() + pageNewFeedback.selectProgramme("Draft Program").click() pageNewFeedback.getDescription().click() pageNewFeedback.getDescription().send_keys(Keys.CONTROL, "a") pageNewFeedback.getDescription().send_keys("New description") @@ -343,7 +343,7 @@ def test_edit_feedback( # pageNewFeedback.selectArea("Abband").click() pageNewFeedback.getButtonNext().click() # Check edited Feedback - assert "Test Programm" in pageFeedbackDetails.getProgramme().text + assert "Draft Program" in pageFeedbackDetails.getProgramme().text assert "New description" in pageFeedbackDetails.getDescription().text assert "New comment, new comment. New comment?" in pageFeedbackDetails.getComments().text assert "Abkamari" in pageFeedbackDetails.getAreaVillagePayPoint().text diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index beeb042852..68157620f9 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -24,7 +24,7 @@ def get(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElement: return self.driver.find_element(element_type, locator) def get_elements(self, locator: str, element_type: str = By.CSS_SELECTOR, attempts: int = 1) -> list[WebElement]: - for _ in range(attempts): + for i in range(attempts): try: elements = self.driver.find_elements(element_type, locator) except (ValueError, IndexError): diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index 1e7c5a5593..cf0cf16cfb 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -1,3 +1,5 @@ +from time import sleep + from page_object.base_components import BaseComponents from selenium.webdriver.remote.webelement import WebElement @@ -68,11 +70,19 @@ def getIndividualTab(self) -> WebElement: def getHouseholdTableRows(self, number: int) -> WebElement: self.get_elements(self.hhRadioButton) - return self.get_elements(self.householdTableRow, attempts=5)[number] + try: + return self.get_elements(self.householdTableRow, attempts=5)[number] + except IndexError: + sleep(1) + return self.get_elements(self.householdTableRow, attempts=5)[number] def getIndividualTableRow(self, number: int) -> WebElement: self.get_elements(self.individualRadioButton) - return self.get_elements(self.individualTableRow, attempts=5)[number] + try: + return self.get_elements(self.individualTableRow, attempts=5)[number] + except IndexError: + sleep(1) + return self.get_elements(self.individualTableRow, attempts=5)[number] def getReceivedConsent(self) -> WebElement: return self.wait_for(self.receivedConsent) From d785e4c7e4f5f82d76fdf8032b03f84f52c526e6 Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Wed, 20 Mar 2024 06:33:51 +0100 Subject: [PATCH 18/20] Fixed tests --- .../girevance/feedback/test_feedback.py | 2 ++ backend/selenium_tests/helpers/helper.py | 2 +- .../selenium_tests/page_object/grievance/feedback.py | 3 +++ .../page_object/grievance/new_feedback.py | 12 ++++++++++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index 55c001f629..fce68854a1 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -168,6 +168,8 @@ def test_create_feedback_optional_fields( pageNewFeedback.chooseOptionByName(issue_type) pageNewFeedback.getButtonNext().click() pageNewFeedback.getHouseholdTab() + pageNewFeedback.getIndividualTab() + pageFeedback.getTableRowLoading() pageNewFeedback.getButtonNext().click() pageNewFeedback.getReceivedConsent().click() pageNewFeedback.getButtonNext().click() diff --git a/backend/selenium_tests/helpers/helper.py b/backend/selenium_tests/helpers/helper.py index 68157620f9..beeb042852 100644 --- a/backend/selenium_tests/helpers/helper.py +++ b/backend/selenium_tests/helpers/helper.py @@ -24,7 +24,7 @@ def get(self, locator: str, element_type: str = By.CSS_SELECTOR) -> WebElement: return self.driver.find_element(element_type, locator) def get_elements(self, locator: str, element_type: str = By.CSS_SELECTOR, attempts: int = 1) -> list[WebElement]: - for i in range(attempts): + for _ in range(attempts): try: elements = self.driver.find_elements(element_type, locator) except (ValueError, IndexError): diff --git a/backend/selenium_tests/page_object/grievance/feedback.py b/backend/selenium_tests/page_object/grievance/feedback.py index 011c5c8195..406587be9a 100644 --- a/backend/selenium_tests/page_object/grievance/feedback.py +++ b/backend/selenium_tests/page_object/grievance/feedback.py @@ -106,5 +106,8 @@ def getIssueTypeFilter(self) -> WebElement: def disappearTableRowLoading(self) -> WebElement: return self.wait_for_disappear(self.tableRowLoading) + def getTableRowLoading(self) -> WebElement: + return self.wait_for(self.tableRowLoading) + def getOption(self) -> WebElement: return self.wait_for(self.option) diff --git a/backend/selenium_tests/page_object/grievance/new_feedback.py b/backend/selenium_tests/page_object/grievance/new_feedback.py index cf0cf16cfb..a99b06e656 100644 --- a/backend/selenium_tests/page_object/grievance/new_feedback.py +++ b/backend/selenium_tests/page_object/grievance/new_feedback.py @@ -59,12 +59,20 @@ def getOptions(self) -> list[WebElement]: return self.get_elements(self.option) def getHouseholdTab(self) -> None: - household_tab = self.get_elements(self.lookUpTabsHouseHold)[0] + try: + household_tab = self.get_elements(self.lookUpTabsHouseHold)[0] + except IndexError: + sleep(1) + household_tab = self.get_elements(self.lookUpTabsHouseHold)[0] assert self.textLookUpHousehold in household_tab.text return household_tab def getIndividualTab(self) -> WebElement: - individual_tab = self.get_elements(self.lookUpTabsIndividual, attempts=5)[1] + try: + individual_tab = self.get_elements(self.lookUpTabsIndividual, attempts=5)[1] + except IndexError: + sleep(1) + individual_tab = self.get_elements(self.lookUpTabsIndividual, attempts=5)[1] assert self.textLookUpIndividual in individual_tab.text return individual_tab From ceb111af87c54c75be128b23182597aee674f8aa Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Wed, 20 Mar 2024 08:57:41 +0100 Subject: [PATCH 19/20] Fixed tests --- .../selenium_tests/girevance/feedback/test_feedback.py | 8 ++++---- backend/selenium_tests/page_object/grievance/feedback.py | 9 +++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/backend/selenium_tests/girevance/feedback/test_feedback.py b/backend/selenium_tests/girevance/feedback/test_feedback.py index fce68854a1..96b533c73c 100644 --- a/backend/selenium_tests/girevance/feedback/test_feedback.py +++ b/backend/selenium_tests/girevance/feedback/test_feedback.py @@ -79,7 +79,7 @@ def test_check_feedback_details_page( pageFeedback.driver.refresh() pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() - pageFeedback.getRows()[0].click() + pageFeedback.getRow(0).click() # Check Feedback details page assert pageFeedbackDetails.textTitle in pageFeedbackDetails.getTitlePage().text pageFeedbackDetails.getButtonEdit() @@ -199,7 +199,7 @@ def test_check_feedback_filtering_by_chosen_programme( pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() # Edit field Programme in Feedback - pageFeedback.getRows()[0].click() + pageFeedback.getRow(0).click() assert "-" in pageFeedbackDetails.getProgramme().text pageFeedbackDetails.getButtonEdit().click() pageNewFeedback.selectProgramme("Test Programm").click() @@ -214,7 +214,7 @@ def test_check_feedback_filtering_by_chosen_programme( pageFeedback.getNavFeedback().click() pageFeedback.disappearTableRowLoading() assert 1 == len(pageFeedback.getRows()) - assert "Negative Feedback" in pageFeedback.getRows()[0].find_elements("tag name", "td")[1].text + assert "Negative Feedback" in pageFeedback.getRow(0).find_elements("tag name", "td")[1].text pageFeedback.selectGlobalProgramFilter("Draft Program").click() assert "Draft Program" in pageProgrammeDetails.getHeaderTitle().text @@ -331,7 +331,7 @@ def test_edit_feedback( pageFeedback.getNavGrievance().click() pageFeedback.getNavFeedback().click() # Edit field Programme in Feedback - pageFeedback.getRows()[0].click() + pageFeedback.getRow(0).click() assert "-" in pageFeedbackDetails.getProgramme().text pageFeedbackDetails.getButtonEdit().click() pageNewFeedback.selectProgramme("Draft Program").click() diff --git a/backend/selenium_tests/page_object/grievance/feedback.py b/backend/selenium_tests/page_object/grievance/feedback.py index 406587be9a..571a4ebeb8 100644 --- a/backend/selenium_tests/page_object/grievance/feedback.py +++ b/backend/selenium_tests/page_object/grievance/feedback.py @@ -1,3 +1,5 @@ +from time import sleep + from page_object.base_components import BaseComponents from selenium.webdriver.remote.webelement import WebElement @@ -91,6 +93,13 @@ def getCreationDate(self) -> WebElement: def getRows(self) -> list[WebElement]: return self.get_elements(self.tableRow) + def getRow(self, number: int) -> WebElement: + for _ in range(10): + if len(self.get_elements(self.tableRow)) == number + 1: + break + sleep(1) + return self.get_elements(self.tableRow)[number] + def getDaysFilterPopup(self) -> WebElement: return self.wait_for(self.daysFilterPopup) From 91a896dfc9a7d75bcb6a6bbe5b6f21955a08725f Mon Sep 17 00:00:00 2001 From: Szymon Wyderka Date: Thu, 21 Mar 2024 08:47:02 +0100 Subject: [PATCH 20/20] Fixed BA creation in conftest.py --- backend/selenium_tests/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/selenium_tests/conftest.py b/backend/selenium_tests/conftest.py index 253d35554b..583de81727 100644 --- a/backend/selenium_tests/conftest.py +++ b/backend/selenium_tests/conftest.py @@ -111,6 +111,7 @@ def pageNewFeedback(request: FixtureRequest, browser: Chrome) -> NewFeedback: def business_area() -> BusinessArea: business_area, _ = BusinessArea.objects.get_or_create( **{ + "pk": "c259b1a0-ae3a-494e-b343-f7c8eb060c68", "code": "0060", "name": "Afghanistan", "long_name": "THE ISLAMIC REPUBLIC OF AFGHANISTAN",