import unittest

import time

import lib
lib.setup_env()

from data import *

from mock import Mock, expectParams
from mocks import *

from common import gajim
from common import zeroconf
import roster_window

gajim.get_jid_from_account = lambda acc: 'myjid@' + acc

class TestRosterWindow(unittest.TestCase):

	def setUp(self):
		gajim.interface = MockInterface()
		self.roster = roster_window.RosterWindow()

		# Please unuglify :-)
		self.C_NAME = roster_window.C_NAME
		self.C_TYPE = roster_window.C_TYPE
		self.C_JID = roster_window.C_JID
		self.C_ACCOUNT = roster_window.C_ACCOUNT

		# Add after creating the window
		# We want to test the filling explicitly
		for acc in contacts:
			gajim.connections[acc] = MockConnection(acc)

	def tearDown(self):
		self.roster.model.clear()
		for acc in contacts:
			gajim.contacts.clear_contacts(acc)

	# Custom assertions
	def assert_all_contacts_are_in_roster(self, acc):
		for jid in contacts[acc]:
			self.assert_contact_is_in_roster(jid, acc)

	def assert_contact_is_in_roster(self, jid, account):
		contacts = gajim.contacts.get_contacts(account, jid)
		# check for all resources
		for contact in contacts:
			iters = self.roster._get_contact_iter(
				jid, account, model=self.roster.model)
			self.assertTrue(len(iters) == len(contact.get_shown_groups()),
				msg='Contact is not in all his groups')

			# check for each group tag
			for titerC in iters:
				self.assertTrue(self.roster.model.iter_is_valid(titerC),
					msg='Contact iter invalid')

				c_model = self.roster.model[titerC]
				self.assertEquals(contact.get_shown_name(), c_model[self.C_NAME],
					msg='Contact name missmatch')
				self.assertEquals(contact.jid, c_model[self.C_JID],
					msg='Jid missmatch')

				if not self.roster.regroup:
					self.assertEquals(account, c_model[self.C_ACCOUNT],
						msg='Account missmatch')
				# TODO: Is our parent correct? (group or big b)

	def assert_group_is_in_roster(self, group, account):
		#TODO
		pass

	def assert_account_is_in_roster(self, acc):
		titerA = self.roster._get_account_iter(acc, model=self.roster.model)
		self.assertTrue(self.roster.model.iter_is_valid(titerA),
			msg='Account iter is invalid')

		acc_model = self.roster.model[titerA]
		self.assertEquals(acc_model[self.C_TYPE], 'account',
			msg='No account found')

		if not self.roster.regroup:
			self.assertEquals(acc_model[self.C_ACCOUNT], acc,
				msg='Account not found')

			self_jid = gajim.get_jid_from_account(acc)
			self.assertEquals(acc_model[self.C_JID], self_jid,
				msg='Account JID not found in account row')

	def assert_model_is_in_sync(self):
		#TODO: check that iter_n_children returns the correct numbers
		pass

	# tests
	def test_fill_contacts_and_groups_dicts(self):
		for acc in contacts:
			self.roster.fill_contacts_and_groups_dicts(contacts[acc], acc)

			for jid in contacts[acc]:
				instances = gajim.contacts.get_contacts(acc, jid)

				# Created a contact for each single jid?
				self.assertTrue(len(instances) == 1)

				# Contacts kept their info
				contact = instances[0]
				self.assertEquals(contact.groups, contacts[acc][jid]['groups'],
					msg='Group Missmatch')

				groups = contacts[acc][jid]['groups'] or ['General',]

		# cleanup
		self.roster.model.clear()
		for acc in contacts:
			gajim.contacts.clear_contacts(acc)

	def test_fill_roster_model(self):
		for acc in contacts:
			self.roster.fill_contacts_and_groups_dicts(contacts[acc], acc)

			self.roster.add_account(acc)
			self.assert_account_is_in_roster(acc)

			self.roster.add_account_contacts(acc)
			self.assert_all_contacts_are_in_roster(acc)

		self.assert_model_is_in_sync()


class TestRosterWindowRegrouped(TestRosterWindow):

	def setUp(self):
		gajim.config.set('mergeaccounts', True)
		TestRosterWindow.setUp(self)

	def test_toggle_regroup(self):
		self.roster.regroup = not self.roster.regroup
		self.roster.setup_and_draw_roster()
		self.roster.regroup = not self.roster.regroup
		self.roster.setup_and_draw_roster()


class TestRosterWindowMetaContacts(TestRosterWindowRegrouped):

	def test_receive_metacontact_data(self):
		for complete_data in metacontact_data:
			t_acc = complete_data[0]['account']
			t_jid = complete_data[0]['jid']
			data = complete_data[1:]
			for brother in data:
				acc = brother['account']
				jid = brother['jid']
				gajim.contacts.add_metacontact(t_acc, t_jid, acc, jid)
		self.roster.setup_and_draw_roster()

	def test_connect_new_metacontact(self):
		self.test_fill_roster_model()

		jid = u'coolstuff@gajim.org'
		contact = gajim.contacts.create_contact(jid)
		gajim.contacts.add_contact(account1, contact)
		self.roster.add_contact(jid, account1)
		self.roster.chg_contact_status(contact, 'offline', '', account1)

		gajim.contacts.add_metacontact(account1, u'samejid@gajim.org',
			account1, jid)
		self.roster.chg_contact_status(contact, 'online', '', account1)

		self.assert_model_is_in_sync()



if __name__ == '__main__':
	unittest.main()

# vim: se ts=3: