2005/12/18

Passi di UnitTest

Allora. Oggi ho deciso di mettere un po' di test al WorklistController.py che ahime' ne ha molti meno di quelli che dovrebbe avere. Sono partito dal codice di questo metodo, il primo che ho trovato che non veniva esplicitamente testato.


def actionShowDocument(self, instance_id, index, REQUEST):
""" """
instance = self.getOpenflow().getInstance(instance_id)
registration_id = self.getCore().getRegistrationId(instance)
if registration_id:
registration = self.getRegistrations().findLatestVersionById(registration_id)
else:
registration = self.getRegistrations().getInstanceRegistration(instance)
document = registration.getDocuments()[index]
return document.download(REQUEST)


Naturalmente, questo vuol dire dover creare un bel po' di mock per far funzionare il tutto.
La cosa che mi ha colpito è stato il fatto che dovessi chedere a Core di prendere il registration_id da una istanza: perché l'istanza non doveva saperlo? Sono quindi andato nel codice di Core.py, nella classe Core, ed ecco il codice del metodo in questione:


def getRegistrationId(self, instance):
if instance.begin_process_id in ('ModifyIncomingRegistrationProcess',
'ModifyOutgoingRegistrationProcess'):
return instance.getProtocolData().originalRegistrationId()
else:
return instance.getRegistrationId()


E' evidente che questo è un refactoring rimasto a mezzo. Infatti, dovrei:
  1. rinominare questo metodo
  2. spostarlo nella gerarchia dei RegistrationInstance
  3. implementarlo nelle sottoclassi

Visto che mi sembra giusto farlo, lo faccio subito! Dopo questo commit, andrò a riprendere il test della classe in questione.

2005/12/09

Riprendiamo a pubblicare su Note Notturne

Visto che devo lavorare un po' di notte, almeno aggiorniamo anche il blog, così forse mi faccio compagnia da solo.

Cosa c'è da fare stasera? Abbiamo iniziato una storia che dice:

Collegamento registrazioni: quando modifico una registrazione i collegamenti devono rimanere quelli della registrazione precedente.


In altre parole, in PAFlow è possibile modificare le registrazioni mantenendo traccia delle modifiche fatte. E' anche possibile collegare tra di loro le registrazioni. Purtroppo, però, in questo momento, quando una registrazione viene modificata i collegamenti con le altre registrazioni scompaiono. In effetti, non vengono cancellati, ma non sono più rintracciati come tali.

Da dove nasce questo problema? Bisogna guardare a come sono organizzate le registrazioni sul database. Ad ogni registrazione corrispondono una o più righe della tabella registrazioni, una per ogni versione della registrazione stessa. Ogni riga ha un identificativo di riga (id_registrazione) che identifica univocamente la riga. Ogni registrazione quindi ha più di un id_registrazione associato.

Le registrazioni sono collegate tra di loro tramite la tabella registration_link, nella quale sono memorizzati due id_registrazione. E qui avviene il problema: quando c'è una modifica, viene generata una nuova riga per la registrazione, e quindi un nuovo id_registrazione. Quindi, i collegamenti precedenti non sono più rintracciabili.

La soluzione che abbiamo pensato di adottare parte dalla seguente considerazione: le modifiche alle registrazioni non modificano i collegamenti esistenti. Quindi, abbiamo deciso di inserire nella tabella registration_link non l'id_registrazione corrente, ma quello del primo inserimento di quella registrazione. Corrispondentemente, useremo tale id_registrazione quando dovremo fare le ricerche. Al lavoro, dunque!