gip-inclusion / rdv-insertion

Application permettant de fluidifier le parcours d’accompagnement social et professionnel sur les territoires
https://www.rdv-insertion.fr
13 stars 4 forks source link

[Bug] Corriger les migrations cassées #1326

Open Michaelvilleneuve opened 1 year ago

Michaelvilleneuve commented 1 year ago

Problème

Plusieurs migrations se sont cassées au fil du temps car nous executons de la logique métier qui n'est plus à jour à l'intérieur. Par exemple : db/migrate/20220328173945_create_letter_configurations.rb On utilise ici LetterConfiguration qui n'existe plus dans le code de l'app.

Le problème est assez général puisque globalement on a aucun garde fou permettant de lever un problème sur des migrations antérieures.

Solutions

Extraire le code des migrations et le tester unitairement

Faire en sorte que tout code non lié à des migrations (appel à des models notamment) executé dans une migration soit extrait dans un service testé unitairement. Exemple :

class CreateLetterConfigurations < ActiveRecord::Migration[6.1]
  def up
    create_table :letter_configurations do |t|
      t.string :direction_names, array: true
    end

    lc = LetterConfiguration.create!(direction_names: [
                                       "DIRECTION GÉNÉRALE DES SERVICES DÉPARTEMENTAUX",
                                       "DIRECTION DE L’INSERTION ET DU RETOUR À L’EMPLOI",
                                       "SERVICE ORIENTATION ET ACCOMPAGNEMENT VERS L’EMPLOI"
                                     ])
  end
end

deviendrait :

class CreateLetterConfigurations < ActiveRecord::Migration[6.1]
  def up
    create_table :letter_configurations do |t|
      t.string :direction_names, array: true
    end

    Migrations::CreateDefaultLetterConfigurationData.perform
end

# app/services/migrations/create_default_letter_configuration_data.rb
# Ce fichier doit être testé unitairement
class Migrations::CreateDefaultLetterConfigurationData
   def perform
      LetterConfiguration.create!(direction_names: [
                                       "DIRECTION GÉNÉRALE DES SERVICES DÉPARTEMENTAUX",
                                       "DIRECTION DE L’INSERTION ET DU RETOUR À L’EMPLOI",
                                       "SERVICE ORIENTATION ET ACCOMPAGNEMENT VERS L’EMPLOI"
                                     ])
   end
end

Modifier la CI pour que les tests re-créé nécessairement la DB à chaque run

La CI ne devrait pas pouvoir run en repartant d'un état précédent. L'execution des tests dans la CI devrait donc passer nécessairement par un RAILS_ENV=test rails db:create db:migrate

Ceci permettrait d'executer l'ensemble des migrations à chaque run et de garantir ainsi que les migrations puissent tourner sans problème sur un env nouveau.

La combinaison de ces 2 solutions permettra :

  1. D'avoir un environnement local qui fonctionne même en re-créant la DB
  2. D'avoir plus confiance en le code qui est executé en production au moment de la migration
  3. De pouvoir re-run manuellement si nécessaire le code de ces migrations
Michaelvilleneuve commented 1 year ago

Here's the list of broken migrations :

db/migrate/20220328173945_create_letter_configurations.rb
db/migrate/20220614084655_create_stats.rb
db/migrate/20220630110610_add_autonomy_rate_to_stats.rb
db/migrate/20230130124527_create_motif_categories.rb
db/migrate/20230201161121_create_templates.rb
db/migrate/20230328124553_add_orientations_motif_categories.rb
db/migrate/20230411153056_add_france_travail_orientation_template.rb
db/migrate/20230625132307_add_motif_categories_and_templates_for_siae.r
Michaelvilleneuve commented 1 year ago

Suite à une discussion avec Amine, voici ce qu'on s'est dit :

Actions à faire dans le scope de ce ticket :