@@ -, +, @@ messaging preferences - Fixes memberentry form submit to return Circulation PageObject. - Prevents missing element errors at different steps of memberentry page. Patron - 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(-) --- a/t/lib/Page/Intra.pm +++ a/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. --- a/t/lib/Page/Members/Memberentry.pm +++ a/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; --- a/t/lib/Page/Members/Moremember.pm +++ a/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); +} --- a/t/lib/Page/Opac/LeftNavigation.pm +++ a/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(); --- a/t/lib/Page/Opac/OpacMemberentry.pm +++ a/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; --