#!/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 Test2::V0; our @EMAILS; BEGIN { require Bugzilla::Mailer; no warnings 'redefine'; *Bugzilla::Mailer::MessageToMTA = sub { push @EMAILS, [@_]; }; } use Bugzilla::Test::MockDB; use Bugzilla::Test::MockParams; use Bugzilla::Test::Util qw(create_user); 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 Data::Dumper; 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 ) ); SetParam(phabricator_base_uri => 'http://fake.phabricator.tld/'); SetParam(mailfrom => 'bugzilla-daemon'); Bugzilla->error_mode(ERROR_MODE_TEST); my $nobody = create_user('nobody@mozilla.org', '*'); my $phab_bot = create_user(PHAB_AUTOMATION_USER, '*'); # Steve Rogers is the revision author my $steve = create_user('steverogers@avengers.org', '*', realname => 'Steve Rogers :steve'); # Bucky Barns is the reviewer my $bucky = create_user('bucky@avengers.org', '*', realname => 'Bucky Barns :bucky'); my $firefox = Bugzilla::Product->create( { name => 'Firefox', description => 'Fake firefox product', version => 'Unspecified', }, ); my $general = Bugzilla::Component->create({ product => $firefox, name => 'General', description => 'The most general description', initialowner => {id => $nobody->id}, }); Bugzilla->set_user($steve); my $bug = Bugzilla::Bug->create({ short_desc => 'test bug', product => $firefox, component => $general->name, bug_severity => 'normal', op_sys => 'Unspecified', rep_platform => 'Unspecified', version => 'Unspecified', comment => 'first post', priority => 'P1', }); my $recipients = {changer => $steve}; Bugzilla::BugMail::Send($bug->bug_id, $recipients); @EMAILS = (); my $revision = Bugzilla::Extension::PhabBugz::Revision->new({ id => 1, phid => 'PHID-DREV-uozm3ggfp7e7uoqegmc3', type => 'DREV', fields => { title => "title", summary => "the summary of the revision", status => {value => "not sure"}, dateCreated => time() - (60 * 60), dateModified => time() - (60 * 5), authorPHID => 'authorPHID', policy => {view => 'policy.view', edit => 'policy.edit',}, 'bugzilla.bug-id' => $bug->id, }, attachments => { projects => {projectPHIDs => []}, reviewers => {reviewers => [],}, subscribers => {subscriberPHIDs => [], subscriberCount => 1, viewerIsSubscribed => 1,} }, reviews => [{user => new_phab_user($bucky), status => 'accepted',}] }); my $PhabRevisionMock = mock 'Bugzilla::Extension::PhabBugz::Revision' => (override => [make_public => sub { }, update => sub { },]); my $PhabUserMock = mock 'Bugzilla::Extension::PhabBugz::User' => ( override => [ match => sub { my ($class, $query) = @_; if ($query && $query->{phids} && $query->{phids}[0]) { my $phid = $query->{phids}[0]; if ($phid eq 'authorPHID') { return [new_phab_user($steve, $phid)]; } } }, ] ); my $feed = Bugzilla::Extension::PhabBugz::Feed->new; my $changer = new_phab_user($bucky); @EMAILS = (); $feed->process_revision_change($revision, $changer, "story text"); # The first comment, and the comment made when the attachment is attached # are made by Steve. # The review comment is made by Bucky. my $sth = Bugzilla->dbh->prepare( "select profiles.login_name, thetext from longdescs join profiles on who = userid" ); $sth->execute; while (my $row = $sth->fetchrow_hashref) { if ($row->{thetext} =~ /first post/i) { is($row->{login_name}, $steve->login, 'first post author'); } elsif ($row->{thetext} =~ /the summary of the revision/i) { is($row->{login_name}, $steve->login, 'the first attachment comment'); } elsif ($row->{thetext} =~ /has approved the revision/i) { is($row->{login_name}, $bucky->login); } } diag Dumper(\@EMAILS); done_testing; sub new_phab_user { my ($bug_user, $phid) = @_; return Bugzilla::Extension::PhabBugz::User->new({ id => $bug_user->id * 1000, type => "USER", phid => $phid // "PHID-USER-" . ($bug_user->id * 1000), fields => { username => $bug_user->nick, realName => $bug_user->name, dateCreated => time() - 60 * 60 * 24, dateModified => time(), roles => [], policy => {view => 'view', edit => 'edit',}, }, attachments => { 'external-accounts' => {'external-accounts' => [{type => 'bmo', id => $bug_user->id,}]} } }); }