summaryrefslogtreecommitdiffstats
path: root/t/mojo-example.t
blob: 8ed4835dae79d39cc0fb2db362cb1ecfce9c6b2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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;