Koha Test Wiki MW Canasta on Koha Portainer

Test major Koha Wiki changes or bug fixes here without fear of breaking the production wiki.

For the current Koha Wiki, visit https://wiki.koha-community.org .

Interface testing with WWW::Mechanize

From Koha Test Wiki MW Canasta on Koha Portainer
Jump to navigation Jump to search

Using HTTP::Recorder, it is easy to generate tests that use WWW::Mechanize to test the functionality of Koha.

In order to use HTTP::Recorder, you will need to do the following:

  1. Install HTTP::Recorder and WWW::Mechanize:
    sudo apt-get install libhttp-proxy-perl libhttp-recorder-perl libwww-mechanize-perl libtest-www-mechanize-perl
  2. Download the proxy script:
    wget https://raw.github.com/jcamins/release-tools/master/httprecorder.pl
  3. Run the proxy script:
    perl httprecorder.pl
  4. Open your web browser
  5. Set your web browser to use a HTTP proxy on 127.0.0.1:9000 (adjust the host name if you are running the httprecorder in a vm) Screenshot
  6. Navigate to your Koha installation, and do whatever it is you were planning on doing, knowing that it is being recorded in a script for later use
  7. When you want to look at the script you have generated, go to http://http-recorder
  8. Remove the HTTP proxy when you are done

Important warnings

Logging in with Test::WWW::Mechanize

Starting in 3.8.x, logins may not be recorded quite correctly by http-recorder. If you have problems, the following four lines will login correctly (http-recorder may miss the line that sets the branch, I am not sure why):

$agent->field('password', $password);
$agent->field('userid', $user);
$agent->field('branch', '');
$agent->click_ok('', 'login to staff client');

Uploading files

Uploading files using post turns out to not work quite right with Test::WWW::Mechanize. Use the following code instead of the seemingly obvious post_ok() alternative:

$agent->post( "$intranet/cgi-bin/koha/tools/upload-file.pl",
        [
          'fileToUpload' => ["$testdir/data/record.mrc"],
        ],
        'Content_Type' => 'form-data',
        );
ok($agent->success, 'uploaded file');

Examples

t/config.pl

$config = {
        server => 'localhost:1389',
        bind_as => 'login@example.com', # test rewrite on bind
        password => 'password',
        search => {
                base => 'dc=example,dc=com',
                filter => 'uid=login',
        },
        attributes_required => [ qw/
                uid
        / ],
};

t/koha/01-remove-test-user.t

#!/usr/bin/perl

use warnings;
use strict;

use Test::More tests => 7;
use Test::WWW::Mechanize;
use XML::Simple;
use Data::Dump qw(dump);

my $url =       $ENV{INTRANET}  || 'http://ffzg.koha-dev.rot13.org:8080';
my $koha_conf = $ENV{KOHA_CONF} || '/etc/koha/sites/ffzg/koha-conf.xml';

my $xml = XMLin( $koha_conf );
diag 'Koha config = ',dump $xml->{config};

ok( $xml->{config}->{useldapserver}, 'useldapserver' );

our $config;
require 't/config.pl';
diag 'test config = ',dump $config;

my $mech = Test::WWW::Mechanize->new;

$mech->get_ok( $url, "intranet $url" );

$mech->submit_form_ok({
        fields => {
                userid   => $xml->{config}->{user},
                password => $xml->{config}->{pass},
        },
}, "login $xml->{config}->{user}");

$mech->submit_form_ok({
        form_number => 2,
        fields => {
                member => $config->{bind_as},
        },
}, 'find patron' );

#diag $mech->content;

$mech->follow_link_ok({ url_regex => qr/moremember/ }, 'details' );

my $html = $mech->content();

if ( $html =~ m{(/cgi-bin/koha/members/deletemem\.pl\?member=\d+)}s ) {
        ok( $1, 'found deletemem' );
        $mech->get_ok( $url . $1 );
}


t/koha/02-create-test-user.t

#!/usr/bin/perl

use warnings;
use strict;

use Test::More tests => 4;
use Test::WWW::Mechanize;

our $config;
require 't/config.pl';

use WWW::Mechanize;

my $mech = Test::WWW::Mechanize->new;

my $save_count = 1;
sub save {
	my $path = '/tmp/login-' . $save_count++ . '.html';
	open(my $fh, '>', $path);
	print $fh @_;
	warn "# save $path ", -s $path, " bytes\n";
}

my $opac_url = $ENV{OPAC_URL} || 'http://site.example.com';

$mech->get_ok( $opac_url, "opac $opac_url" );
save $mech->content;

$mech->follow_link_ok({ url_regex => qr/opac-user/i }, 'login form' );
save $mech->content;

$mech->submit_form_ok({
	form_number => 2,
	fields => {
		userid => $config->{bind_as},
		password => $config->{password},
	},
}, 'login');
save $mech->content;

$mech->follow_link_ok({ url_regex => qr/logout/ }, 'logout' );