summaryrefslogtreecommitdiffstats
path: root/extensions/Push/t/ReviewBoard.t
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/Push/t/ReviewBoard.t')
-rw-r--r--extensions/Push/t/ReviewBoard.t224
1 files changed, 224 insertions, 0 deletions
diff --git a/extensions/Push/t/ReviewBoard.t b/extensions/Push/t/ReviewBoard.t
new file mode 100644
index 000000000..f2a508f59
--- /dev/null
+++ b/extensions/Push/t/ReviewBoard.t
@@ -0,0 +1,224 @@
+#!/usr/bin/perl -T
+# 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 lib qw( . lib );
+
+use Test::More;
+use Bugzilla;
+use Bugzilla::Extension;
+use Bugzilla::Attachment;
+use Scalar::Util 'blessed';
+use YAML;
+
+BEGIN {
+ eval {
+ require Test::LWP::UserAgent;
+ require Test::MockObject;
+ };
+ if ($@) {
+ plan skip_all =>
+ 'Tests require Test::LWP::UserAgent and Test::MockObject';
+ exit;
+ }
+}
+
+BEGIN {
+ Bugzilla->extensions; # load all of them
+ use_ok 'Bugzilla::Extension::Push::Connector::ReviewBoard::Client';
+ use_ok 'Bugzilla::Extension::Push::Constants';
+}
+
+my ($push) = grep { blessed($_) eq 'Bugzilla::Extension::Push' } @{Bugzilla->extensions };
+my $connectors = $push->_get_instance->connectors;
+my $con = $connectors->by_name('ReviewBoard');
+
+my $ua_204 = Test::LWP::UserAgent->new;
+$ua_204->map_response(
+ qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
+ HTTP::Response->new('204'));
+
+my $ua_404 = Test::LWP::UserAgent->new;
+$ua_404->map_response(
+ qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
+ HTTP::Response->new('404', undef, undef, q[{ "err": { "code": 100, "msg": "Object does not exist" }, "stat": "fail" }]));
+
+# forbidden
+my $ua_403 = Test::LWP::UserAgent->new;
+$ua_403->map_response(
+ qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
+ HTTP::Response->new('403', undef, undef, q[ {"err":{"code":101,"msg":"You don't have permission for this"},"stat":"fail"}]));
+
+# not logged in
+my $ua_401 = Test::LWP::UserAgent->new;
+$ua_401->map_response(
+ qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
+ HTTP::Response->new('401', undef, undef, q[ { "err": { "code": 103, "msg": "You are not logged in" }, "stat": "fail" } ]));
+
+# not logged in
+my $ua_500 = Test::LWP::UserAgent->new;
+$ua_500->map_response(
+ qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
+ HTTP::Response->new('500'));
+
+$con->client->{useragent} = $ua_204;
+$con->config->{base_uri} = 'https://reviewboard-dev.allizom.org';
+$con->client->{base_uri} = 'https://reviewboard-dev.allizom.org';
+
+{
+ my $msg = message(
+ event => {
+ routing_key => 'attachment.modify:is_private',
+ target => 'attachment',
+ },
+ attachment => {
+ is_private => 1,
+ content_type => 'text/plain',
+ bug => { id => 1, is_private => 0 },
+ },
+ );
+
+ ok(not($con->should_send($msg)), "text/plain message should not be sent");
+}
+
+my $data = slurp("extensions/Push/t/rblink.txt");
+Bugzilla::User::DEFAULT_USER->{userid} = 42;
+Bugzilla->set_user(Bugzilla::User->super_user);
+diag " " . Bugzilla::User->super_user->id;
+
+my $dbh = Bugzilla->dbh;
+$dbh->bz_start_transaction;
+my $timestamp = $dbh->selectrow_array('SELECT LOCALTIMESTAMP(0)');
+my $bug = Bugzilla::Bug->new({id => 9000});
+my $attachment = Bugzilla::Attachment->create(
+ { bug => $bug,
+ creation_ts => $timestamp,
+ data => $data,
+ filesize => length $data,
+ description => "rblink.txt",
+ filename => "rblink.txt",
+ isprivate => 1, ispatch => 0,
+ mimetype => 'text/x-review-board-request'});
+diag "".$attachment->id;
+$dbh->bz_commit_transaction;
+
+{
+ my $msg = message(
+ event => {
+ routing_key => 'attachment.modify:cc,is_private',
+ target => 'attachment',
+ },
+ attachment => {
+ id => $attachment->id,
+ is_private => 1,
+ content_type => 'text/x-review-board-request',
+ bug => { id => $bug->id, is_private => 0 },
+ },
+ );
+ ok($con->should_send($msg), "rb attachment should be sent");
+
+ {
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_OK, "good push result");
+ diag $err if $err;
+ }
+
+ {
+ local $con->client->{useragent} = $ua_404;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_OK, "good push result for 404");
+ diag $err if $err;
+ }
+
+
+ {
+ local $con->client->{useragent} = $ua_403;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_TRANSIENT, "transient error on 403");
+ diag $err if $err;
+ }
+
+
+ {
+ local $con->client->{useragent} = $ua_401;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_TRANSIENT, "transient error on 401");
+ diag $err if $err;
+ }
+
+ {
+ local $con->client->{useragent} = $ua_500;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_TRANSIENT, "transient error on 500");
+ diag $err if $err;
+ }
+}
+
+{
+ my $msg = message(
+ event => {
+ routing_key => 'bug.modify:is_private',
+ target => 'bug',
+ },
+ bug => {
+ is_private => 1,
+ id => $bug->id,
+ },
+ );
+
+ ok($con->should_send($msg), "rb attachment should be sent");
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_OK, "good push result");
+
+ {
+ local $con->client->{useragent} = $ua_404;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_OK, "good push result for 404");
+ }
+
+ {
+ local $con->client->{useragent} = $ua_403;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_TRANSIENT, "transient error on 404");
+ diag $err if $err;
+ }
+
+
+ {
+ local $con->client->{useragent} = $ua_401;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_TRANSIENT, "transient error on 401");
+ diag $err if $err;
+ }
+
+ {
+ local $con->client->{useragent} = $ua_401;
+ my ($rv, $err) = $con->send($msg);
+ is($rv, PUSH_RESULT_TRANSIENT, "transient error on 401");
+ diag $err if $err;
+ }
+}
+
+sub message {
+ my $msg_data = { @_ };
+
+ return Test::MockObject->new
+ ->set_always( routing_key => $msg_data->{event}{routing_key} )
+ ->set_always( payload_decoded => $msg_data );
+}
+
+sub slurp {
+ my $file = shift;
+ local $/ = undef;
+ open my $fh, '<', $file or die "unable to open $file";
+ my $s = readline $fh;
+ close $fh;
+ return $s;
+}
+
+done_testing;