#!perl
use strict;
no warnings;
use Test::More;
use AnyEvent::XMPP::TestClient;
use AnyEvent::XMPP::IM::Message;
use AnyEvent::XMPP::Util qw/bare_jid prep_bare_jid split_jid/;
my $cl =
AnyEvent::XMPP::TestClient->new_or_exit (
tests => 7, two_accounts => 1, finish_count => 2
);
my $C = $cl->client;
my ($src, $dest);
my $roster_push = 0;
my $received_subscribe = 0;
my $mutual_subscribe = 0;
my $subscriptions = 0;
my $unsubscriptions = 0;
my $dest_src_subs = '';
my $src_dest_subs = '';
sub jid_user($) { my ($u) = split_jid $_[0]; $u }
$C->reg_cb (
two_accounts_ready => sub {
my ($C) = @_;
$src = prep_bare_jid $cl->{jid};
$dest = prep_bare_jid $cl->{jid2};
$cl->{acc}->connection->get_roster ()->new_contact (
$cl->{jid2}, undef, "friend", sub {
my ($con, $err) = @_;
$roster_push = 1 if $con;
if ($con) {
$con->send_subscribe
}
});
},
contact_request_subscribe => sub {
my ($C, $acc, $roster, $contact) = @_;
if ($acc->bare_jid eq $dest) {
$received_subscribe = 1;
$contact->send_subscribed;
$contact->send_subscribe;
} elsif ($acc->bare_jid eq $src) {
$mutual_subscribe = 1;
$contact->send_subscribed;
}
},
contact_unsubscribed => sub {
my ($C, $acc, $roster, $contact) = @_;
$unsubscriptions++;
if ($contact->subscription eq 'from') {
$contact->send_unsubscribed;
}
$cl->finish;
},
contact_subscribed => sub {
my ($C, $acc, $roster, $contact) = @_;
$subscriptions++;
if ($acc->bare_jid eq $src) {
$dest_src_subs = prep_bare_jid ($contact->jid);
} else {
$src_dest_subs = prep_bare_jid ($contact->jid);
}
if ($subscriptions >= 2) {
$contact->send_unsubscribed;
}
}
);
$cl->wait;
ok ($roster_push, "roster push");
ok ($received_subscribe, "received subscription request");
ok ($mutual_subscribe, "mutual subscription ok");
is ($subscriptions, 2, "got two subscriptions");
is ($unsubscriptions, 2, "got two unsubscriptions");
is ($dest_src_subs, $dest, "destination subscribed to source");
is ($src_dest_subs, $src, "source subscribed to destination");