/*
* Copyright (C) 2011 Collabora Ltd.
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* Authors: Raul Gutierrez Segales
*
*/
using Folks;
using Gee;
public class AddPersonaTests : EdsTest.TestCase
{
private GLib.MainLoop _main_loop;
private IndividualAggregator _aggregator;
private string _persona_fullname;
private string _persona_nickname;
private string _email_1;
private Edsf.PersonaStore _pstore;
private bool _added_persona = false;
private HashTable _properties_found;
private string _avatar_path;
private string _im_addr_1;
private string _im_addr_2;
private string _phone_1;
private string _phone_1_type;
private string _phone_2;
private string _phone_2_type;
private PostalAddressFieldDetails _address;
private string _po_box = "12345";
private string _locality = "locality";
private string _postal_code = "code";
private string _street = "some street";
private string _extension = "some extension";
private string _country = "some country";
private string _region = "some region";
private string _family_name;
private string _given_name;
private string _note = "This is a note.";
private Individual _individual_received;
public AddPersonaTests ()
{
base ("AddPersonaTests");
this.add_test ("test adding a persona to e-d-s ", this.test_add_persona);
}
public void test_add_persona ()
{
this._main_loop = new GLib.MainLoop (null, false);
this._persona_fullname = "persona #1";
this._persona_nickname = "Jo";
this._email_1 = "someone-1@example.org";
this._avatar_path = Folks.TestUtils.get_source_test_data (
"data/avatar-01.jpg");
this._im_addr_1 = "someone-1@jabber.example.org";
this._im_addr_2 = "someone-2@jabber.example.org";
this._phone_1 = "12345";
this._phone_1_type = AbstractFieldDetails.PARAM_TYPE_HOME;
this._phone_2 = "54321";
this._phone_2_type = AbstractFieldDetails.PARAM_TYPE_OTHER;
this._family_name = "family";
this._given_name = "given";
var pa = new PostalAddress (this._po_box,
this._extension, this._street, this._locality, this._region,
this._postal_code, this._country, null, null);
this._address = new PostalAddressFieldDetails (pa);
this._address.add_parameter (AbstractFieldDetails.PARAM_TYPE,
AbstractFieldDetails.PARAM_TYPE_HOME);
this._properties_found = new HashTable
(str_hash, str_equal);
this._properties_found.insert ("full_name", false);
this._properties_found.insert ("nickname", false);
this._properties_found.insert ("email-1", false);
this._properties_found.insert ("avatar", false);
this._properties_found.insert ("im-addr-1", false);
this._properties_found.insert ("im-addr-2", false);
this._properties_found.insert ("phone-1", false);
this._properties_found.insert ("phone-2", false);
this._properties_found.insert ("postal-address-1", false);
this._properties_found.insert ("structured_name", false);
this._properties_found.insert ("note", false);
this._properties_found.insert ("birthday", false);
this._properties_found.insert ("role-1", false);
this._properties_found.insert ("is-favourite", false);
this._test_add_persona_async.begin ();
TestUtils.loop_run_with_timeout (this._main_loop);
foreach (var k in this._properties_found.get_values ())
{
assert (k);
}
}
private async void _test_add_persona_async ()
{
var store = BackendStore.dup ();
yield store.prepare ();
this._aggregator = IndividualAggregator.dup ();
this._aggregator.individuals_changed_detailed.connect
(this._individuals_changed_cb);
try
{
yield this._aggregator.prepare ();
this._pstore = null;
foreach (var backend in store.enabled_backends.values)
{
this._pstore =
(Edsf.PersonaStore) backend.persona_stores.get (
this.eds_backend.address_book_uid);
if (this._pstore != null)
break;
}
assert (this._pstore != null);
this._pstore.notify["is-prepared"].connect (this._notify_pstore_cb);
this._try_to_add ();
}
catch (GLib.Error e)
{
GLib.warning ("Error when calling prepare: %s\n", e.message);
}
}
private async void _add_persona ()
{
HashTable details = new HashTable
(str_hash, str_equal);
Value? v1 = Value (typeof (string));
v1.set_string (this._persona_fullname);
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) v1);
Value? v2 = Value (typeof (Set));
var emails = new HashSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
var email_1 = new EmailFieldDetails (this._email_1);
email_1.set_parameter (AbstractFieldDetails.PARAM_TYPE,
AbstractFieldDetails.PARAM_TYPE_HOME);
emails.add (email_1);
v2.set_object (emails);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) v2);
Value? v3 = Value (typeof (LoadableIcon));
var avatar = new FileIcon (File.new_for_path (this._avatar_path));
v3.set_object (avatar);
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.AVATAR),
(owned) v3);
Value? v4 = Value (typeof (MultiMap));
var im_fds = new HashMultiMap ();
im_fds.set ("jabber", new ImFieldDetails (this._im_addr_1));
im_fds.set ("yahoo", new ImFieldDetails (this._im_addr_2));
v4.set_object (im_fds);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.IM_ADDRESSES), v4);
Value? v5 = Value (typeof (Set));
var phones = new HashSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
var phone_1 = new PhoneFieldDetails (this._phone_1);
phone_1.set_parameter (AbstractFieldDetails.PARAM_TYPE,
this._phone_1_type);
phones.add (phone_1);
var phone_2 = new PhoneFieldDetails (this._phone_2);
phone_2.set_parameter (AbstractFieldDetails.PARAM_TYPE,
this._phone_2_type);
phones.add (phone_2);
v5.set_object (phones);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.PHONE_NUMBERS),
(owned) v5);
Value? v6 = Value (typeof (Set));
var pa_fds = new HashSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
PostalAddress pa_a = new PostalAddress (this._po_box,
this._extension, this._street, this._locality, this._region,
this._postal_code, this._country, null, null);
var pa_fd_a = new PostalAddressFieldDetails (pa_a);
pa_fd_a.add_parameter (AbstractFieldDetails.PARAM_TYPE,
AbstractFieldDetails.PARAM_TYPE_HOME);
pa_fds.add (pa_fd_a);
v6.set_object (pa_fds);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.POSTAL_ADDRESSES),
(owned) v6);
Value? v7 = Value (typeof (StructuredName));
StructuredName sname = new StructuredName (this._family_name,
this._given_name, null, null, null);
v7.set_object (sname);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.STRUCTURED_NAME),
(owned) v7);
Value? v8 = Value (typeof (Set));
var notes = new HashSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
var note = new NoteFieldDetails (this._note);
notes.add (note);
v8.set_object (notes);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.NOTES),
(owned) v8);
Value? v9 = Value (typeof (DateTime));
DateTime dobj = new DateTime.local (1980, 1, 1, 0, 0, 0.0).to_utc ();
v9.set_boxed (dobj);
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.BIRTHDAY),
(owned) v9);
Value? v10 = Value (typeof (Set));
var role_fds = new HashSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
var r1 = new Role ("Dr.", "The Nut House Ltd");
r1.role = "The Manager";
var role_fd1 = new RoleFieldDetails (r1);
role_fds.add (role_fd1);
v10.set_object (role_fds);
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.ROLES),
(owned) v10);
Value? v11 = Value (typeof (bool));
v11.set_boolean (true);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.IS_FAVOURITE),
(owned) v11);
Value? v12 = Value (typeof (string));
v12.set_string (this._persona_nickname);
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.NICKNAME),
(owned) v12);
try
{
yield this._aggregator.add_persona_from_details (null,
this._pstore, details);
}
catch (Folks.IndividualAggregatorError e)
{
GLib.warning ("[AddPersonaError] add_persona_from_details: %s\n",
e.message);
}
}
private void _individuals_changed_cb (
MultiMap changes)
{
var added = changes.get_values ();
var removed = changes.get_keys ();
uint num_replaces = 0;
foreach (var i in added)
{
if (i == null)
{
continue;
}
num_replaces = this._track_individual (i);
}
assert (removed.size <= num_replaces + 1);
}
private uint _track_individual (Individual i)
{
uint retval = 0;
if (i.is_user == false)
{
/* we assume that there will be exactly one (unique) individual
* received */
assert (this._individual_received == null ||
this._individual_received.id == i.id);
/* handle replacement */
if (this._individual_received != null)
{
i.notify["full-name"].disconnect (this._notify_cb);
i.notify["nickname"].disconnect (this._notify_cb);
i.notify["email-addresses"].disconnect (this._notify_cb);
i.notify["avatar"].disconnect (this._notify_cb);
i.notify["im-addresses"].disconnect (this._notify_cb);
i.notify["phone-numbers"].disconnect (this._notify_cb);
i.notify["postal-addresses"].disconnect (this._notify_cb);
i.notify["structured-name"].disconnect (this._notify_cb);
i.notify["notes"].disconnect (this._notify_cb);
i.notify["birthday"].disconnect (this._notify_cb);
i.notify["roles"].disconnect (this._notify_cb);
i.notify["is-favourite"].disconnect (this._notify_cb);
this._properties_found.remove_all ();
}
this._individual_received = i;
retval++;
i.notify["full-name"].connect (this._notify_cb);
i.notify["nickname"].connect (this._notify_cb);
i.notify["email-addresses"].connect (this._notify_cb);
i.notify["avatar"].connect (this._notify_cb);
i.notify["im-addresses"].connect (this._notify_cb);
i.notify["phone-numbers"].connect (this._notify_cb);
i.notify["postal-addresses"].connect (this._notify_cb);
i.notify["structured-name"].connect (this._notify_cb);
i.notify["notes"].connect (this._notify_cb);
i.notify["birthday"].connect (this._notify_cb);
i.notify["roles"].connect (this._notify_cb);
i.notify["is-favourite"].connect (this._notify_cb);
this._check_properties.begin (i);
}
return retval;
}
private void _notify_cb (Object individual_obj, ParamSpec ps)
{
Folks.Individual i = (Folks.Individual) individual_obj;
this._check_properties.begin (i);
}
private void _notify_pstore_cb (Object _pstore, ParamSpec ps)
{
this._try_to_add ();
}
private void _try_to_add ()
{
lock (this._added_persona)
{
if (this._pstore.is_prepared &&
this._added_persona == false)
{
this._added_persona = true;
this._add_persona.begin ();
}
}
}
private async void _check_properties (Individual i)
{
if (i.full_name == this._persona_fullname)
this._properties_found.replace ("full_name", true);
if (i.nickname == this._persona_nickname)
{
this._properties_found.replace ("nickname", true);
}
foreach (var e in i.email_addresses)
{
if (e.value == this._email_1)
{
this._properties_found.replace ("email-1", true);
}
}
foreach (var proto in i.im_addresses.get_keys ())
{
var im_fds = i.im_addresses.get (proto);
foreach (var im_fd in im_fds)
{
if (im_fd.value == this._im_addr_1)
this._properties_found.replace ("im-addr-1", true);
else if (im_fd.value == this._im_addr_2)
this._properties_found.replace ("im-addr-2", true);
}
}
foreach (var phone_fd in i.phone_numbers)
{
var phone_1 = new PhoneFieldDetails (this._phone_1);
phone_1.set_parameter (AbstractFieldDetails.PARAM_TYPE,
this._phone_1_type);
var phone_2 = new PhoneFieldDetails (this._phone_2);
phone_2.set_parameter (AbstractFieldDetails.PARAM_TYPE,
this._phone_2_type);
if (phone_fd.equal (phone_1))
{
this._properties_found.replace ("phone-1", true);
}
else if (phone_fd.equal (phone_2))
{
this._properties_found.replace ("phone-2", true);
}
}
foreach (var pa_fd in i.postal_addresses)
{
this._address.id = pa_fd.id;
if (pa_fd.equal (this._address))
this._properties_found.replace ("postal-address-1", true);
}
if (i.structured_name != null &&
i.structured_name.family_name == this._family_name &&
i.structured_name.given_name == this._given_name)
this._properties_found.replace ("structured_name", true);
foreach (var note in i.notes)
{
if (note.equal (new NoteFieldDetails (this._note)))
{
this._properties_found.replace ("note", true);
break;
}
}
if (i.avatar != null)
{
var b = new FileIcon (File.new_for_path (this._avatar_path));
var same = yield TestUtils.loadable_icons_content_equal (b, i.avatar,
-1);
if (same)
this._properties_found.replace ("avatar", true);
}
if (i.birthday != null)
{
DateTime dobj = new DateTime.local (1980, 1, 1, 0, 0, 0.0).to_utc ();
if (i.birthday.equal (dobj))
this._properties_found.replace ("birthday", true);
}
foreach (var role_fd in i.roles)
{
var r1 = new Role ("Dr.", "The Nut House Ltd");
r1.role = "The Manager";
var role_fd_expected = new RoleFieldDetails (r1);
if (role_fd.equal (role_fd_expected))
this._properties_found.replace ("role-1", true);
}
if (i.is_favourite)
{
this._properties_found.replace ("is-favourite", true);
}
this._exit_if_all_properties_found ();
}
private void _exit_if_all_properties_found ()
{
foreach (var k in this._properties_found.get_keys ())
{
var v = this._properties_found.lookup (k);
if (v == false)
return;
}
this._main_loop.quit ();
}
}
public int main (string[] args)
{
Test.init (ref args);
var tests = new AddPersonaTests ();
tests.register ();
Test.run ();
tests.final_tear_down ();
return 0;
}