From ea5beeacb185309572836cc60989f95ea4705f9d Mon Sep 17 00:00:00 2001 From: Dylan William Hardison Date: Fri, 10 Aug 2018 15:41:53 -0400 Subject: Bug 1482475 - Add extensive testing framework --- t/mock-db.t | 35 ++++++++ t/mock-params.t | 25 ++++++ t/phabbugz.t | 243 ------------------------------------------------------ t/sqlite-memory.t | 89 ++++++++++++++++++++ 4 files changed, 149 insertions(+), 243 deletions(-) create mode 100644 t/mock-db.t create mode 100644 t/mock-params.t delete mode 100644 t/phabbugz.t create mode 100644 t/sqlite-memory.t (limited to 't') diff --git a/t/mock-db.t b/t/mock-db.t new file mode 100644 index 000000000..6cf84f316 --- /dev/null +++ b/t/mock-db.t @@ -0,0 +1,35 @@ +#!/usr/bin/perl +# 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. +use 5.10.1; +use strict; +use warnings; +use lib qw( . lib local/lib/perl5 ); +use Test::More; +use Try::Tiny; + +use ok 'Bugzilla::Test::MockDB'; +use ok 'Bugzilla::Test::Util', qw(create_user); + +try { + Bugzilla::Test::MockDB->import(); + pass('made fake in-memory db'); +} +catch { + diag $_; + fail('made fake in-memory db'); +}; + +try { + create_user('bob@pants.gov', '*'); + ok( Bugzilla::User->new({name => 'bob@pants.gov'})->id, 'create a user' ); +} +catch { + fail('create a user'); +}; + +done_testing; diff --git a/t/mock-params.t b/t/mock-params.t new file mode 100644 index 000000000..7c2318130 --- /dev/null +++ b/t/mock-params.t @@ -0,0 +1,25 @@ +#!/usr/bin/perl +# 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. +use 5.10.1; +use strict; +use warnings; +use lib qw( . lib local/lib/perl5 ); +use Test::More; +use Test2::Tools::Mock qw(mock); +use Bugzilla::Test::MockParams ( + phabricator_auth_callback_url => 'http://pants.gov/', +); + +is(Bugzilla->params->{phabricator_auth_callback_url}, 'http://pants.gov/', 'import default params'); + +Bugzilla::Test::MockParams->import(phabricator_api_key => 'FAKE-KEY'); + +is(Bugzilla->params->{phabricator_api_key}, 'FAKE-KEY', 'set key'); + + +done_testing; diff --git a/t/phabbugz.t b/t/phabbugz.t deleted file mode 100644 index ba2f35e1d..000000000 --- a/t/phabbugz.t +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/perl -# 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. -use strict; -use warnings; -use 5.10.1; -use lib qw( . lib local/lib/perl5 ); -use Bugzilla; - -BEGIN { Bugzilla->extensions }; - -use Test::More; -use Test2::Tools::Mock; -use Data::Dumper; -use JSON::MaybeXS; -use Carp; -use Try::Tiny; - -use ok 'Bugzilla::Extension::PhabBugz::Feed'; -use ok 'Bugzilla::Extension::PhabBugz::Util', qw( get_attachment_revisions ); -can_ok('Bugzilla::Extension::PhabBugz::Feed', 'group_query'); - -our @group_members; -our @project_members; - - -my $User = mock 'Bugzilla::Extension::PhabBugz::User' => ( - add_constructor => [ - 'fake_new' => 'hash', - ], - override => [ - 'match' => sub { [ mock() ] }, - ], -); - -my $Feed = mock 'Bugzilla::Extension::PhabBugz::Feed' => ( - override => [ - get_group_members => sub { - return [ map { Bugzilla::Extension::PhabBugz::User->fake_new(%$_) } @group_members ]; - } - ] -); - -my $Project = mock 'Bugzilla::Extension::PhabBugz::Project' => ( - override_constructor => [ - new_from_query => 'ref_copy', - ], - override => [ - 'members' => sub { - return [ map { Bugzilla::Extension::PhabBugz::User->fake_new(%$_) } @project_members ]; - } - ] -); - -local Bugzilla->params->{phabricator_enabled} = 1; -local Bugzilla->params->{phabricator_api_key} = 'FAKE-API-KEY'; -local Bugzilla->params->{phabricator_base_uri} = 'http://fake.fabricator.tld'; - -my $Bugzilla = mock 'Bugzilla' => ( - override => [ - 'dbh' => sub { mock() }, - 'user' => sub { Bugzilla::User->new({ name => 'phab-bot@bmo.tld' }) }, - ], -); - -my $BugzillaGroup = mock 'Bugzilla::Group' => ( - add_constructor => [ - 'fake_new' => 'hash', - ], - override => [ - 'match' => sub { [ Bugzilla::Group->fake_new(id => 1, name => 'firefox-security' ) ] }, - ], -); - -my $BugzillaUser = mock 'Bugzilla::User' => ( - add_constructor => [ - 'fake_new' => 'hash', - ], - override => [ - 'new' => sub { - my ($class, $hash) = @_; - if ($hash->{name} eq 'phab-bot@bmo.tld') { - return $class->fake_new( id => 8_675_309, login_name => 'phab-bot@bmo.tld', realname => 'Fake PhabBot' ); - } - else { - } - }, - 'match' => sub { [ mock() ] }, - ], -); - - -my $feed = Bugzilla::Extension::PhabBugz::Feed->new; - -# Same members in both -do { - my $UserAgent = mock 'LWP::UserAgent' => ( - override => [ - 'post' => sub { - my ($self, $url, $params) = @_; - my $data = decode_json($params->{params}); - is_deeply($data->{transactions}, [], 'no-op'); - return mock({is_error => 0, content => '{}'}); - }, - ], - ); - local @group_members = ( - { phid => 'foo' }, - ); - local @project_members = ( - { phid => 'foo' }, - ); - $feed->group_query; -}; - -# Project has members not in group -do { - my $UserAgent = mock 'LWP::UserAgent' => ( - override => [ - 'post' => sub { - my ($self, $url, $params) = @_; - my $data = decode_json($params->{params}); - my $expected = [ { type => 'members.remove', value => ['foo'] } ]; - is_deeply($data->{transactions}, $expected, 'remove foo'); - return mock({is_error => 0, content => '{}'}); - }, - ] - ); - local @group_members = (); - local @project_members = ( - { phid => 'foo' }, - ); - $feed->group_query; -}; - -# Group has members not in project -do { - my $UserAgent = mock 'LWP::UserAgent' => ( - override => [ - 'post' => sub { - my ($self, $url, $params) = @_; - my $data = decode_json($params->{params}); - my $expected = [ { type => 'members.add', value => ['foo'] } ]; - is_deeply($data->{transactions}, $expected, 'add foo'); - return mock({is_error => 0, content => '{}'}); - }, - ] - ); - local @group_members = ( - { phid => 'foo' }, - ); - local @project_members = ( - ); - $feed->group_query; -}; - -do { - my $Revision = mock 'Bugzilla::Extension::PhabBugz::Revision' => ( - override => [ - 'update' => sub { 1 }, - ], - ); - my $UserAgent = mock 'LWP::UserAgent' => ( - override => [ - 'post' => sub { - my ($self, $url, $params) = @_; - if ($url =~ /differential\.revision\.search/) { - my $content = < 0, content => $content }; - } - else { - return mock { is_error => 1, message => "bad request" }; - } - }, - ], - ); - my $bug = mock { - bug_id => 23, - attachments => [ - mock { - contenttype => 'text/x-phabricator-request', - filename => 'phabricator-D9999-url.txt', - }, - ] - }; - my $revisions = get_attachment_revisions($bug); - is(ref($revisions), 'ARRAY', 'it is an array ref'); - isa_ok($revisions->[0], 'Bugzilla::Extension::PhabBugz::Revision'); - is($revisions->[0]->bug_id, 23, 'Bugzila ID is 23'); - ok( try { $revisions->[0]->update }, 'update revision'); - -}; - -done_testing; \ No newline at end of file diff --git a/t/sqlite-memory.t b/t/sqlite-memory.t new file mode 100644 index 000000000..66f8e5d29 --- /dev/null +++ b/t/sqlite-memory.t @@ -0,0 +1,89 @@ +# 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. +use 5.10.1; +use strict; +use warnings; +use lib qw( . lib local/lib/perl5 ); +use Test::More; +use Test2::Tools::Mock; +use Try::Tiny; +use Capture::Tiny qw(capture_merged); +use Bugzilla::Test::MockParams; + +BEGIN { + $ENV{LOCALCONFIG_ENV} = 'BMO'; + $ENV{BMO_db_driver} = 'sqlite'; + $ENV{BMO_db_name} = ':memory:'; +}; +use Bugzilla; +BEGIN { Bugzilla->extensions }; + + +isa_ok(Bugzilla->dbh, 'Bugzilla::DB::Sqlite'); + +use ok 'Bugzilla::Install'; +use ok 'Bugzilla::Install::DB'; + +my $lives_ok = sub { + my ($desc, $code) = @_; + my $output; + try { + $output = capture_merged { $code->() }; + pass($desc); + } catch { + diag $_; + fail($desc); + } finally { + diag "OUTPUT: $output" if $output; + }; +}; + +my $output = ''; +$lives_ok->('bz_setup_database' => sub { + Bugzilla->dbh->bz_setup_database +}); + +$lives_ok->('bz_populate_enum_tables' => sub { + # Populate the tables that hold the values for the