#!/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' } use Bugzilla::Test::MockDB; use Bugzilla::Test::MockParams; use Bugzilla::Test::Util qw(create_user mock_useragent_tx); use Test::More; use Test2::Tools::Mock; use Try::Tiny; use JSON::MaybeXS; use Bugzilla::Constants; use URI; use File::Basename; use Digest::SHA qw(sha1_hex); use ok 'Bugzilla::Extension::PhabBugz::Feed'; use ok 'Bugzilla::Extension::PhabBugz::Constants', 'PHAB_AUTOMATION_USER'; use ok 'Bugzilla::Config', 'SetParam'; can_ok( 'Bugzilla::Extension::PhabBugz::Feed', qw( group_query feed_query user_query ) ); Bugzilla->error_mode(ERROR_MODE_TEST); my $phab_bot = create_user(PHAB_AUTOMATION_USER, '*'); my $UserAgent = mock 'Mojo::UserAgent' => (); { SetParam('phabricator_enabled', 0); my $feed = Bugzilla::Extension::PhabBugz::Feed->new; my $Feed = mock 'Bugzilla::Extension::PhabBugz::Feed' => (override => [get_last_id => sub { die "get_last_id" },],); foreach my $method (qw( feed_query user_query group_query )) { try { $feed->$method; pass "disabling the phabricator sync: $method"; } catch { fail "disabling the phabricator sync: $method"; } } } my @bad_response = ( ['http error', mock_useragent_tx("doesn't matter", sub { $_->code(500) })], ['invalid json', mock_useragent_tx('foo')], [ 'json containing error code', mock_useragent_tx(encode_json({error_code => 1234})) ], ); SetParam(phabricator_enabled => 1); SetParam(phabricator_api_key => 'FAKE-API-KEY'); SetParam(phabricator_base_uri => 'http://fake.fabricator.tld/'); foreach my $bad_response (@bad_response) { my $feed = Bugzilla::Extension::PhabBugz::Feed->new; $UserAgent->override( post => sub { my ($self, $url, undef, $params) = @_; return $bad_response->[1]; } ); foreach my $method (qw( feed_query user_query group_query )) { try { # This is a hack to get reasonable exception objects. local $Bugzilla::Template::is_processing = 1; $feed->$method; fail "$method - $bad_response->[0]"; } catch { is( $_->type, 'bugzilla.code.phabricator_api_error', "$method - $bad_response->[0]" ); }; } $UserAgent->reset('post'); } my $feed = Bugzilla::Extension::PhabBugz::Feed->new; my $json = JSON::MaybeXS->new(canonical => 1, pretty => 1); my $dylan = create_user('dylan@mozilla.com', '*', realname => 'Dylan Hardison :dylan'); my $evildylan = create_user('dylan@gmail.com', '*', realname => 'Evil Dylan :dylan'); my $myk = create_user('myk@mozilla.com', '*', realname => 'Myk Melez :myk'); my $phab_bot_phid = next_phid('PHID-USER'); done_testing; sub user_search { my (%conf) = @_; return { error_info => undef, error_code => undef, result => { cursor => {after => $conf{after}, order => undef, limit => 100, before => undef}, query => {queryKey => undef}, maps => {}, data => [ map { +{ attachments => { $_->{bmo_id} ? ("external-accounts" => {"external-accounts" => [{type => 'bmo', id => $_->{bmo_id},}]}) : (), }, fields => { roles => ["verified", "approved", "activated"], realName => $_->{realname}, dateModified => time, policy => {view => "public", edit => "no-one"}, dateCreated => time, username => $_->{username}, }, phid => next_phid("PHID-USER"), type => "USER", id => $_->{phab_id}, }, } @{$conf{users}}, ] } }; } sub next_phid { my ($prefix) = @_; state $number = 'a' x 20; return $prefix . '-' . ($number++); }