Koha Test Wiki Canasta - March 2024
One of a series of test instances for migrating the Koha Wiki MediaWiki database.
For the current Koha Wiki, visit https://wiki.koha-community.org .Interface testing with WWW::Mechanize
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:
- Install HTTP::Recorder and WWW::Mechanize:
sudo apt-get install libhttp-proxy-perl libhttp-recorder-perl libwww-mechanize-perl libtest-www-mechanize-perl - Download the proxy script:
wget https://raw.github.com/jcamins/release-tools/master/httprecorder.pl - Run the proxy script:
perl httprecorder.pl - Open your web browser
- 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
- 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
- When you want to look at the script you have generated, go to http://http-recorder
- 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' );