summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Test
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla/Test')
-rw-r--r--Bugzilla/Test/MockDB.pm120
-rw-r--r--Bugzilla/Test/MockLocalconfig.pm18
-rw-r--r--Bugzilla/Test/MockParams.pm71
-rw-r--r--Bugzilla/Test/Util.pm2
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,
});
}