Bug 13691: Add basic selenium script
[koha.git] / t / db_dependent / selenium / basic_workflow.t
blob6235a7ad14363d837aa3f6c9f0ae9fcc24b8b3a7
1 use Modern::Perl;
3 #die "Do NOT execute this script on a production server, it could affect your data\n Edit it and remove this line if you really want to use it";
5 use Time::HiRes qw(gettimeofday);
6 use C4::Context;
7 use C4::Biblio qw( AddBiblio ); # We shouldn't use it
9 use Selenium::Remote::Driver;
10 use Test::More tests => 20;
11 use MARC::Record;
12 use MARC::Field;
14 my $dbh = C4::Context->dbh;
15 my $login = 'koha';
16 my $password = 'koha';
17 my $base_url= 'http://'.C4::Context->preference("staffClientBaseURL")."/cgi-bin/koha/";
19 my $number_of_biblios_to_insert = 3;
20 our $sample_data = {
21     category => {
22         categorycode    => 'test_cat',
23         description     => 'test cat description',
24         enrolmentperiod => '12',
25         category_type   => 'A'
26     },
27     patron => {
28         surname    => 'test_patron_surname',
29         cardnumber => '4242424242',
30         userid     => 'test_username',
31         password   => 'password',
32         password2  => 'password'
33     },
37 #my $form_data;
38 #while ( my ($entity_name, $values) = each %$sample_data ) {
39 #    while ( my ( $field, $value ) = each %$values ) {
40 #        push @{ $form_data->{$entity_name} }, { field => $field, value => $value };
41 #    }
44 open our $fh, '>>', '/tmp/output.txt';
46 my $driver = Selenium::Remote::Driver->new;
47 our $start = gettimeofday;
48 our $prev_time = $start;
49 $driver->get($base_url."mainpage.pl");
50 like( $driver->get_title(), qr(Log in to Koha), );
51 auth( $driver, $login, $password );
52 time_diff("main");
54 $driver->get($base_url.'admin/categorie.pl');
55 like( $driver->get_title(), qr(Patron categories), );
56 $driver->find_element('//a[@id="newcategory"]')->click;
57 like( $driver->get_title(), qr(New category), );
58 fill_form( $driver, $sample_data->{category} );
59 $driver->find_element('//input[@type="button"]')->click;
61 time_diff("add patron category");
62 $driver->get($base_url.'/members/memberentry.pl?op=add&categorycode='.$sample_data->{category}{categorycode});
63 like( $driver->get_title(), qr(Add .*$sample_data->{category}{description}), );
64 fill_form( $driver, $sample_data->{patron} );
65 $driver->find_element('//fieldset[@class="action"]/input[@type="submit"]')->click;
66 like( $driver->get_title(), qr(Patron details for $sample_data->{patron}{surname}), );
68 ####$driver->get($base_url.'/members/members-home.pl');
69 ####fill_form( $driver, { searchmember => $sample_data->{patron}{cardnumber} } );
70 ####$driver->find_element('//div[@id="header_search"]/div/form/input[@type="submit"]')->click;
71 ####like( $driver->get_title(), qr(Patron details for), );
73 time_diff("add patron");
75 our $borrowernumber = $dbh->selectcol_arrayref(q|SELECT borrowernumber FROM borrowers WHERE userid=?|, {}, $sample_data->{patron}{userid} );
76 $borrowernumber = $borrowernumber->[0];
78 my @biblionumbers;
79 for my $i ( 1 .. $number_of_biblios_to_insert ) {
80     my $biblio = MARC::Record->new();
81     my $title = 'test biblio '.$i;
82     if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
83         $biblio->append_fields(
84             MARC::Field->new('200', ' ', ' ', a => 'test biblio '.$i),
85             MARC::Field->new('200', ' ', ' ', f => 'test author '.$i),
86         );
87     } else {
88         $biblio->append_fields(
89             MARC::Field->new('245', ' ', ' ', a => 'test biblio '.$i),
90             MARC::Field->new('100', ' ', ' ', a => 'test author '.$i),
91         );
92     }
93     my ($biblionumber, $biblioitemnumber) = AddBiblio($biblio, '');
94     push @biblionumbers, $biblionumber;
97 time_diff("add biblio");
99 my $itemtype = $dbh->selectcol_arrayref(q|SELECT itemtype FROM itemtypes|);
100 $itemtype = $itemtype->[0];
102 for my $biblionumber ( @biblionumbers ) {
103     $driver->get($base_url."/cataloguing/additem.pl?biblionumber=$biblionumber");
104     like( $driver->get_title(), qr(test biblio \d+ by test author), );
105     my $form = $driver->find_element('//form[@name="f"]');
106     my $inputs = $driver->find_child_elements($form, '//input[@type="text"]');
107     for my $input ( @$inputs ) {
108         next if $input->is_hidden();
109         $input->send_keys('t_value_bib'.$biblionumber);
110     }
112     $driver->find_element('//input[@name="add_submit"]')->click;
113     like( $driver->get_title(), qr($biblionumber.*Items) );
115     $dbh->do(q|UPDATE items SET notforloan=0 WHERE biblionumber=?|, {}, $biblionumber );
116     $dbh->do(q|UPDATE biblioitems SET itemtype=? WHERE biblionumber=?|, {}, $itemtype, $biblionumber);
117     $dbh->do(q|UPDATE items SET itype=? WHERE biblionumber=?|, {}, $itemtype, $biblionumber);
120 time_diff("add items");
122 my $nb_of_checkouts = 0;
123 for my $biblionumber ( @biblionumbers ) {
124     $driver->get($base_url."/circ/circulation.pl?borrowernumber=".$borrowernumber);
125     $driver->find_element('//input[@id="barcode"]')->send_keys('t_value_bib'.$biblionumber);
126     $driver->find_element('//fieldset[@id="circ_circulation_issue"]/button[@type="submit"]')->click;
127     $nb_of_checkouts++;
128     like( $driver->get_title(), qr(Checking out to $sample_data->{patron}{surname}) );
129     is( $driver->find_element('//a[@href="#checkouts"]')->get_attribute('text'), $nb_of_checkouts.' Checkout(s)', );
132 time_diff("checkout");
134 for my $biblionumber ( @biblionumbers ) {
135     $driver->get($base_url."/circ/returns.pl");
136     $driver->find_element('//input[@id="barcode"]')->send_keys('t_value_bib'.$biblionumber);
137     $driver->find_element('//form[@id="checkin-form"]/div/fieldset/input[@type="submit"]')->click;
138     like( $driver->get_title(), qr(Check in test biblio \d+) );
141 time_diff("checkin");
143 close $fh;
144 $driver->quit();
146 END {
147     cleanup();
150 sub auth {
151     my ( $driver, $login, $password) = @_;
152     fill_form( $driver, { userid => 'koha', password => 'koha' } );
153     my $login_button = $driver->find_element('//input[@id="submit"]');
154     $login_button->submit();
157 sub fill_form {
158     my ( $driver, $values ) = @_;
159     while ( my ( $id, $value ) = each %$values ) {
160         my $element = $driver->find_element('//*[@id="'.$id.'"]');
161         my $tag = $element->get_tag_name();
162         if ( $tag eq 'input' ) {
163             $driver->find_element('//input[@id="'.$id.'"]')->send_keys($value);
164         } elsif ( $tag eq 'select' ) {
165             $driver->find_element('//select[@id="'.$id.'"]/option[@value="'.$value.'"]')->click;
166         }
167     }
170 sub cleanup {
171     my $dbh = C4::Context->dbh;
172     $dbh->do(q|DELETE FROM categories WHERE categorycode = ?|, {}, $sample_data->{category}{categorycode});
173     $dbh->do(q|DELETE FROM borrowers WHERE userid = ?|, {}, $sample_data->{patron}{userid});
174     for my $i ( 1 .. $number_of_biblios_to_insert ) {
175         $dbh->do(qq|DELETE FROM biblio WHERE title = "test biblio $i"|);
176     };
178     $dbh->do(q|DELETE FROM issues where borrowernumber=?|, {}, $borrowernumber);
179     $dbh->do(q|DELETE FROM old_issues where borrowernumber=?|, {}, $borrowernumber);
180     for my $i ( 1 .. $number_of_biblios_to_insert ) {
181         $dbh->do(qq|DELETE items, biblio FROM biblio INNER JOIN items ON biblio.biblionumber = items.biblionumber WHERE biblio.title = "test biblio$i"|);
182     };
185 sub time_diff {
186     my $lib = shift;
187     my $now = gettimeofday;
188     warn "CP $lib = " . sprintf("%.2f", $now - $prev_time ) . "\n";
189     $prev_time = $now;