]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1494065 - Add a basic test using Test::Mojo
authorDylan William Hardison <dylan@hardison.net>
Tue, 25 Sep 2018 21:30:28 +0000 (17:30 -0400)
committerGitHub <noreply@github.com>
Tue, 25 Sep 2018 21:30:28 +0000 (17:30 -0400)
Bugzilla/Quantum.pm
Bugzilla/Test/Util.pm
Makefile.PL
t/mojo-example.t [new file with mode: 0644]

index 8af06c47741c2559a0e29e15e261f683c3db91bd..c64e57e137a3bfef8d25831034d9c5837616c17d 100644 (file)
@@ -34,7 +34,7 @@ sub startup {
 
     DEBUG('Starting up');
     $self->plugin('Bugzilla::Quantum::Plugin::Glue');
-    $self->plugin('Bugzilla::Quantum::Plugin::Hostage');
+    $self->plugin('Bugzilla::Quantum::Plugin::Hostage') unless $ENV{BUGZILLA_DISABLE_HOSTAGE};
     $self->plugin('Bugzilla::Quantum::Plugin::BlockIP');
     $self->plugin('Bugzilla::Quantum::Plugin::BasicAuth');
 
index 02c8426582d942c9b38a67495c604078934840e4..8124c25ee047a70afabec17e42c3314a968ea82c 100644 (file)
@@ -12,9 +12,10 @@ use strict;
 use warnings;
 
 use base qw(Exporter);
-our @EXPORT = qw(create_user);
+our @EXPORT = qw(create_user issue_api_key);
 
 use Bugzilla::User;
+use Bugzilla::User::APIKey;
 
 sub create_user {
     my ($login, $password, %extra) = @_;
@@ -29,4 +30,21 @@ sub create_user {
     });
 }
 
+sub issue_api_key {
+    my ($login, $given_api_key) = @_;
+    my $user = Bugzilla::User->check({ name => $login });
+
+    my $params = {
+        user_id     => $user->id,
+        description => 'Bugzilla::Test::Util::issue_api_key',
+        api_key     => $given_api_key,
+    };
+
+    if ($given_api_key) {
+        return Bugzilla::User::APIKey->create_special($params);
+    } else {
+        return Bugzilla::User::APIKey->create($params);
+    }
+}
+
 1;
index 495c07c58218e66574d3149b2286cccc06bf2b98..4aa352468d92499638ed4a8b44745c115066c499 100755 (executable)
@@ -92,13 +92,14 @@ my %requires = (
 
 my %build_requires = ( 'ExtUtils::MakeMaker' => '7.22', );
 my %test_requires = (
-    'Test::More'                      => 0,
+    'Capture::Tiny'                   => 0,
+    'DBD::SQLite'                     => '1.29',
+    'Perl::Critic::Freenode'          => 0,
     'Pod::Coverage'                   => 0,
-    'Test::WWW::Selenium'             => 0,
-    'Test::Selenium::Firefox'         => 0,
+    'Test::More'                      => 0,
     'Test::Perl::Critic::Progressive' => 0,
-    'Perl::Critic::Freenode'          => 0,
-    'Capture::Tiny'                   => 0,
+    'Test::Selenium::Firefox'         => 0,
+    'Test::WWW::Selenium'             => 0,
 );
 my %recommends = ( Safe => '2.30',);
 
diff --git a/t/mojo-example.t b/t/mojo-example.t
new file mode 100644 (file)
index 0000000..8ed4835
--- /dev/null
@@ -0,0 +1,76 @@
+#!/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 );
+
+BEGIN {
+    $ENV{LOG4PERL_CONFIG_FILE}     = 'log4perl-t.conf';
+    # There's a plugin called Hostage that makes the application require specific Host: headers.
+    # we disable that for these tests.
+    $ENV{BUGZILLA_DISABLE_HOSTAGE} = 1;
+}
+
+# this provides a default urlbase.
+# Most localconfig options the other Bugzilla::Test::Mock* modules take care for us.
+use Bugzilla::Test::MockLocalconfig ( urlbase => 'http://bmo-web.vm' );
+
+# This configures an in-memory sqlite database.
+use Bugzilla::Test::MockDB;
+
+# This redirects reads and writes from the config file (data/params)
+use Bugzilla::Test::MockParams (
+    phabricator_enabled => 1,
+    announcehtml        => '<div id="announcement">Mojo::Test is awesome</div>',
+);
+
+# Util provides a few functions more making mock data in the DB.
+use Bugzilla::Test::Util qw(create_user issue_api_key);
+
+use Test2::V0;
+use Test2::Tools::Mock;
+use Test::Mojo;
+
+my $api_user = create_user('api@mozilla.org', '*');
+my $api_key  = issue_api_key('api@mozilla.org')->api_key;
+
+# Mojo::Test loads the application and provides methods for
+# testing requests without having to run a server.
+my $t = Test::Mojo->new('Bugzilla::Quantum');
+
+# we ensure this file exists so the /__lbhearbeat__ test passes.
+$t->app->home->child('__lbheartbeat__')->spurt('httpd OK');
+
+# Method chaining is used extensively.
+$t->get_ok('/__lbheartbeat__')->status_is(200)->content_is('httpd OK');
+
+# this won't work until we can mock memcached.
+# $t->get_ok('/__heartbeat__')->status_is(200);
+
+# we can use json_is or json_like to check APIs.
+# The first pair to json_like is a JSON pointer (RFC 6901)
+$t->get_ok('/bzapi/configuration')->status_is(200)->json_like( '/announcement' => qr/Mojo::Test is awesome/ );
+
+# for web requests, you use text_like (or text_is) with CSS selectors.
+$t->get_ok('/')->status_is(200)->text_like( '#announcement' => qr/Mojo::Test is awesome/ );
+
+# Chaining is not magical, you can break up longer lines
+# by calling methods on $t, as below.
+$t->get_ok('/rest/whoami' => { 'X-Bugzilla-API-Key' => $api_key });
+$t->status_is(200);
+$t->json_is('/name' => $api_user->login);
+$t->json_is('/id' => $api_user->id);
+
+# Each time you call $t->get_ok, post_ok, etc the previous request is cleared.
+$t->get_ok('/rest/whoami');
+$t->status_is(200);
+$t->json_is('/name' => '');
+$t->json_is('/id' => 0);
+
+done_testing;