From 64207bc9f18fcd8d4924147921d60c2fedac67cd Mon Sep 17 00:00:00 2001 From: Lari Taskula Date: Mon, 17 Aug 2015 10:44:39 +0300 Subject: [PATCH] Bug 14536: (follow-up) Add more functionalty for handling messaging preferences - Fixes memberentry form submit to return Circulation PageObject. - Prevents missing element errors at different steps of memberentry page. Patron modification has multiple different steps (full edit, information edit, sms number edit, library use edit, alternate address edit, alternative contact edit). Some of the input fields required for validation are not always present in each step of these modifications. - Adds functionality to check checkboxes and validate if they are checked or not - Adds navigation to moremember edit links. - Adds navigation to opac-messaging --- t/lib/Page/Intra.pm | 13 ++++ t/lib/Page/Members/Memberentry.pm | 144 ++++++++++++++++++++++++++++++++----- t/lib/Page/Members/Moremember.pm | 120 ++++++++++++++++++++++++++++++- t/lib/Page/Opac/LeftNavigation.pm | 22 ++++++ t/lib/Page/Opac/OpacMemberentry.pm | 2 +- 5 files changed, 281 insertions(+), 20 deletions(-) diff --git a/t/lib/Page/Intra.pm b/t/lib/Page/Intra.pm index 464b45a..79636f3 100644 --- a/t/lib/Page/Intra.pm +++ b/t/lib/Page/Intra.pm @@ -43,6 +43,19 @@ See. Selenium documentation best practices for UI element mapping to common lang =cut ################################################################################ +=head _getBreadcrumbLinks + +@RETURNS List of all breadcrumb links +=cut + +sub _getBreadcrumbLinks { + my ($self) = @_; + my $d = $self->getDriver(); + + my $breadcrumbLinks = $d->find_elements("div#breadcrumbs a"); + return ($breadcrumbLinks); +} + =head _getHeaderElements @RETURNS HASHRef of all the Intranet header clickables. diff --git a/t/lib/Page/Members/Memberentry.pm b/t/lib/Page/Members/Memberentry.pm index 2599042..2e7aee2 100644 --- a/t/lib/Page/Members/Memberentry.pm +++ b/t/lib/Page/Members/Memberentry.pm @@ -21,10 +21,12 @@ use Modern::Perl; use Scalar::Util qw(blessed); use Test::More; -use base qw(t::lib::Page::Intra t::lib::Page::Members::Toolbar); +use base qw(t::lib::Page::Intra t::lib::Page::Members::Toolbar t::lib::Page::Members::LeftNavigation); use Koha::Exception::BadParameter; +use t::lib::Page::Circulation::Circulation; + sub new { my ($class, $params) = @_; @@ -61,15 +63,41 @@ sub _getInputFieldsForValidation { my ($self) = @_; my $d = $self->getDriver(); - my $emailInput = $d->find_element('#email'); - my $emailProInput = $d->find_element('#emailpro'); - my $email_BInput = $d->find_element('#B_email'); + my ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput, $SMSnumber); + eval { + $emailInput = $d->find_element('#email'); + }; + eval { + $emailProInput = $d->find_element('#emailpro'); + }; + eval { + $email_BInput = $d->find_element('#B_email'); + }; + eval { + $phoneInput = $d->find_element('#phone'); + }; + eval { + $phoneProInput = $d->find_element('#phonepro'); + }; + eval { + $phone_BInput = $d->find_element('#B_phone'); + }; + eval { + $SMSnumber = $d->find_element('#SMSnumber'); + }; - my $phoneInput = $d->find_element('#phone'); - my $phoneProInput = $d->find_element('#phonepro'); - my $phone_BInput = $d->find_element('#B_phone'); + return ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput, $SMSnumber); +} + +sub _getMessagingPreferenceCheckboxes { + my ($self) = @_; + my $d = $self->getDriver(); + + my @email_prefs = $d->find_elements('input[type="checkbox"][id^="email"]'); + my @phone_prefs = $d->find_elements('input[type="checkbox"][id^="phone"]'); + my @sms_prefs = $d->find_elements('input[type="checkbox"][id^="sms"]'); - return ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput); + return { email => \@email_prefs, phone => \@phone_prefs, sms => \@sms_prefs }; } @@ -79,12 +107,85 @@ sub _getInputFieldsForValidation { =cut ################################################################################ +sub checkMessagingPreferencesSet { + my ($self, $valid, @prefs) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + foreach my $type (@prefs){ + my @this_pref = $d->find_elements('input[type="checkbox"][id^="'.$type.'"]'); + + my $ok = 0; + + foreach my $checkbox (@this_pref){ + ok(0, "Intra Memberentry $type messaging checkbox ".$checkbox->get_attribute('id')." not checked") if !$checkbox->is_selected() and $valid; + ok(0, "Intra Memberentry $type messaging checkbox ".$checkbox->get_attribute('id')." checked (not supposed to be)") if $checkbox->is_selected() and !$valid; + $ok = 1; + } + ok($ok, "Intra Memberentry $type messaging checkboxes ok (all " . (($valid) ? 'checked':'unchecked') . ")"); + } + + return $self; +} + +sub clearMessagingContactFields { + my ($self, @fields) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput, $SMSnumber) = $self->_getInputFieldsForValidation(); + + if (@fields) { + for my $field (@fields){ + $emailInput->clear() if $field eq "email"; + $emailProInput->clear() if $field eq "emailpro"; + $email_BInput->clear() if $field eq "B_email"; + $phoneInput->clear() if $field eq "phone"; + $phoneProInput->clear() if $field eq "phonepro"; + $phone_BInput->clear() if $field eq "B_phone"; + $SMSnumber->clear() if $field eq "SMSnumber"; + } + ok(1, "Intra Memberentry contact fields (@fields) cleared"); + } else { + $emailInput->clear(); + $emailProInput->clear(); + $email_BInput->clear(); + $phoneInput->clear(); + $phoneProInput->clear(); + $phone_BInput->clear(); + $SMSnumber->clear(); + ok(1, "Intra Memberentry contact fields (email, emailpro, email_B, phone, phonepro, phone_B, SMSnumber) cleared"); + } + + return $self; +} + +sub checkPreferences { + my ($self, $valid, $type) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my $checkboxes = $self->_getMessagingPreferenceCheckboxes(); + + ok (0, "Intra $type checkboxes not defined") if not defined $checkboxes->{$type}; + return 0 if not defined $checkboxes->{$type}; + + foreach my $checkbox (@{ $checkboxes->{$type} }){ + ok(0, "Intra Memberentry $type messaging checkbox ".$checkbox->get_attribute('id')." not available") if !$checkbox->is_enabled() and $valid; + ok(0, "Intra Memberentry $type messaging checkbox ".$checkbox->get_attribute('id')." available (not supposed to be)") if $checkbox->is_enabled() and !$valid; + + $checkbox->click() if not $checkbox->is_selected(); + } + ok (1, "Intra Memberentry $type messaging checkboxes checked") if $valid; + + return $self; +} sub setEmail { my ($self, $input) = @_; my $d = $self->getDriver(); $self->debugTakeSessionSnapshot(); - my ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput) = $self->_getInputFieldsForValidation(); + my ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput, $SMSnumber) = $self->_getInputFieldsForValidation(); $emailInput->clear(); $emailProInput->clear(); @@ -102,7 +203,7 @@ sub setPhone { my $d = $self->getDriver(); $self->debugTakeSessionSnapshot(); - my ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput) = $self->_getInputFieldsForValidation(); + my ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput, $SMSnumber) = $self->_getInputFieldsForValidation(); $phoneInput->clear(); $phoneProInput->clear(); @@ -115,20 +216,33 @@ sub setPhone { return $self; } +sub setSMSNumber { + my ($self, $input) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my ($emailInput, $emailProInput, $email_BInput, $phoneInput, $phoneProInput, $phone_BInput, $SMSnumber) = $self->_getInputFieldsForValidation(); + + $SMSnumber->clear(); + $SMSnumber->send_keys($input); + ok(1, "Intra Memberentry Wrote \"$input\" to SMSnumber."); + + return $self; +} + sub submitForm { my ($self, $valid) = @_; my $d = $self->getDriver(); $self->debugTakeSessionSnapshot(); my $submitButton = $d->find_element('form#entryform input[type="submit"]'); - $submitButton->click(); - + $submitButton->submit(); $self->debugTakeSessionSnapshot(); if ($valid) { my $submitted = $d->find_element("#editpatron", 'css'); ok(1, "Intra Memberentry Submit changes success"); - return t::lib::Page::Members::Moremember->rebrandFromPageObject($self); + return t::lib::Page::Circulation::Circulation->rebrandFromPageObject($self); } else { my @notsubmitted = $d->find_elements('form#entryform label[class="error"]', 'css'); my $error_ids = ""; @@ -142,10 +256,6 @@ sub submitForm { $d->refresh(); return $self; } - - - - } 1; \ No newline at end of file diff --git a/t/lib/Page/Members/Moremember.pm b/t/lib/Page/Members/Moremember.pm index 456fd19..f52cfe3 100644 --- a/t/lib/Page/Members/Moremember.pm +++ b/t/lib/Page/Members/Moremember.pm @@ -19,8 +19,9 @@ package t::lib::Page::Members::Moremember; use Modern::Perl; use Scalar::Util qw(blessed); +use Test::More; -use base qw(t::lib::Page::Intra t::lib::Page::Members::Toolbar); +use base qw(t::lib::Page::Intra t::lib::Page::Members::Toolbar t::lib::Page::Members::LeftNavigation); use t::lib::Page::Members::ApiKeys; @@ -74,9 +75,35 @@ See. Selenium documentation best practices for UI element mapping to common lang =cut ################################################################################ +sub _getEditLinks { + my ($self) = @_; + my $d = $self->getDriver(); + + my $patron_info_edit = $d->find_element("div#patron-information div.action a[href*='memberentry.pl?op=modify'][href*='step=1']", 'css'); + my $sms_number_edit = $d->find_element("div.action a[href*='memberentry.pl?op=modify'][href*='step=5']", 'css'); + my $library_use_edit = $d->find_element("div.action a[href*='memberentry.pl?op=modify'][href*='step=3']", 'css'); + my $alternate_addr_edit = $d->find_element("div.action a[href*='memberentry.pl?op=modify'][href*='step=6']", 'css'); + my $alternative_contact_edit = $d->find_element("div.action a[href*='memberentry.pl?op=modify'][href*='step=2']", 'css'); + + my $e = {}; + $e->{patron_information} = $patron_info_edit if $patron_info_edit; + $e->{smsnumber} = $sms_number_edit if $sms_number_edit; + $e->{library_use} = $library_use_edit if $library_use_edit; + $e->{alternate_address} = $alternate_addr_edit if $alternate_addr_edit; + $e->{alternative_contact} = $alternative_contact_edit if $alternative_contact_edit; + return $e; +} +sub _getMessagingPreferenceCheckboxes { + my ($self) = @_; + my $d = $self->getDriver(); - + my @email_prefs = $d->find_elements('input[type="checkbox"][id^="email"]'); + my @phone_prefs = $d->find_elements('input[type="checkbox"][id^="phone"]'); + my @sms_prefs = $d->find_elements('input[type="checkbox"][id^="sms"]'); + + return { email => \@email_prefs, phone => \@phone_prefs, sms => \@sms_prefs }; +} ################################################################################ =head PageObject Services @@ -84,7 +111,96 @@ See. Selenium documentation best practices for UI element mapping to common lang =cut ################################################################################ +sub checkMessagingPreferencesSet { + my ($self, $valid, @prefs) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + foreach my $type (@prefs){ + my @this_pref = $d->find_elements('input[type="checkbox"][id^="'.$type.'"]'); + + my $ok = 0; + + foreach my $checkbox (@this_pref){ + ok(0, "Intra Moremember $type messaging checkbox ".$checkbox->get_attribute('id')." not checked") if !$checkbox->is_selected() and $valid; + ok(0, "Intra Moremember $type messaging checkbox ".$checkbox->get_attribute('id')." checked (not supposed to be)") if $checkbox->is_selected() and !$valid; + $ok = 1; + } + ok($ok, "Intra Moremember $type messaging checkboxes ok (all " . (($valid) ? 'checked':'unchecked') . ")"); + } + + return $self; +} + +sub navigateToPatronInformationEdit { + my ($self) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my $elements = $self->_getEditLinks(); + $elements->{patron_information}->click(); + ok($d->get_title() =~ m/Modify patron/, "Intra Navigate to Modify patron information"); + + $self->debugTakeSessionSnapshot(); + + return t::lib::Page::Members::Memberentry->rebrandFromPageObject($self); +} + +sub navigateToSMSnumberEdit { + my ($self) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my $elements = $self->_getEditLinks(); + $elements->{smsnumber}->click(); + ok($d->get_title() =~ m/Modify patron/, "Intra Navigate to Modify patron SMS number"); + + $self->debugTakeSessionSnapshot(); + + return t::lib::Page::Members::Memberentry->rebrandFromPageObject($self); +} + +sub navigateToLibraryUseEdit { + my ($self) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my $elements = $self->_getEditLinks(); + $elements->{library_use}->click(); + ok($d->get_title() =~ m/Modify patron/, "Intra Navigate to Modify patron Library use"); + + $self->debugTakeSessionSnapshot(); + + return t::lib::Page::Members::Memberentry->rebrandFromPageObject($self); +} + +sub navigateToAlternateAddressEdit { + my ($self) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my $elements = $self->_getEditLinks(); + $elements->{alternate_address}->click(); + ok($d->get_title() =~ m/Modify patron/, "Intra Navigate to Modify patron Alternate address"); + $self->debugTakeSessionSnapshot(); + + return t::lib::Page::Members::Memberentry->rebrandFromPageObject($self); +} + +sub navigateToAlternativeContactEdit { + my ($self) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my $elements = $self->_getEditLinks(); + $elements->{alternative_contact}->click(); + ok($d->get_title() =~ m/Modify patron/, "Intra Navigate to Modify patron Alternative contact"); + + $self->debugTakeSessionSnapshot(); + + return t::lib::Page::Members::Memberentry->rebrandFromPageObject($self); +} diff --git a/t/lib/Page/Opac/LeftNavigation.pm b/t/lib/Page/Opac/LeftNavigation.pm index 2f344a8..ae10de5 100644 --- a/t/lib/Page/Opac/LeftNavigation.pm +++ b/t/lib/Page/Opac/LeftNavigation.pm @@ -22,6 +22,7 @@ use Scalar::Util qw(blessed); use Test::More; use t::lib::Page::Opac::OpacApiKeys; +use t::lib::Page::Opac::OpacMessaging; =head NAME t::lib::Page::Opac::LeftNavigation @@ -72,6 +73,9 @@ sub _getLeftNavigationActionElements { $e->{yourPurchaseSuggestions} = $d->find_element("a[href*='opac-suggestions.pl']", 'css'); }; eval { + $e->{yourMessaging} = $d->find_element("a[href*='opac-messaging.pl']", 'css'); + }; + eval { $e->{yourLists} = $d->find_element("a[href*='opac-shelves.pl']", 'css'); }; eval { @@ -106,6 +110,24 @@ sub navigateYourAPIKeys { return t::lib::Page::Opac::OpacApiKeys->rebrandFromPageObject($self); } +sub navigateYourMessaging { + my ($self) = @_; + my $d = $self->getDriver(); + $self->debugTakeSessionSnapshot(); + + my $elements = $self->_getLeftNavigationActionElements(); + $elements->{yourMessaging}->click(); + $self->debugTakeSessionSnapshot(); + + my $breadcrumbs = $self->_getBreadcrumbLinks(); + + ok(ref($breadcrumbs) eq 'ARRAY' && + $breadcrumbs->[scalar(@$breadcrumbs)-1]->get_text() =~ m/Your messaging/i, + "Opac Navigate to Your messaging"); + + return t::lib::Page::Opac::OpacMessaging->rebrandFromPageObject($self); +} + sub navigateYourPersonalDetails { my ($self) = @_; my $d = $self->getDriver(); diff --git a/t/lib/Page/Opac/OpacMemberentry.pm b/t/lib/Page/Opac/OpacMemberentry.pm index 2dc3a21..343e25e 100644 --- a/t/lib/Page/Opac/OpacMemberentry.pm +++ b/t/lib/Page/Opac/OpacMemberentry.pm @@ -23,7 +23,7 @@ use Test::More; use t::lib::Page::Opac::OpacUser; -use base qw(t::lib::Page::Opac); +use base qw(t::lib::Page::Opac t::lib::Page::Opac::LeftNavigation); use Koha::Exception::BadParameter; -- 1.9.1