diff options
Diffstat (limited to 'Bugzilla/Test')
-rw-r--r-- | Bugzilla/Test/MockDB.pm | 120 | ||||
-rw-r--r-- | Bugzilla/Test/MockLocalconfig.pm | 18 | ||||
-rw-r--r-- | Bugzilla/Test/MockParams.pm | 71 | ||||
-rw-r--r-- | Bugzilla/Test/Util.pm | 2 |
4 files changed, 210 insertions, 1 deletions
diff --git a/Bugzilla/Test/MockDB.pm b/Bugzilla/Test/MockDB.pm new file mode 100644 index 000000000..fb7873ccf --- /dev/null +++ b/Bugzilla/Test/MockDB.pm @@ -0,0 +1,120 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. +package Bugzilla::Test::MockDB; +use 5.10.1; +use strict; +use warnings; +use Try::Tiny; +use Capture::Tiny qw(capture_merged); + +use Bugzilla::Test::MockLocalconfig ( + db_driver => 'sqlite', + db_name => ':memory:', +); +use Bugzilla; +BEGIN { Bugzilla->extensions }; +use Bugzilla::Test::MockParams ( + emailsuffix => '', + emailregexp => '.+', +); + +sub import { + require Bugzilla::Install; + require Bugzilla::Install::DB; + require Bugzilla::Field;; + + state $first_time = 0; + + return undef if $first_time++; + + return capture_merged { + Bugzilla->dbh->bz_setup_database(); + + # Populate the tables that hold the values for the <select> fields. + Bugzilla->dbh->bz_populate_enum_tables(); + + Bugzilla::Install::DB::update_fielddefs_definition(); + Bugzilla::Field::populate_field_definitions(); + Bugzilla::Install::init_workflow(); + Bugzilla::Install::DB->update_table_definitions({}); + Bugzilla::Install::update_system_groups(); + + Bugzilla->set_user(Bugzilla::User->super_user); + + Bugzilla::Install::update_settings(); + + my $dbh = Bugzilla->dbh; + if ( !$dbh->selectrow_array("SELECT 1 FROM priority WHERE value = 'P1'") ) { + $dbh->do("DELETE FROM priority"); + my $count = 100; + foreach my $priority (map { "P$_" } 1..5) { + $dbh->do( "INSERT INTO priority (value, sortkey) VALUES (?, ?)", undef, ( $priority, $count + 100 ) ); + } + } + my @flagtypes = ( + { + name => 'review', + desc => 'The patch has passed review by a module owner or peer.', + is_requestable => 1, + is_requesteeble => 1, + is_multiplicable => 1, + grant_group => '', + target_type => 'a', + cc_list => '', + inclusions => [''] + }, + { + name => 'feedback', + desc => 'A particular person\'s input is requested for a patch, ' . + 'but that input does not amount to an official review.', + is_requestable => 1, + is_requesteeble => 1, + is_multiplicable => 1, + grant_group => '', + target_type => 'a', + cc_list => '', + inclusions => [''] + } + ); + + foreach my $flag (@flagtypes) { + next if Bugzilla::FlagType->new({ name => $flag->{name} }); + my $grant_group_id = $flag->{grant_group} + ? Bugzilla::Group->new({ name => $flag->{grant_group} })->id + : undef; + my $request_group_id = $flag->{request_group} + ? Bugzilla::Group->new({ name => $flag->{request_group} })->id + : undef; + + $dbh->do('INSERT INTO flagtypes (name, description, cc_list, target_type, is_requestable, + is_requesteeble, is_multiplicable, grant_group_id, request_group_id) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', + undef, ($flag->{name}, $flag->{desc}, $flag->{cc_list}, $flag->{target_type}, + $flag->{is_requestable}, $flag->{is_requesteeble}, $flag->{is_multiplicable}, + $grant_group_id, $request_group_id)); + + my $type_id = $dbh->bz_last_key('flagtypes', 'id'); + + foreach my $inclusion (@{$flag->{inclusions}}) { + my ($product, $component) = split(':', $inclusion); + my ($prod_id, $comp_id); + if ($product) { + my $prod_obj = Bugzilla::Product->new({ name => $product }); + $prod_id = $prod_obj->id; + if ($component) { + $comp_id = Bugzilla::Component->new({ name => $component, product => $prod_obj})->id; + } + } + $dbh->do('INSERT INTO flaginclusions (type_id, product_id, component_id) + VALUES (?, ?, ?)', + undef, ($type_id, $prod_id, $comp_id)); + } + } + }; +} + +1; diff --git a/Bugzilla/Test/MockLocalconfig.pm b/Bugzilla/Test/MockLocalconfig.pm new file mode 100644 index 000000000..a32aea0d4 --- /dev/null +++ b/Bugzilla/Test/MockLocalconfig.pm @@ -0,0 +1,18 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. +package Bugzilla::Test::MockLocalconfig; +use 5.10.1; +use strict; +use warnings; + +sub import { + my ($class, %lc) = @_; + $ENV{LOCALCONFIG_ENV} = 'BMO'; + $ENV{"BMO_$_"} = $lc{$_} for keys %lc; +} + +1; diff --git a/Bugzilla/Test/MockParams.pm b/Bugzilla/Test/MockParams.pm new file mode 100644 index 000000000..2d064c616 --- /dev/null +++ b/Bugzilla/Test/MockParams.pm @@ -0,0 +1,71 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. +package Bugzilla::Test::MockParams; +use 5.10.1; +use strict; +use warnings; +use Try::Tiny; +use Capture::Tiny qw(capture_merged); +use Test2::Tools::Mock qw(mock); + +use Bugzilla::Config; +use Safe; + +our $Params; +BEGIN { + our $Mock = mock 'Bugzilla::Config' => ( + override => [ + 'read_param_file' => sub { + my ($class) = @_; + return {} unless $Params; + my $s = Safe->new; + $s->reval($Params); + die "Error evaluating params: $@" if $@; + return { %{ $s->varglob('param') } }; + }, + '_write_file' => sub { + my ($class, $str) = @_; + $Params = $str; + }, + ], + ); +} + +sub import { + my ($self, %answers) = @_; + state $first_time = 0; + + require Bugzilla::Field; + require Bugzilla::Status; + require Bugzilla; + my $Bugzilla = mock 'Bugzilla' => ( + override => [ + installation_answers => sub { \%answers }, + ], + ); + my $BugzillaField = mock 'Bugzilla::Field' => ( + override => [ + get_legal_field_values => sub { [] }, + ], + ); + my $BugzillaStatus = mock 'Bugzilla::Status' => ( + override => [ + closed_bug_statuses => sub { die "no database" }, + ], + ); + + if ($first_time++) { + capture_merged { + Bugzilla::Config::update_params(); + }; + } + else { + Bugzilla::Config::SetParam($_, $answers{$_}) for keys %answers; + } +} + +1;
\ No newline at end of file diff --git a/Bugzilla/Test/Util.pm b/Bugzilla/Test/Util.pm index 4c9981e52..02c842658 100644 --- a/Bugzilla/Test/Util.pm +++ b/Bugzilla/Test/Util.pm @@ -24,7 +24,7 @@ sub create_user { cryptpassword => $password, disabledtext => "", disable_mail => 0, - extern_id => 0, + extern_id => undef, %extra, }); } |