# encoding: utf-8 from django.db import IntegrityError from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse from django.test import TestCase from datetime import date from .models import Oficio from .serializers import OficioSerializer class OficioModelTest(TestCase): def setUp(self): self.oficio_1 = Oficio.objects.create( folio=1, no_oficio='PRUEBADGTIC/0001/2014', asunto='Oficio de Prueba', fecha_oficio=date.today().isoformat(), propietario_id=1 ) self.oficio_2 = Oficio.objects.create( folio=2, no_oficio='PRUEBADGTIC/0002/2014', asunto='Oficio de Prueba', fecha_oficio=date.today().isoformat(), propietario_id=1 ) def test_salvar_y_listar_oficios(self): oficios_guardados = Oficio.objects.all() self.assertEqual(oficios_guardados.count(), 2) oficio_guardado_1 = oficios_guardados.get(folio=1) oficio_guardado_2 = oficios_guardados.get(folio=2) self.assertEqual(oficio_guardado_1, self.oficio_1) self.assertEqual(oficio_guardado_2, self.oficio_2) def test_oficios_orden_descendente_por_no_folio(self): oficios_guardados = Oficio.objects.all() self.assertEqual(oficios_guardados[0], self.oficio_2) self.assertEqual(oficios_guardados[1], self.oficio_1) # FIXME no realizar este test, por lo pronto. # def test_no_folio_unico_por_usuario(self): # print('folio_oficio1', self.oficio_1.folio) # with self.assertRaisesRegexp(IntegrityError, "oficios_oficio_folio"): # Oficio.objects.create( # folio=1, # no_oficio='PRUEBADGTIC/0003/2014', # asunto='Oficio de Prueba', # fecha_oficio=date.today().isoformat(), # propietario_id=1 # ) def test_no_oficio_unico(self): with self.assertRaisesRegexp(IntegrityError, "oficios_oficio_no_oficio"): Oficio.objects.create( folio=3, no_oficio='PRUEBADGTIC/0001/2014', asunto='Oficio de Prueba', fecha_oficio=date.today().isoformat(), propietario_id=1 ) def test_oficios_valida_respuesta_oficio(self): with self.assertRaisesMessage(ValidationError, 'Debe especificar el oficio al que se responde'): oficio = Oficio( folio=3, no_oficio='PRUEBADGTIC/0003/2014', asunto='Oficio de Prueba', fecha_oficio=date.today().isoformat(), propietario_id=1, es_respuesta=True ) oficio.clean() def test_oficios_valida_fecha_resolucion(self): with self.assertRaisesMessage(ValidationError, 'Debe especificar la fecha limite de resolucion'): oficio = Oficio( folio=3, no_oficio='PRUEBADGTIC/0003/2014', asunto='Oficio de Prueba', fecha_oficio=date.today().isoformat(), propietario_id=1, requiere_atencion=True ) oficio.clean() def test_oficios_string_muestra_num_oficio(self): self.assertEqual(str(self.oficio_1), self.oficio_1.no_oficio) def test_oficio_url_absoluta(self): self.assertEqual(self.oficio_1.get_absolute_url(), reverse('oficios:oficio-detail', kwargs={'pk': self.oficio_1.id})) class OficioSerializerTest(TestCase): """ Tratar de migrar todas las vistas que listen modelos para que utilicen el serializer que este test prueba. Esto conlleva nutrir el test. """ # No activar, por ahora... # def test_serializer_no_requiere_propietario_ni_archivo_al_validar(self): # """ # Esto es con el fin de poder guardar anunecias. # """ # # Se crea un diccionario sin especificar archivo ni propietario # data = { # 'id': 1, # 'folio': 123, # 'no_oficio': 'SA/123/2014', # 'asunto': 'Solicitud de Dicatamen Tecnico', # 'descripcion': 'Anuencia de prueba', # 'fecha_oficio': date.today().isoformat(), # 'prioridad': 0 # } # serializer = OficioSerializer(data=data) # self.assertTrue(serializer.is_valid(), serializer.errors) def test_serializer_valida_campos(self): """ AquĆ­ se asegura de generar los campos necesarios para los usos de esta api. """ serializer = OficioSerializer() self.assertTrue(serializer.fields['folio']) self.assertTrue(serializer.fields['no_oficio']) self.assertTrue(serializer.fields['asunto']) self.assertTrue(serializer.fields['archivo']) self.assertTrue(serializer.fields['archivo_tipo']) self.assertTrue(serializer.fields['anexo']) self.assertTrue(serializer.fields['anexo_tipo']) self.assertTrue(serializer.fields['prioridad']) self.assertTrue(serializer.fields['prioridad_color']) self.assertTrue(serializer.fields['DT_RowId']) class OficiosRecibidosViewTest(TestCase): fixtures = [ 'usuarios.json' ] view_url = reverse('oficios:oficios-recibidos') def test_solicita_login(self): r = self.client.get(self.view_url) self.assertRedirects(r, '/login/?next=/oficios/inbox/') login = self.client.login( username='dgtic', password='dgtic' ) self.assertTrue(login) r = self.client.get(self.view_url) self.assertContains(r, 'Recibidos')