from django.test import TestCase, RequestFactory

from django.contrib.auth.models import User, Group
from django.contrib.admin.sites import AdminSite
from personalni.admin import OsobaAdmin, udelej_orgem
# Tohle bude peklo, až jednou ty modely fakt rozstřelíme… Možná vyrobit various.all_models, které půjdou importovat jako m? :-)
import personalni.models as m

import logging
logger = logging.getLogger(__name__)

class DelaniOrguTest(TestCase):
	def setUp(self):
		# Admin musí mít instanci
		# Ref: https://www.argpar.se/posts/programming/testing-django-admin/
		adm_site = AdminSite()
		self.admin = OsobaAdmin(m.Osoba, adm_site)

		from django.contrib.messages.storage.cookie import CookieStorage
		self.request = RequestFactory().get('/admin')
		self.request._messages = CookieStorage(self.request)

		self.org_group = Group.objects.get(name='org')

		novy_user = User.objects.create(username='osoba')
		self.nova_osoba = m.Osoba.objects.create(
			jmeno='Milada',
			prijmeni='Von Kolej',
			user = novy_user,
			# Snad nic dalšího nepotřebujeme, kdyžtak se doplní…
			)
		stary_user = User.objects.create(username='stary_user')
		stara_osoba = m.Osoba.objects.create(user=stary_user)
		self.stary_org = m.Organizator.objects.create(osoba=stara_osoba)

	def test_pridani_orga(self):
		# Nejdřív to není org…
		self.assertFalse(m.Organizator.objects.filter(osoba=self.nova_osoba).exists())
		self.assertNotIn(self.org_group, self.nova_osoba.user.groups.all())
		self.assertFalse(self.nova_osoba.user.has_perm('auth.org'))
		self.assertFalse(self.nova_osoba.user.is_staff)

		# Pak orga uděláme…
		qs = m.Osoba.objects.filter(id=self.nova_osoba.id)
		udelej_orgem(self.admin, self.request, qs)

		# A pak už to org má být.
		self.nova_osoba.refresh_from_db()
		self.assertTrue(self.nova_osoba.user.is_staff)
		# FIXME: V db nejsou práva. Nový org je sice ve skupině "org", ale ta nemá právo "auth.org"
		# Očekávané řešení: dodat fixture, která to přidá.
		#self.assertTrue(self.nova_osoba.user.has_perm('auth.org'))
		self.assertIn(self.org_group, self.nova_osoba.user.groups.all())
		self.assertTrue(m.Organizator.objects.filter(osoba=self.nova_osoba).exists())
		novy_org = m.Organizator.objects.get(osoba=self.nova_osoba)
		self.assertIsNotNone(novy_org.organizuje_od)

	def test_pridani_stareho_orga(self):
		udelej_orgem(self.admin, self.request, m.Osoba.objects.filter(id=self.stary_org.osoba.id)) # Ugly
		# Když to spadne, tak jsem se to dozvěděl, takže už nepotřebuju nic kontrolovat.
		# Jestli to funguje správně má řešit jiný test.