diff options
author | Dylan William Hardison <dylan@hardison.net> | 2018-08-26 07:55:24 +0200 |
---|---|---|
committer | Dylan William Hardison <dylan@hardison.net> | 2018-08-26 07:55:24 +0200 |
commit | 9263f397e701f25af395e8cdee48c87ee3327157 (patch) | |
tree | cc7f6b6beef8947090a108701ca34316a5c8edb8 /extensions/PhabBugz/t/basic.t | |
parent | 23b94e8410d90e9e15584d3a9220b6bb214f4220 (diff) | |
parent | d57aefa118802606ea7cc424aaa62173be9eec41 (diff) | |
download | bugzilla-9263f397e701f25af395e8cdee48c87ee3327157.tar.gz bugzilla-9263f397e701f25af395e8cdee48c87ee3327157.tar.xz |
Merge remote-tracking branch 'bmo/mojo'
Diffstat (limited to 'extensions/PhabBugz/t/basic.t')
-rw-r--r-- | extensions/PhabBugz/t/basic.t | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/extensions/PhabBugz/t/basic.t b/extensions/PhabBugz/t/basic.t new file mode 100644 index 000000000..9a6723ccb --- /dev/null +++ b/extensions/PhabBugz/t/basic.t @@ -0,0 +1,250 @@ +#!/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 ); +use Bugzilla; + +BEGIN { Bugzilla->extensions }; + +use Test::More; +use Test2::Tools::Mock; +use Data::Dumper; +use JSON::MaybeXS; +use Carp; +use Try::Tiny; + +use ok 'Bugzilla::Extension::PhabBugz::Feed'; +use ok 'Bugzilla::Extension::PhabBugz::Util', qw( get_attachment_revisions ); +can_ok('Bugzilla::Extension::PhabBugz::Feed', 'group_query'); + +our @group_members; +our @project_members; + + +my $User = mock 'Bugzilla::Extension::PhabBugz::User' => ( + add_constructor => [ + 'fake_new' => 'hash', + ], + override => [ + 'match' => sub { [ mock() ] }, + ], +); + +my $Feed = mock 'Bugzilla::Extension::PhabBugz::Feed' => ( + override => [ + get_group_members => sub { + return [ map { Bugzilla::Extension::PhabBugz::User->fake_new(%$_) } @group_members ]; + } + ] +); + +my $Project = mock 'Bugzilla::Extension::PhabBugz::Project' => ( + override_constructor => [ + new_from_query => 'ref_copy', + ], + override => [ + 'members' => sub { + return [ map { Bugzilla::Extension::PhabBugz::User->fake_new(%$_) } @project_members ]; + } + ] +); + +local Bugzilla->params->{phabricator_enabled} = 1; +local Bugzilla->params->{phabricator_api_key} = 'FAKE-API-KEY'; +local Bugzilla->params->{phabricator_base_uri} = 'http://fake.fabricator.tld'; + +my $Bugzilla = mock 'Bugzilla' => ( + override => [ + 'dbh' => sub { mock() }, + 'user' => sub { Bugzilla::User->new({ name => 'phab-bot@bmo.tld' }) }, + ], +); + +my $BugzillaGroup = mock 'Bugzilla::Group' => ( + add_constructor => [ + 'fake_new' => 'hash', + ], + override => [ + 'match' => sub { [ Bugzilla::Group->fake_new(id => 1, name => 'firefox-security' ) ] }, + ], +); + +my $BugzillaUser = mock 'Bugzilla::User' => ( + add_constructor => [ + 'fake_new' => 'hash', + ], + override => [ + 'new' => sub { + my ($class, $hash) = @_; + if ($hash->{name} eq 'phab-bot@bmo.tld') { + return $class->fake_new( id => 8_675_309, login_name => 'phab-bot@bmo.tld', realname => 'Fake PhabBot' ); + } + else { + } + }, + 'match' => sub { [ mock() ] }, + ], +); + + +my $feed = Bugzilla::Extension::PhabBugz::Feed->new; + +# Same members in both +do { + my $UserAgent = mock 'LWP::UserAgent' => ( + override => [ + 'post' => sub { + my ($self, $url, $params) = @_; + my $data = decode_json($params->{params}); + is_deeply($data->{transactions}, [], 'no-op'); + return mock({is_error => 0, content => '{}'}); + }, + ], + ); + local @group_members = ( + { phid => 'foo' }, + ); + local @project_members = ( + { phid => 'foo' }, + ); + $feed->group_query; +}; + +# Project has members not in group +do { + my $UserAgent = mock 'LWP::UserAgent' => ( + override => [ + 'post' => sub { + my ($self, $url, $params) = @_; + my $data = decode_json($params->{params}); + my $expected = [ { type => 'members.remove', value => ['foo'] } ]; + is_deeply($data->{transactions}, $expected, 'remove foo'); + return mock({is_error => 0, content => '{}'}); + }, + ] + ); + local @group_members = (); + local @project_members = ( + { phid => 'foo' }, + ); + $feed->group_query; +}; + +# Group has members not in project +do { + my $UserAgent = mock 'LWP::UserAgent' => ( + override => [ + 'post' => sub { + my ($self, $url, $params) = @_; + my $data = decode_json($params->{params}); + my $expected = [ { type => 'members.add', value => ['foo'] } ]; + is_deeply($data->{transactions}, $expected, 'add foo'); + return mock({is_error => 0, content => '{}'}); + }, + ] + ); + local @group_members = ( + { phid => 'foo' }, + ); + local @project_members = ( + ); + $feed->group_query; +}; + +do { + my $Revision = mock 'Bugzilla::Extension::PhabBugz::Revision' => ( + override => [ + 'update' => sub { 1 }, + ], + ); + my $UserAgent = mock 'LWP::UserAgent' => ( + override => [ + 'post' => sub { + my ($self, $url, $params) = @_; + if ($url =~ /differential\.revision\.search/) { + my $content = <<JSON; +{ + "error_info": null, + "error_code": null, + "result": { + "data": [ + { + "id": 9999, + "type": "DREV", + "phid": "PHID-DREV-uozm3ggfp7e7uoqegmc3", + "fields": { + "title": "Added .arcconfig", + "summary": "Added .arcconfig", + "authorPHID": "PHID-USER-4wigy3sh5fc5t74vapwm", + "dateCreated": 1507666113, + "dateModified": 1508514027, + "policy": { + "view": "public", + "edit": "admin" + }, + "bugzilla.bug-id": "23", + "status": { + "value": "needs-review", + "name": "Needs Review", + "closed": false, + "color.ansi": "magenta" + } + }, + "attachments": { + "reviewers": { + "reviewers": [] + }, + "subscribers": { + "subscriberPHIDs": [], + "subscriberCount": 0, + "viewerIsSubscribed": true + }, + "projects": { + "projectPHIDs": [] + } + } + } + ] + } +} +JSON + return mock { is_error => 0, content => $content }; + } + else { + return mock { is_error => 1, message => "bad request" }; + } + }, + ], + ); + my $Attachment = mock 'Bugzilla::Attachment' => ( + add_constructor => [ fake_new => 'hash' ], + ); + my $Bug = mock 'Bugzilla::Bug' => ( + add_constructor => [ fake_new => 'hash' ], + ); + my $bug = Bugzilla::Bug->fake_new( + bug_id => 23, + attachments => [ + Bugzilla::Attachment->fake_new( + mimetype => 'text/x-phabricator-request', + filename => 'phabricator-D9999-url.txt', + ), + ] + ); + + my $revisions = get_attachment_revisions($bug); + is(ref($revisions), 'ARRAY', 'it is an array ref'); + isa_ok($revisions->[0], 'Bugzilla::Extension::PhabBugz::Revision'); + is($revisions->[0]->bug_id, 23, 'Bugzila ID is 23'); + ok( try { $revisions->[0]->update }, 'update revision'); + +}; + +done_testing; |