Skip to content

Commit 8543823

Browse files
Trabajando en issue #11, arreglando modAsociaciones
1 parent 1e18b08 commit 8543823

File tree

3 files changed

+158
-73
lines changed

3 files changed

+158
-73
lines changed

SMS-Back-End/microservicio1/APIDB/DBCreator_v0_1.sql

+3-3
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ CREATE TABLE Clase(
7979
#Un grupo es la asociación de una asignatura y un curso, por ejemplo: 1ºESO-Francés que identifica perfectamente un grupo de alumnos.
8080
CREATE TABLE Asocia(
8181

82+
id_clase INT ,
8283
id_asignatura INT,
83-
id_clase INT,
8484

8585
#Especificamos que se trata de claves foráneas (claves primarias de otras tablas)
86-
FOREIGN KEY (id_asignatura) REFERENCES Asignatura(id),
8786
FOREIGN KEY (id_clase) REFERENCES Clase(id),
87+
FOREIGN KEY (id_asignatura) REFERENCES Asignatura(id),
8888

8989
#Especificamos la formación de la clave primaria en esta tabla.
90-
PRIMARY KEY (id_asignatura, id_clase)
90+
PRIMARY KEY (id_clase, id_asignatura)
9191

9292
);
9393

SMS-Back-End/microservicio1/APIDB/GestorAsociacionesSQL.py

+23-22
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#Uso de variables generales par la conexión a la BD.
1414
import dbParams
1515
#Variable global de para act/desactivar el modo verbose para imprimir mensajes en terminal.
16-
v=0
16+
v=1
1717

1818
'''Clase controladora de Asociacions. Que usando la clase que define el modelo de Asociacion (la info en BD que de el se guarda)
1919
ofrece una interface de gestión que simplifica y abstrae el uso.
@@ -24,15 +24,16 @@ class GestorAsociaciones:
2424
"""
2525

2626
@classmethod
27-
def nuevaAsociacion(self, id_asignatura, id_curso):
27+
def nuevaAsociacion(self, id_clase, id_asignatura):
28+
'''Introduce entidades en la tabla Asocia'''
2829

2930
db = MySQLdb.connect(dbParams.host, dbParams.user, dbParams.password, dbParams.db)
3031

3132
#Añadimos al principio y al final una comilla simple a todos los elementos.
3233
id_asignatura='\''+id_asignatura+'\''
33-
id_curso='\''+id_curso+'\''
34+
id_clase='\''+id_clase+'\''
3435

35-
query="INSERT INTO Asocia VALUES("+id_asignatura+","+id_curso+");"
36+
query="INSERT INTO Asocia VALUES("+id_clase+","+id_asignatura+");"
3637
if v:
3738
print '\n'+query
3839
cursor = db.cursor()
@@ -62,12 +63,15 @@ def nuevaAsociacion(self, id_asignatura, id_curso):
6263
return 'OK'
6364
if salida==1062:
6465
return 'Elemento duplicado'
65-
if salida=='1452':
66+
if salida==1452:
6667
return 'Alguno de los elementos no existe'
6768

6869

6970
@classmethod
7071
def getAsociaciones(self):
72+
'''
73+
Devuelve una lista simplificada de todas las asociaciones dadas de alta en el sistema.
74+
'''
7175
db = MySQLdb.connect(dbParams.host, dbParams.user, dbParams.password, dbParams.db)
7276
cursor = db.cursor()
7377

@@ -89,7 +93,7 @@ def getAsociaciones(self):
8993
asociacion.id_asignatura=row[0]
9094
asociacion.id_curso=row[1]
9195

92-
lista.append(curso)
96+
lista.append(asociacion)
9397
#print row[0], row[1]
9498
row = cursor.fetchone()
9599

@@ -101,17 +105,17 @@ def getAsociaciones(self):
101105
#Una de las opciones es convertirlo en un objeto y devolverlo
102106

103107
@classmethod
104-
def getAsociacion(self, id_asignatura, id_curso):
108+
def getAsociacion(self, id_clase, id_asignatura):
105109
"""
106110
Recupera TODA la información de un Asociacion en concreto a través de la clave primaria, su id.
107111
"""
108112
db = MySQLdb.connect(dbParams.host, dbParams.user, dbParams.password, dbParams.db)
109113
cursor = db.cursor()
110114

115+
id_clase='\''+id_clase+'\''
111116
id_asignatura='\''+id_asignatura+'\''
112-
id_curso='\''+id_curso+'\''
113117

114-
query="select * from Asocia where id_asignatura="+id_asignatura+" and id_curso="+id_curso+";"
118+
query="select * from Asocia where id_clase="+id_clase+" and id_asignatura="+id_asignatura+";"
115119
if v:
116120
print '\n'+query
117121
try:
@@ -127,6 +131,9 @@ def getAsociacion(self, id_asignatura, id_curso):
127131
except IndexError:
128132
print "MySQL Error: %s" % str(e)
129133

134+
if v:
135+
print "Salida MySQL: "+str(salida)
136+
130137
cursor.close()
131138
db.close()
132139

@@ -141,34 +148,30 @@ def getAsociacion(self, id_asignatura, id_curso):
141148
if salida==0:
142149
return 'Elemento no encontrado'
143150

144-
'''
151+
145152
@classmethod
146-
def modAsociacion(self, id_asignatura, id_curso, campoACambiar, nuevoValor):
153+
def modAsociacion(self, id_asignatura, id_clase, campoACambiar, nuevoValor):
147154
"""
148155
Esta función permite cambiar cualquier atributo de una Asociacion.
149156
Parámetros:
150157
campoACambiar: nombre del atributo que se quiere cambiar
151158
nuevoValor: nuevo valor que se quiere guardar en ese campo.
152-
153159
Este caso puede ser delicado al tener sólo dos atributos y ambos ser claves foráneas. Por eso no permitiremos que
154160
se haga, para modificar la relación antes tendremos que destruirla y volverla a crear.
155-
156161
"""
157-
db = MySQLdb.connect(host="localhost", user="root", passwd="root", db="smm"); #La conexión está clara.
162+
db = MySQLdb.connect(host="localhost", user="root", passwd="root", db="sms"); #La conexión está clara.
158163
nuevoValor='\''+nuevoValor+'\''
159164
id_asignatura='\''+id_asignatura+'\''
160-
id_curso='\''+id_curso+'\''
161-
162-
query="UPDATE Asocia SET "+campoACambiar+"="+nuevoValor+" WHERE id_asignatura="+id_asignatura+" and id_curso="+id_curso+";"
165+
id_clase='\''+id_clase+'\''
166+
query="UPDATE Asocia SET "+campoACambiar+"="+nuevoValor+" WHERE id_asignatura="+id_asignatura+" and id_clase="+id_clase+";"
163167
if v:
164168
print '\n'+query
165-
166169
cursor = db.cursor()
167170
salida =''
168171
'''
169172
#Como la ejecución de esta consulta (query) puede producir excepciones como por ejemplo que el Asociacion con clave
170173
#que estamos pasando ya exista tendremos que tratar esas excepciones y conformar una respuesta entendible.
171-
'''
174+
'''
172175
try:
173176
salida = cursor.execute(query);
174177
except MySQLdb.Error, e:
@@ -179,19 +182,17 @@ def modAsociacion(self, id_asignatura, id_curso, campoACambiar, nuevoValor):
179182
salida=e.args[0]
180183
except IndexError:
181184
print "MySQL Error: %s" % str(e)
182-
183185
#Efectuamos los cambios
184186
db.commit()
185187
cursor.close()
186188
db.close()
187-
188189
if salida==1:
189190
return 'OK'
190191
elif salida==1062:
191192
return 'Elemento duplicado'
192193
elif salida==0:
193194
return 'Elemento no encontrado'
194-
'''
195+
195196
@classmethod
196197
def delAsociacion(self, id_asignatura, id_curso):
197198
db = MySQLdb.connect(host="localhost", user="root", passwd="root", db="smm"); #La conexión está clara.

SMS-Back-End/microservicio1/APIDB/test/testUnitario.py

+132-48
Original file line numberDiff line numberDiff line change
@@ -449,43 +449,118 @@ def test_36_NumeroClases(self):
449449

450450
### RELACIONES, (entre entidades u otras relaciones), como Matricula, Asocia... ###
451451

452+
class TestRelacionAsocia(unittest.TestCase):
453+
'''
454+
Comprobación de las operaciones CRUD sobre la tabla Asocia que relaciona las entidades Curso y Asignatura de la BD.
455+
'''
456+
#Los métodos, por convención empiezan por la palabra test, representando que métodos componen el test.
457+
def test_41_InserccionRelacionAsocia(self):
458+
'''
459+
Comprueba el método nuevaClase del gestor GestorAsociacionesSQL.py
460+
'''
461+
#Nos aseguramos de que la base de datos se encuentra en estado CERO creándola en el momento.
462+
os.system('mysql -u root -p\'root\' < ../DBCreator_v0_1.sql')
463+
#Preparamos las variables
464+
testA=testB=testC=False;
452465

453-
if False:
466+
#1. Insertamos una asociacion en la base de datos y comprobamos que la salida es 'OK'
467+
#Primero creamos una clase.
468+
GestorClases.nuevaClase('1','A','ESO')
469+
#Después creamos una asignatura:
470+
GestorAsignaturas.nuevaAsignatura('frances')
471+
#Usamos ambos ides (1 y 1 porque se acaban de introducir y son autoincrementables) para relacionarlos.
472+
if GestorAsociaciones.nuevaAsociacion('1','1') == 'OK':
473+
testA=True
474+
else:
475+
testA=False
454476

455-
### RELACIONES ###
477+
#2. Comprobamos que no podemos introducir una asociación entre una Clase y una Asignatura si alguna de las dos
478+
# no existe previamente (por las foreing keys)
479+
print "GestorAsociaciones"+str(GestorAsociaciones.nuevaAsociacion('1','2'))
480+
if GestorAsociaciones.nuevaAsociacion('1','2') == 'Alguno de los elementos no existe':
481+
testB=True
482+
else:
483+
testB=False
484+
485+
#3. Comprobamos que insertar una asociació que ya existe nos da un error.
486+
print GestorAsociaciones.nuevaAsociacion('1','1')
487+
if GestorAsociaciones.nuevaAsociacion('1','1') == 'Elemento duplicado':
488+
testC=True
489+
else:
490+
testC=False
491+
492+
self.assertEqual(testA and testB and testC, True)
493+
494+
495+
def test_42_LecturaRelacionesAsocia(self):
496+
'''Recupera la lista de todas las asociaciones (Clase-Asignatura) almacenadas en la base de datos.'''
497+
os.system('mysql -u root -p\'root\' < ../DBCreator_v0_1.sql')
498+
#Creamos una clase
499+
GestorClases.nuevaClase('1','A','ESO')
500+
#Después creamos dos asignaturas:
501+
GestorAsignaturas.nuevaAsignatura('frances')
502+
GestorAsignaturas.nuevaAsignatura('lengua')
503+
GestorAsociaciones.nuevaAsociacion('1','1')
504+
GestorAsociaciones.nuevaAsociacion('1','2')
505+
506+
self.assertEqual(len(GestorAsociaciones.getAsociaciones()),2)
507+
508+
509+
def test_43_LecturaAsociacion(self):
510+
''' Comprobación de la lectura correcta de una asociacion concreta'''
511+
os.system('mysql -u root -p\'root\' < ../DBCreator_v0_1.sql')
512+
#Damos de alta una clase
513+
GestorClases.nuevaClase('1','A','ESO')
514+
#Después creamos dos asignaturas:
515+
GestorAsignaturas.nuevaAsignatura('frances')
516+
GestorAsociaciones.nuevaAsociacion('1','1')
517+
518+
if GestorClases.getClase('1') != 'Elemento no encontrado' and GestorClases.getClase('2') == 'Elemento no encontrado':
519+
test=True
520+
else:
521+
test=False
522+
523+
self.assertEqual(test, True)
524+
525+
def test_44_ModificacionAsociacion(self):
526+
'''Comprobación de como cualquier atributo de una asociación puede modificarse, método modAsociacion de GestorAsociacionesSQL.py'''
527+
#Nos aseguramos de que la base de datos se encuentra en estado CERO creándola en el momento.
528+
os.system('mysql -u root -p\'root\' < ../DBCreator_v0_1.sql')
529+
#Preparamos las variables
530+
testA=testB=testC=False;
531+
532+
#Creamos una asociación:
533+
GestorClases.nuevaClase('1','A','ESO')
534+
GestorAsignaturas.nuevaAsignatura('frances')
535+
GestorAsignaturas.nuevaAsignatura('ingles')
536+
#Relacionamos la clase con la primera asignatura.
537+
GestorAsociaciones.nuevaAsociacion('1','1')
538+
539+
#1. Modificamos la asignatura de la asociación por la asignatura 2
540+
if GestorAsociaciones.modAsociacion('1','1','id_asignatura', '2') == 'OK':
541+
testA=True
456542

457-
class TestRelacionAsocia(unittest.TestCase):
543+
544+
#Intentamos asociar una clase con una asignatura que no existe (la asignatura con id 3, inexistente):
545+
#if GestorAsociaciones.modAsociacion('1','1','id_asignatura', '3') == 'Elemento no encontrado':
546+
# testB=True
547+
548+
549+
#Comprobamos que si realizamos una modificación que da lugar a una asociacioón que ya existe lo detecta.
458550
'''
459-
Comprobación de las operaciones CRUD sobre la tabla Asocia que relaciona las entidades Curso y Asignatura de la BD.
551+
#Creamos una nueva clase
552+
GestorClases.nuevaClase('1','A','ESO') #LA anterior quedó como 1ABACH
553+
#Intentamos cambiar un parámetro quedando como tra existente, debe de dar Elemento duplicado como error.
554+
if GestorClases.modClase('2', 'nivel', 'BACH') == 'Elemento duplicado':
555+
testC=True #El error se da.
460556
'''
461557

558+
#Comprobamos que el nombre ha sido cambiado.
559+
self.assertEqual(testA, True)
462560

463-
#Los métodos, por convención empiezan por la palabra test, representando que métodos componen el test.
464-
def test_41_InserccionRelacionAsocia(self):
465-
#Creamos una asignatura
466-
salidaA=GestorAsignaturas.nuevaAsignatura('fr','Frances')
467-
if salidaA=='OK':
468-
salidaA=True
469-
else:
470-
salidaA=False
471561

472-
#Creamos un curso
473-
salidaB=GestorCursos.nuevoCurso('curso','1','A','ESO')
474-
if salidaB=='OK':
475-
salidaB=True
476-
else:
477-
salidaB=False
478-
#Testeamos la creación de la asociación
479-
salidaC=GestorAsociaciones.nuevaAsociacion('fr','curso')
480-
if salidaC=='OK':
481-
salidaC=True
482-
else:
483-
salidaC=False
484-
485-
self.assertEqual(salidaA and salidaB and salidaC, True)
486562

487-
def test_42_LecturaRelacionAsocia(self):
488-
self.assertNotEqual(GestorAsociaciones.getAsociacion('fr','curso'),'Elemento no encontrado')
563+
if 0:
489564
'''
490565
def test_43_ModificacionRelacionAsocia(self):
491566
#Intentamos modificar el cambio de la asociación de un curso a una asignatura
@@ -506,27 +581,36 @@ def test_44_EliminacionRelacionAsocia(self):
506581
self.assertEqual(salida,'OK')
507582

508583

509-
def test_45_AlumnosMAtriculadosEnUnaAsignaturaYCurso(self):
510-
aprovisionadorDBconInterfaz.aprovisiona()
511-
sizeA=len(GestorAsociaciones.getAlumnos('mt','1AESO'))
512-
sizeB=len(GestorAsociaciones.getAlumnos('fr','1AESO'))
513-
sizeC=len(GestorAsociaciones.getAlumnos('mt','1BESO'))
514-
os.system('mysql -u root -p\'root\' < ../DBCreator_v0.sql')
515-
salida=False
516-
if sizeA==1 and sizeB==3 and sizeC==3:
517-
salida=True
518-
self.assertEqual(salida,True)
584+
if 0:
585+
586+
def test_45_AlumnosMAtriculadosEnUnaAsignaturaYCurso(self):
587+
aprovisionadorDBconInterfaz.aprovisiona()
588+
sizeA=len(GestorAsociaciones.getAlumnos('mt','1AESO'))
589+
sizeB=len(GestorAsociaciones.getAlumnos('fr','1AESO'))
590+
sizeC=len(GestorAsociaciones.getAlumnos('mt','1BESO'))
591+
os.system('mysql -u root -p\'root\' < ../DBCreator_v0.sql')
592+
salida=False
593+
if sizeA==1 and sizeB==3 and sizeC==3:
594+
salida=True
595+
self.assertEqual(salida,True)
596+
597+
def test_46_ProfesoresQueImpartenEnUnCursoYAsignatura(self):
598+
aprovisionadorDBconInterfaz.aprovisiona()
599+
sizeA=len(GestorAsociaciones.getProfesores('mt','1AESO'))
600+
sizeB=len(GestorAsociaciones.getProfesores('fr','1AESO'))
601+
sizeC=len(GestorAsociaciones.getProfesores('mt','1BESO'))
602+
os.system('mysql -u root -p\'root\' < ../DBCreator_v0.sql')
603+
salida=False
604+
if sizeA==0 and sizeB==2 and sizeC==1:
605+
salida=True
606+
self.assertEqual(salida,True)
607+
608+
609+
610+
if False:
611+
612+
### RELACIONES ###
519613

520-
def test_46_ProfesoresQueImpartenEnUnCursoYAsignatura(self):
521-
aprovisionadorDBconInterfaz.aprovisiona()
522-
sizeA=len(GestorAsociaciones.getProfesores('mt','1AESO'))
523-
sizeB=len(GestorAsociaciones.getProfesores('fr','1AESO'))
524-
sizeC=len(GestorAsociaciones.getProfesores('mt','1BESO'))
525-
os.system('mysql -u root -p\'root\' < ../DBCreator_v0.sql')
526-
salida=False
527-
if sizeA==0 and sizeB==2 and sizeC==1:
528-
salida=True
529-
self.assertEqual(salida,True)
530614

531615

532616

0 commit comments

Comments
 (0)