Koha/t/db_dependent/www/auth_values_input_www.t
Tomas Cohen Arazi d74c5393ed Bug 18336: Full stack tests for supplemental UTF-8 chars
This patch introduces tests for Koha's support for 4-byte supplemental
UTF-8 chars. encoding/decoding tools handle this gracefuly. The missing
piece is the MySQL DB backend.

The tests in this patch:
- Adds a couple records for each flavour (MARC21 and UNIMARC) so
  search_utf8.t tests 4-byte chars are handled correctly
- Adds emoji testing in auth_values_input_www.t

To test:
- Apply this patch
- Run:
  $ kshell
 k$ prove t/db_dependent/www/search_utf8.t \
          t/db_dependent/www/auth_values_input_www.t
=> FAIL: It should fail if the DB hasn't been migrated into using
utf8mb4

Sponsored-by: Hotchkiss School

Signed-off-by: Mark Tompsett <mtompset@hotmail.com>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
2018-02-16 17:53:42 -03:00

204 lines
7.9 KiB
Perl
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/perl
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use utf8;
use Test::More; #See plan tests => \d+ below
use Test::WWW::Mechanize;
use XML::Simple;
use JSON;
use File::Basename;
use File::Spec;
use POSIX;
use URI::Escape;
use Encode;
use Koha::AuthorisedValueCategories;
my $testdir = File::Spec->rel2abs( dirname(__FILE__) );
my $koha_conf = $ENV{KOHA_CONF};
my $xml = XMLin($koha_conf);
my $user = $ENV{KOHA_USER} || $xml->{config}->{user};
my $password = $ENV{KOHA_PASS} || $xml->{config}->{pass};
my $intranet = $ENV{KOHA_INTRANET_URL};
eval{
use C4::Context;
};
if ($@) {
plan skip_all => "Tests skip. You must have a working Context\n";
}
elsif (not defined $intranet) {
plan skip_all => "Tests skip. You must set env. variable KOHA_INTRANET_URL to do tests\n";
}
else {
plan tests => 34;
}
my $dbh = C4::Context->dbh;
$intranet =~ s#/$##;
my $agent = Test::WWW::Mechanize->new( autocheck => 1 );
my $jsonresponse;
my ($category, $expected_base, $add_form_link_exists, $delete_form_link_exists);
# -------------------------------------------------- LOGIN
$agent->get_ok( "$intranet/cgi-bin/koha/mainpage.pl", 'connect to intranet' );
$agent->form_name('loginform');
$agent->field( 'password', $password );
$agent->field( 'userid', $user );
$agent->field( 'branch', '' );
$agent->click_ok( '', 'login to staff client' );
$agent->get_ok( "$intranet/cgi-bin/koha/mainpage.pl", 'load main page' );
#---------------------------------------- Test with corean, greek and emoji chars
$category = '学協会μμ😀';
$dbh->do(q|DELETE FROM authorised_values WHERE category = ?|, undef, $category);
$dbh->do(q|DELETE FROM authorised_value_categories WHERE category_name = ?|, undef, $category);
$expected_base = q|authorised_values.pl|;
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl", 'Connect to Authorized values page' );
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?op=add_form", 'Open to create a new category' );
$agent->form_name('Aform');
$agent->field('category', $category);
$agent->click_ok( '', "Create new AV category " );
$agent->base_like(qr|$expected_base|, "check base");
$add_form_link_exists = 0;
for my $link ( $agent->links() ) {
if ( $link->url =~ m|authorised_values.pl\?op=add_form&category=| . uri_escape_utf8($category) ) {
$add_form_link_exists = 1;
}
}
is( $add_form_link_exists, 1, 'Add a new category button should be displayed');
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?op=add_form&category=" . uri_escape_utf8($category), 'Open to create a new AV for this category' );
$agent->form_name('Aform');
$agent->field('authorised_value', 'επιμεq');
$agent->field('lib_opac', 'autdesc2');
$agent->field('lib', 'desc1');
$agent->field('branches', '');
$agent->click_ok( '', "Create a new value for the category" );
$agent->base_like(qr|$expected_base|, "check base");
$add_form_link_exists = 0;
$delete_form_link_exists = 0;
my $add_form_re = q|authorised_values.pl\?op=add_form&category=| . uri_escape_utf8($category);
my $delete_re = q|authorised_values.pl\?op=delete&searchfield=| . uri_escape_utf8($category);
for my $link ( $agent->links() ) {
if ( $link->url =~ qr|$add_form_re| ) {
$add_form_link_exists = 1;
} elsif ( $link->url =~ qr|$delete_re| ) {
$delete_form_link_exists = 1;
}
}
is( $add_form_link_exists, 1, 'Add a new category button should be displayed');
is( $delete_form_link_exists, 1, '');
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl", 'Return to Authorized values page' );
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?searchfield=" . uri_escape_utf8($category) . "&offset=0", 'Search the values inserted' );
my $text = $agent->text() ;
#Tests on UTF-8
ok ( ( length(Encode::encode('UTF-8', $text)) != length($text) ) , 'UTF-8 are multi-byte. Good') ;
ok ($text =~ m/学協会μμ/, 'UTF-8 (Asia) chars are correctly present. Good');
ok ($text =~ m/επιμεq/, 'UTF-8 (Greek) chars are correctly present. Good');
ok ($text =~ m/😀/, 'UTF-8 (emoji) chars are correctly present. Good');
my @links = $agent->links;
my $id_to_del ='';
$delete_re = q|op=delete\&searchfield=| . uri_escape_utf8($category) . '\&id=(\d+)';
foreach my $dato (@links){
my $link = $dato->url;
if ($link =~ qr|$delete_re| ) {
$id_to_del = $1;
last;
}
}
if ($id_to_del) {
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?op=delete&searchfield=" . uri_escape_utf8($category) . "&id=$id_to_del", 'UTF_8 auth. value deleted' );
}else{
ok($id_to_del ne undef, "error, link to delete not working");
}
Koha::AuthorisedValueCategories->find($category)->delete; # Clean up
#---------------------------------------- Test with only latin utf-8 (could be taken as Latin-1/ISO 8859-1)
$category = 'tòmas';
$dbh->do(q|DELETE FROM authorised_values WHERE category = ?|, undef, $category);
$dbh->do(q|DELETE FROM authorised_value_categories WHERE category_name = ?|, undef, $category);
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl", 'Connect to Authorized values page' );
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?op=add_form", 'Open to create a new category' );
$agent->form_name('Aform');
$agent->field('category', $category);
$agent->click_ok( '', "Create new AV category" );
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?op=add_form&category=$category", 'Open to create a new AV for this category' );
$agent->form_name('Aform');
$agent->field('authorised_value', 'ràmen');
$agent->field('lib_opac', 'autdesc2');
$agent->field('lib', 'desc1');
$agent->field('branches', '');
$agent->click_ok( '', "Create a new value for the category" );
$expected_base = q|authorised_values.pl|;
$agent->base_like(qr|$expected_base|, "check base");
$add_form_link_exists = 0;
$delete_form_link_exists = 0;
$add_form_re = q|authorised_values.pl\?op=add_form&category=| . uri_escape_utf8($category);
$delete_re = q|authorised_values.pl\?op=delete&searchfield=| . uri_escape_utf8($category);
for my $link ( $agent->links() ) {
if ( $link->url =~ qr|$add_form_re| ) {
$add_form_link_exists = 1;
}elsif( $link->url =~ qr|$delete_re| ) {
$delete_form_link_exists = 1;
}
}
is( $add_form_link_exists, 1, );
is( $delete_form_link_exists, 1, );
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl", 'Return to Authorized values page' );
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?searchfield=tòmas&offset=0", 'Search the values inserted' );
my $text2 = $agent->text() ;
#Tests on UTF-8
ok ( ( length(Encode::encode('UTF-8', $text)) != length($text) ) , 'UTF-8 are multi-byte. Good') ;
ok ($text2 =~ m/tòmas/, 'UTF-8 not Latin-1 first test is OK. Good');
ok ($text2=~ m/ràmen/, 'UTF-8 not Latin-1 second test is OK. Good');
my @links2 = $agent->links;
my $id_to_del2 ='';
$delete_re = q|op=delete\&searchfield=| . uri_escape_utf8($category) . q|\&id=(\d+)|;
foreach my $dato (@links2){
my $link = $dato->url;
if ($link =~ qr|$delete_re| ){
$id_to_del2 = $1;
last;
}
}
if ($id_to_del2) {
$agent->get_ok( "$intranet/cgi-bin/koha/admin/authorised_values.pl?op=delete&searchfield=tòmas&id=$id_to_del2", 'UTF_8 auth. value deleted' );
}else{
ok($id_to_del2 ne undef, "error, link to delete not working");
}
Koha::AuthorisedValueCategories->find($category)->delete; # Clean up