IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Salesforce.com Discussion :

Couvrir mon code via une classe Test


Sujet :

Salesforce.com

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut Couvrir mon code via une classe Test
    Bonjour,

    Je me permets de demander votre aide pour une classe test.
    Je suis en train de tester si mon code est couvert via la console developer de salesforce mais ça me met 0%, alors je ne comprends pas. Ai je oublié de faire une manip!

    Voila ma classe (appelé depuis un case beforeUpdate) qui pour faire simple récupère une valeur dans l'objet CaseMilestone via la condtion ID = l'id du case passé en paramètre, puis l'insère dans le case courant :

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    public without sharing class AP15CaseMajDate{
     
    	public static void setDatePropositionCommerciale  (List<Case> lstCase){
     
    		System.debug('###################### -> AP15CaseMajDate.setDatePropositionCommerciale - BEGIN -');
     
    	   	set<Id> setIdCaseUpdate = new set<Id>();
     
    		 for(Case cCase: lstCase)
    		 {
    		 	setIdCaseUpdate.add(cCase.Id);
    		 }
     
    		    //List récupérant la date de la fermeture du jalon T2 CompletionDate de la table CaseMilestone) 
        	    List<CaseMilestone> lstCaseMilestone = [Select MilestoneTypeId, Id, CompletionDate, CaseId From CaseMilestone WHERE CaseId IN :setIdCaseUpdate  AND MilestoneTypeId IN (:System.Label.Case_MilestoneTypeId_T2_ContactReseauPhysique, :System.Label.Case_MilestoneTypeId_T2_DossierReseauPhysique_DossierReseauPlateau)];
     
     
    			Map<Id, DateTime> mapIdCaseDateT2 = new Map<Id, DateTime>();
     
    			for(CaseMilestone m: lstCaseMilestone)
    			{
    				if(m.CompletionDate != null)
    				{
    					mapIdCaseDateT2.put(m.CaseId, m.CompletionDate);
    					System.debug('###################### -> mapIdCaseDateT2  m.CompletionDate' +  m.CompletionDate);
    				}
    			}
     
     
    			for(Case monCase: lstCase)
    			{
    				if(mapIdCaseDateT2.containskey(monCase.Id))
    				{
    				    //mettre la date CompletionDate dans la date de proposition commerciale
    	       		            //CompletionDate est de type dateTime et Date_proposition_financement__c est de type Date
    	       			    //utilisation de Date.newinstance pour pour avoir le bon format
    					DateTime datePropCommerciale = mapIdCaseDateT2.get(monCase.Id);
    					Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
     
                                            monCase.Date_proposition_financement__c = DtePropComm;
     
    				}
     
    			}
     
     
    	        System.debug('###################### -> AP15CaseMajDate.setDatePropositionCommerciale - END');
     
     
    	}
    }


    Ma classe de test:
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    @isTest
    private class AP15CaseMajDateTest{
     
    		 static testmethod void setDatePropositionCommercialeTest(){
     
     
    	 	    // TO DO: implement unit test
    		    //Création du jeu d'enregistrement  	
     
    		    List<Sobject> lstObjInsert = SmartFactory.createFullCaseEnv('0');
     
    	        List<Case> caseList = new List<Case>();
    	         for(Integer j=0;j<1;j++){
    	               //création de l'apport														       Emprunteur          conseiller          user
    	        	Case c1 = SmartFactory.CreateCase(System.label.Case_Recordtype_PhysiqueContact_Id, lstObjInsert[6].Id, lstObjInsert[7].Id, lstObjInsert[0].Id);
    	         	caseList.add(c1);
    	         }
     
    	         //Insertion des cases
    	         Database.insert(caseList, true);
     
     
    	         set<Id> setId = new set<Id>();
    	        for(Case cId:caseList)
    	         {
    	         	setId.add(cId.Id);
    	         }
     
     
    	        //List récupérant le CaseMilestone que je veux
    	         List<CaseMilestone> CaseMls = [select CaseId, CompletionDate from CaseMilestone
                                where caseId IN :setId];
     
    	         Map<Id, DateTime> mapIdCaseDateT2 = new Map<Id, DateTime>();
     
    	                  for(CaseMilestone monCaseMilestone: CaseMls)
    			 {
     				if(monCaseMilestone.CompletionDate != null)
    				{
    					mapIdCaseDateT2.put(monCaseMilestone.CaseId, monCaseMilestone.CompletionDate);
    				}
    			}
     
    			 for(Case monCase: caseList)
    			{
     				if(mapIdCaseDateT2.containskey(monCase.Id))
    				{
     
    					DateTime datePropCommerciale = mapIdCaseDateT2.get(monCase.Id);
    					Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
    					monCase.Date_proposition_financement__c = DtePropComm;
    					System.assertEquals(monCase.Date_proposition_financement__c, DtePropComm);
     
    				}
     
     			}
     
     
    	 }
    }

    Avez-vous une idée? Je suis débutant donc les classes test je ne maitrise pas totalement désolé :/

    Merci

  2. #2
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Points : 194
    Points
    194
    Par défaut
    Bonjour,
    Typiquement dans ta méthode de test "setDatePropositionCommercialeTest", tu dois faire un jeu d'essai qui "éprouve ton code" à hauteur d'au moins 75%...Tu dois donc appeler ta méthode "setDatePropositionCommerciale" et faire en sorte que ton code soit utilisé à l'intérieur de cette méthode...donc à toi de fournir en paramètre une liste qui sera adéquate pour passer notamment dans tes boucles "for".

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Très bien je commence donc à créer mon jeu d'enregistrement.

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    @isTest(seeAllData=false)
    private class AP15CaseMajDateTest{
     
    		//http://aurelien-laval.fr/tutorial/salesforce-tester-son-code-apex-21
    	 	public static List<CaseMilestone> caseMilestoneList;
       		public static List<Case> casesList;
     
     
    	    static void init(){
     
    		    casesList = new List<Case>();
    		    casesList.add(new Case(Avancee_Jalon_TEC__c = '2', Date_proposition_financement__c = null ));
     
    		    caseMilestoneList = new List<CaseMilestone>();
    		    caseMilestoneList.add(new CaseMilestone());
        	}
     
     
    static testMethod void setDatePropositionCommercialeTest(){	 	
    	 		init();
           	    Test.startTest();
     
     
    	        set<Id> setId = new set<Id>();
     
    	        for(Case cId:casesList)
    	        {
    	        	setId.add(cId.Id);
    	        }
     
     
    	        //List récupérant le CaseMilestone que je veux
    	        List<CaseMilestone> CaseMls = [select CaseId, CompletionDate from CaseMilestone
                                where caseId IN :setId];
     
    	        Map<Id, DateTime> mapIdCaseDateT2 = new Map<Id, DateTime>();
     
    	        for(CaseMilestone monCaseMilestone: CaseMls)
    			{
    				if(monCaseMilestone.CompletionDate != null)
    				{
    					mapIdCaseDateT2.put(monCaseMilestone.CaseId, monCaseMilestone.CompletionDate);
    				}
    			}
     
    			for(Case monCase: casesList)
    			{
    				if(mapIdCaseDateT2.containskey(monCase.Id))
    				{
    				    //mettre la date CompletionDate dans la date de proposition commerciale
    	       		    //CompletionDate est de type dateTime et Date_proposition_financement__c est de type Date
    	       			//utilisation de Date.newinstance pour pour avoir le bon format
    					DateTime datePropCommerciale = mapIdCaseDateT2.get(monCase.Id);
    					Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
    					monCase.Date_proposition_financement__c = DtePropComm;
     
    					System.assertEquals(monCase.Date_proposition_financement__c, DtePropComm);
    				}
     
    			}
     
    			Test.stopTest();
    	 }
    }

    Je dois avouer que là c'est pas evident pour un débutant... :/

    Je devrai avoir plus de 0% avec ce code!! Mais rien du tout. Une idée s'il vous plaît?

  4. #4
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Points : 194
    Points
    194
    Par défaut
    Dans ta procédure de test, tu n'appelles nulle part ta méthode "setDatePropositionCommerciale" (c'est bien celle que tu veux tester, non ?)...Si tu l'appelles dans un trigger, montre un peu le code du trigger si tu veux qu'on puisse t'aider (j'ai vu que tu parlais d'un beforeupdate...dans ce cas, il faut que tu fasses un update sur un enregistrement pour déclencher le trigger dans ta procédure de test...reste à voir si dans ton trigger, tu fais les appels à "setDatePropositionCommerciale" systématiquement ou sous certaines conditions...

  5. #5
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Points : 1 667
    Points
    1 667
    Par défaut
    Une classe de teste sert à reproduire un environnement d’exécution d'un morceau de code, il faut donc que tu recréé ton environnement de données.

    Une fois que c'est fait, il faut que tu appel ou que tu fasses appeler ta méthode, si un trigger l'appel avec un beforeupdate, créé une donnée et mets-là ç jour avec un update, ca déclenchera le trigger qui lui appellera ta méthode et fera augmenter ta couverture de code.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  6. #6
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    En effet j'appelle depuis un trigger BeforeUpdate (sur certaine condition):

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    //----------------------------------------------------------------------------------------
    	// —	mettre à jour la date de proposition 
    	//      commerciale à la date de fermeture du Jalon T2.
    	//----------------------------------------------------------------------------------------  
     
    	if(PAD.canTrigger('AP15')){
    		System.debug('###################### -> AP15QSD');
    		List<Case> lstCaseDateUpdate = new List<Case>();
     
    		for(integer i=0;i<Trigger.new.size();i++){
     
    			if(Trigger.new[i].Avancee_Jalon_TEC__c == '2' && Trigger.new[i].Date_proposition_financement__c == null)
    			{
    				lstCaseDateUpdate.add(Trigger.new[i]);
      				System.debug('###################### -> AP1544 azert ' + lstCaseDateUpdate);
    			}
    		}
     
    		System.debug('###################### -> AP1544 ' + lstCaseDateUpdate);
     
     
     
    		if(lstCaseDateUpdate.size() > 0)
    		{
    			AP15CaseMajDate.setDatePropositionCommerciale(lstCaseDateUpdate);
    		}
    	}

    Puis ma classe de test (je mets bien static testMethod void setDatePropositionCommercialeTest()), je créé mes case puis je crée un nouveau CaseMilestone mais rien. Je crois que quelque chose m'échappe mais je ne vois pas trop ce que c'est. Ligne 56 je fais un update pourtant! :/
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
     
    @isTest
    private class AP15CaseMajDateTest{
     
    		//http://aurelien-laval.fr/tutorial/salesforce-tester-son-code-apex-21
    	 	public static List<CaseMilestone> caseMilestoneList;
       		public static List<Case> casesList;
     
     
    	    static void init(){
     
    		    casesList = new List<Case>();
    		    casesList.add(new Case(Avancee_Jalon_TEC__c = '2', Date_proposition_financement__c = null ));
     
    		    caseMilestoneList = new List<CaseMilestone>();
    		    caseMilestoneList.add(new CaseMilestone());
     
     
        	}
     
    		static testMethod void setDatePropositionCommercialeTest(){	 	
    	 		init();
           	    Test.startTest();
     
     
    	        set<Id> setId = new set<Id>();
     
    	        for(Case cId:casesList)
    	        {
    	        	setId.add(cId.Id);
    	        }
     
     
    	        //List récupérant le CaseMilestone que je veux
    	        List<CaseMilestone> CaseMls = [select CaseId, CompletionDate from CaseMilestone
                                where caseId IN :setId];
     
    	        Map<Id, DateTime> mapIdCaseDateT2 = new Map<Id, DateTime>();
     
    	        for(CaseMilestone monCaseMilestone: CaseMls)
    			{
    				if(monCaseMilestone.CompletionDate != null)
    				{
    					mapIdCaseDateT2.put(monCaseMilestone.CaseId, monCaseMilestone.CompletionDate);
    				}
    			}
     
    			for(Case monCase: casesList)
    			{
    				if(mapIdCaseDateT2.containskey(monCase.Id))
    				{
    				    //mettre la date CompletionDate dans la date de proposition commerciale
    	       		    //CompletionDate est de type dateTime et Date_proposition_financement__c est de type Date
    	       			//utilisation de Date.newinstance pour pour avoir le bon format
    					DateTime datePropCommerciale = mapIdCaseDateT2.get(monCase.Id);
    					Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
    					monCase.Date_proposition_financement__c = DtePropComm;
     
    					System.assertEquals(monCase.Date_proposition_financement__c, DtePropComm);
    				}
     
    			}
     
    			Test.stopTest();
    	 }
    }

  7. #7
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Points : 1 667
    Points
    1 667
    Par défaut
    A la ligne 56, tu ne fais pas un update, tu changes seulement la valeur de ton champs.

    Il faut que tu fasse :
    Afin de mettre à jour ton enregistrement dans Salesforce.
    Tant que tu ne le fais pas, tu ne déclencheras pas ton trigger.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  8. #8
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Merci pour la réponse je vais tester tout cela

  9. #9
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Et bien j'ai beau tester dans tout les sens, ça ne marche pas:
    Je vous remets donc le trigger (CaseBeforeUpdate):

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    	 //Permet de mettre la date de proposition de commerciale (CASE) à la date de fermeture du jalon T2 (CaseMilestone)
         //----------------------------------------------------------------------------------------    
        if(PAD.canTrigger('AP15'))
         {            
    	     List<Case> lstCase = new List<Case>();           
    	     for(integer i=0;i<Trigger.new.size();i++)          
    	     {            
    	     	if((Trigger.new[i].Avancee_Jalon_TEC__c == '2') && (Trigger.new[i].Date_proposition_financement__c == null))            
    	     	{
    	     		 lstCase.add(Trigger.new[i]);              
    	        }        
    	     }                
     
    	     	if(!lstCase.isEmpty() && lstCase.size() > 0 )
    	     	{          
    	     		AP15CaseMajDate.setDatePropositionCommerciale(lstCase);        
    	     	}
     
         }


    La classe normal AP15CaseMajDate avec sa méthode setDatePropositionCommerciale
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public without sharing class AP15CaseMajDate{
     
    	public static void setDatePropositionCommerciale  (List<Case> lstCase){
     
     
    	   	set<Id> setIdCaseUpdate = new set<Id>();
     
    		 for(Case cCase: lstCase)
    		 {
    		 	setIdCaseUpdate.add(cCase.Id);
    		 }
     
    		    //List récupérant la date de la fermeture du jalon T2 CompletionDate de la table CaseMilestone) 
        	    List<CaseMilestone> lstCaseMilestone = [Select MilestoneTypeId, Id, CompletionDate, CaseId From CaseMilestone WHERE CaseId IN :setIdCaseUpdate  AND MilestoneTypeId IN (:System.Label.Case_MilestoneTypeId_T2_ContactReseauPhysique, :System.Label.Case_MilestoneTypeId_T2_DossierReseauPhysique_DossierReseauPlateau)];
     
     
    			Map<Id, DateTime> mapIdCaseDateT2 = new Map<Id, DateTime>();
     
    			for(CaseMilestone m: lstCaseMilestone)
    			{
    				if(m.CompletionDate != null)
    				{
    					mapIdCaseDateT2.put(m.CaseId, m.CompletionDate);
    				}
    			}
     
     
    			for(Case monCase: lstCase)
    			{
    				if(mapIdCaseDateT2.containskey(monCase.Id))
    				{
     
    					DateTime datePropCommerciale = mapIdCaseDateT2.get(monCase.Id);
    					Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
    					monCase.Date_proposition_financement__c = DtePropComm;
     
     
     
    				}
     
    			}
     
     
     
    	}
    }

    et ma classe TEST qui me rend fou:

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    @isTest
    private class AP15CaseMajDateTest{
     
     
    		static testMethod void setDatePropositionCommercialeTest(){	 	
     
    		 //http://aurelien-laval.fr/tutorial/salesforce-tester-son-code-apex-21
     
    		 //creation d'un case possedant les valeurs pour entrer dans la condition du trigger Case before update
    		 List<Case> casesList = new List<Case>();
    		 casesList.add(new Case(Avancee_Jalon_TEC__c = '2', Date_proposition_financement__c = null ));
     
     
    		 //creation d'un CaseMilestone. Je ne mets rien en paramètre. Je pense que l'érreur vient de là
    		 //si je mets une valeur, j'ai ce message d'erreur: Save error: Field is not writeable: CaseMilestone.LE_CHAMP_QUE_JAJOUTE
     
    		 List<CaseMilestone> caseMilestoneList = new List<CaseMilestone>();
    		 caseMilestoneList.add(new CaseMilestone());
     
     
    	        set<Id> setId = new set<Id>();
     
    	        for(Case cId:casesList)
    	        {
    	        	setId.add(cId.Id);	
    	        }
     
     
     
    	        //List récupérant le CaseMilestone que je veux
    	        List<CaseMilestone> CaseMls = [select CaseId, CompletionDate from CaseMilestone
                                where caseId IN :setId];
     
    	        Map<Id, DateTime> mapIdCaseDateT2 = new Map<Id, DateTime>();
     
    	        for(CaseMilestone monCaseMilestone: CaseMls)
    			{
    				if(monCaseMilestone.CompletionDate != null)
    				{
    					mapIdCaseDateT2.put(monCaseMilestone.CaseId, monCaseMilestone.CompletionDate);
    				}
    			}
     
     
    			for(Case monCase: casesList)
    			{
    				if(monCase.Avancee_Jalon_TEC__c == '2' &&  monCase.Date_proposition_financement__c == null)
    				{
     
     
    					if(mapIdCaseDateT2.containskey(monCase.Id))
    					{
    						DateTime datePropCommerciale = mapIdCaseDateT2.get(monCase.Id);
    						Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
    						monCase.Date_proposition_financement__c = DtePropComm;
    						update monCase;
    						System.assertEquals(monCase.Date_proposition_financement__c, DtePropComm);
    					}
     
    				}
     
    			}
     
     
     
    	 }
    }

    Merci pour votre aide car là je sais vraiment plus quoi faire!

  10. #10
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Points : 1 667
    Points
    1 667
    Par défaut
    Quand tu exécutes ton teste, tu exécutes bien ta classe de testes?

    Peux-tu montrer l'entête de ton trigger pour voir sur quel genre d'objet il se déclenche?

    Tu ne développes pas avec Eclipse?
    Tu pourrais utiliser des System.debug(); pour voir où passe les testes.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  11. #11
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Bonjour,

    J'ai plusieurs points :

    1)
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    						monCase.Date_proposition_financement__c = DtePropComm;
    						update monCase;
    						System.assertEquals(monCase.Date_proposition_financement__c, DtePropComm);

    Je suis pas sur que soit correct. Apres ton update ton doit requêter ton case et ensuite faire l'assert sur ta requête.
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    						test.startTest(); 
    							update monCase;
    						test.stopTest(); 	
    						list<Case> caseList = [Select id, Date_proposition_financement__c from case limit 1];
    						System.assertEquals(caseList.get(0).Date_proposition_financement__c, DtePropComm);

    2) Je vois pas ou tu insert ta case dans ta méthode de test ? Avant de faire l'update faut l'insert

    3) Met des system.debug dans ton code pour bien vérifier que cela passe partout ou tu veux avec les bons critères.
    Si c'est pas le cas je te conseille de le faire avec eclipse c'est bien plus simple pour coder je trouve.

    Je t'invite aussi à lire les best practice de couverture/test des classes pour Salesforce dispo sur developerforce

    Tiens moi au courant si tu y arrives toujours pas j'essayerai de jeter un coup d'oeil pendant ma pause dej ou ce soir
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    Citation Envoyé par absot Voir le message
    Tu pourrais utiliser des System.debug(); pour voir où passe les testes.
    Pas mieux comme idée, mettre des debug dans le code et consulter le log d'execution pour savoir quelle est la condition qui n'est pas rempli

    Dans l'ensemble, je trouve ta classe de test beaucoup trop compliquée
    et en fait apres lecture, pour moi la liste CaseMls est vide, ton case n'est pas insert dans la base, l'Id doit etre null

    Est ce qu'on peut pas faire plus simple:
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // insert de mon case de test
    Case monCase = new Case(Avancee_Jalon_TEC__c = '2', Date_proposition_financement__c = null );
    insert monCase;
     
    // insert d'un milestone associé (dans ton test, tu ne positionne pas la caseId)
    Date maDate = Date.today();
    CaseMilestone monMls = new CaseMilestone();
    monMls.CaseId = monCase.Id;
    monMls.CompletionDate = maDate;
    insert monMls;
     
    // maintenant que j'ai des données de base, je démarre mon test
    Test.startTest();
     
    // il faut update l'enregistrement qui va declencher le trigger, je ne sait pas si c'est sur le case ou le milestone
    // et la test ne doit pas mettre à jour Date_proposition_financement__c puisque c'est le trigger qui est censé le faire !!!
     
    update ????;
     
    Test.stopTest();
     
    // DtePropComm la date est mise à jour avec quelle champ (j'ai vraiment du mal à comprendre le code, mais cette date doit forcement être insert au début dans le case ou le milestone
    // j'ai re-relu le code, je pense que c'est la CompletionDate du Milestone, j'ajoute le code en conséquence: ajout de la date dans le milestone
    // je test si mon case a la bonne date
    System.assertEquals(maDate , monCase.Date_proposition_financement__c);


    l'erreur globale je pense que tu tu réécrit tout le code du trigger dans le test !! hors la classe de test doit déclencher le code que tu as écrit
    il faut aussi avoir a l'esprit que le test ne s'execute pas reellement sur ton instance salesforce et donc tu n'a AUCUNE donnée


    Je te laisse digerer mon roman, il y a surement encore beaucoup de chose à revoir, je ne comprends pas le trigger sur le before update du Case alors que tu semble vouloir recuperer une date dans le milestone, j'aurais donc opté pour un trigger sur le after insert du casemilestone ?!

    Remarque apres recherche: ok on ne peut pas ecrire un trigger sur le CaseMilestone
    https://success.salesforce.com/ideaV...0000000YbZsAAK

    Remarque2: j'avoue n'avoir jamais utilisé les Casemilestone, il y a certainement des choses qui m'echappent, mais je pense qu'il faut revoir toute la conception, tu ne pourra pas mettre à jour le case avec un trigger before update alors que l'information que tu recherche est dans l'insert d'un nouveau casemilestone ?!

    Vincent

    PS: je n'avais pas vu/lu la réponse d'Overcrash

  13. #13
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Merci pour vos réponses.
    Oui je passe par éclipse.
    Le trigger:
    trigger CaseBeforeUpdate on Case (before Update)
    (il faut savoir que le CaseMilestone est déja enregistré, donc je peux le récupérer via un select dans le trigger CaseBeforeUpdate).
    Oui j'execute bien ma classe test via salesforce: Exécution du test Apex pui sje sélectionne: AP15CaseMajDateTest je vais aussi sur "developper console" afin de voir le % mais toujours 0.

    Bref je vais retester tout cela avec vos aides précieuses et reviens vers vous.

    [EDIT]

    Je couvre maintenant 71%, donc un grand merci pour votre aide. Voila ce qu'il me reste pour couvrir totalement le code:

    Nom : Sans titre.png
Affichages : 418
Taille : 693,7 Ko

    Comme vous pouvez le voir, le problème vient de l'objet CaseMilestone. Dés que je veux créer un new CaseMilestone avec le CaseId il met mets un message d'erreur (Save error: Field is not writeable: CaseMilestone.CaseId). Je ne vois pas comment je pourrai atteindre 100% si je ne peux créer un objet CaseMilestone et ainsi récupérer la valeur de la date pour l'affecter dans mon case. Une idée!? (ce qui est bizarre c'est que la ligne de ma classe normal List<CaseMilestone> lstCaseMilestone = [Select MilestoneTypeId, Id, CompletionDate, CaseId From CaseMilestone ...] est en vert, comme si je n'avais pas besoin de faire une requete sur cet objet)


    le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    @isTest(SeeAllData=true)
    private class AP15CaseMajDateTest{
    		
    
       		
    		static testMethod void setDatePropositionCommercialeTest(){	 	
    				
    		    List<Case> caseList = new List<Case>();
    			
    			//Création du jeu d'enregistrement
    			List<Sobject> lstObjInsert = SmartFactory.createFullCaseEnv('0');
    			
    		    for(Integer j=0;j<3;j++){
    	            //création de l'apport													       Emprunteur          conseiller          user
    	        	Case c1 = SmartFactory.CreateCase(System.label.Case_Recordtype_PhysiqueContact_Id, lstObjInsert[6].Id, lstObjInsert[7].Id, lstObjInsert[0].Id);
    	        	caseList.add(c1);
    	        }
    
    			//Insertion des cases
    			insert caseList;
    	        System.debug('###################### -> setDatePropositionCommercialeTest -caseList' + caseList);
    	        
    	        
    	        set<Id> setId = new set<Id>();
    	        for(Case cId:caseList)
    	        {
    	        	setId.add(cId.Id);
    	        }
    	        
    	        System.debug('###################### -> setDatePropositionCommercialeTest -setId' + setId);
    	        	        
    	         //List récupérant les case
    	        List<Case> lstCaseId = [SELECT Date_proposition_financement__c, Id, Avancee_Jalon_TEC__c FROM Case WHERE Id IN :setId];
    		 
    		 	for(Case monCase: lstCaseId)
    			{
    				monCase.Avancee_Jalon_TEC__c ='2';
    				monCase.Date_proposition_financement__c = null;
    				update monCase;
    				
    				System.debug('###################### -> setDatePropositionCommercialeTest -monCase' + monCase.Date_proposition_financement__c);
    			}
    			
    			
    			DateTime datePropCommerciale = null;
    			
    			for(Case monCased: lstCaseId)
    			{
    				if(monCased.Avancee_Jalon_TEC__c == '2' &&  monCased.Date_proposition_financement__c == null)
    				{					
    					    System.debug('###################### -> setDatePropositionCommercialeTest - ca passe dans condtion ');
    						datePropCommerciale = System.now();
    						Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
    						monCased.Date_proposition_financement__c = DtePropComm;
    						update monCased;
    						System.assertEquals(monCased.Date_proposition_financement__c, DtePropComm);
    						System.debug('###################### -> setDatePropositionCommercialeTest - ca passe dans condition ' + monCased.Date_proposition_financement__c + ' ' + DtePropComm);
    				}
    				
    			}
    
    
    			
    	 }
    }
    Merci beaucoup

  14. #14
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Je continues à tester mais n'hésitez pas si vous avez une idée
    Merci

  15. #15
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Simple, ton completionDate machin est égal à null donc il rentre pas dans la conditionnelle.
    C'est pour ça que ta map est vide.
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

  16. #16
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Oui mais vu que je ne peux créer un objet CaseMilestone mon CompletionDate n'existe même pas. Je vous rappel mon erreur si j'essaie d'insérer un CaseMilestone avec un caseId: Save error: Field is not writeable: CaseMilestone.CaseId

    Du coup je peux pas rentrer dans la condition.

  17. #17
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Il se met à jour tout seul sur l'IHM ?
    Si oui insert ton case et récup l'ID ensuite.

    Essaye ça et dis moi.
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

  18. #18
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    "Il se met à jour tout seul sur l'IHM ? "
    Tu te dis que l'objet CaseMilestone se créer tout seul lorsque l'on ajoute un case. J'ai testé mais apparemment non.
    Enfin je pense avoir bien fait! Je t'ai mis le journal


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     List<Case> caseList = new List<Case>();
    			
    			//Création du jeu d'enregistrement
    			List<Sobject> lstObjInsert = SmartFactory.createFullCaseEnv('0');
    			
    		    for(Integer j=0;j<3;j++){
    	            //création de l'apport													       Emprunteur          conseiller          user
    	        	Case c1 = SmartFactory.CreateCase(System.label.Case_Recordtype_PhysiqueContact_Id, lstObjInsert[6].Id, lstObjInsert[7].Id, lstObjInsert[0].Id);
    	        	caseList.add(c1);
    	        }
    
    			//Insertion des cases
    			insert caseList;
    	        System.debug('###################### -> setDatePropositionCommercialeTest -caseList' + caseList);
    	        
    	        
    	        
    	        set<Id> setId = new set<Id>();
    	        for(Case cId:caseList)
    	        {
    	        	setId.add(cId.Id);
    	        }
    	        
    	        System.debug('###################### -> setDatePropositionCommercialeTest -setId' + setId);
    	        
    	        
    	        List<CaseMilestone> lstCaseMilestone = [Select MilestoneTypeId, Id, CompletionDate, CaseId From CaseMilestone WHERE CaseId IN :setId];
    			System.debug('###################### -> AP15CaseMajDate.setDatePropositionCommerciale setIdCaseUpdate - BEGIN qsd-' + lstCaseMilestone);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    14:42:04.776 (3776139855)|SOQL_EXECUTE_BEGIN|[34]|Aggregations:0|select MilestoneTypeId, Id, CompletionDate, CaseId from CaseMilestone where CaseId = :tmpVar1
    14:42:04.778 (3778213224)|SOQL_EXECUTE_END|[34]|Rows:0
    14:42:04.778 (3778235239)|HEAP_ALLOCATE|[34]|Bytes:4
    14:42:04.778 (3778250411)|HEAP_ALLOCATE|[34]|Bytes:0
    14:42:04.778 (3778330496)|HEAP_ALLOCATE|[34]|Bytes:4
    14:42:04.778 (3778344480)|VARIABLE_SCOPE_BEGIN|[34]|lstCaseMilestone|LIST<CaseMilestone>|true|false
    14:42:04.778 (3778364146)|VARIABLE_ASSIGNMENT|[34]|lstCaseMilestone|{"serId":1,"value":[]}|0x3baafb6f
    14:42:04.778 (3778369940)|STATEMENT_EXECUTE|[35]
    14:42:04.778 (3778378310)|HEAP_ALLOCATE|[35]|Bytes:100
    14:42:04.778 (3778398874)|SYSTEM_METHOD_ENTRY|[35]|String.valueOf(Object)
    14:42:04.778 (3778426876)|HEAP_ALLOCATE|[35]|Bytes:2
    14:42:04.778 (3778440998)|SYSTEM_METHOD_EXIT|[35]|String.valueOf(Object)
    14:42:04.778 (3778450205)|HEAP_ALLOCATE|[35]|Bytes:102
    14:42:04.778 (3778462101)|SYSTEM_METHOD_ENTRY|[35]|System.debug(ANY)
    14:42:04.778 (3778469652)|USER_DEBUG|[35]|DEBUG|###################### -> AP15CaseMajDate.setDatePropositionCommerciale setIdCaseUpdate - BEGIN qsd-()
    14:42:04.778 (3778477104)|SYSTEM_METHOD_EXIT|[35]|System.debug(ANY)
    Qu'en penses tu?

    Merci

  19. #19
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Non c'est pas ce que je voulais dire excuse moi.

    Comment en mode utilisateur tu crée ton objet ?
    Quel est l'algo de création manuelle en gros.

    C'est ça qui va m'aider pour t'orienter pour la méthode de test.
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

  20. #20
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Oulaaa je dois avouer que ce n'est pas moi qui est créé le projet. Mais cette objet Case est créé directement dans salesforce.

    En fait on a un Processus d'autorisation qui est rattaché à un case. Donc lorsque l'on ajoute un Case, ça créé un Processus d'autorisation

    Nom : Sans titre.png
Affichages : 376
Taille : 58,0 Ko

    Comme tu peux le voir j'ai ma page CASE et mon processus (avec les jalons en bleue qui peuvent se fermer) - voir l'encadré en rouge.

    Quand je clique sur un jalon, ça m'ouvre cette page:

    Nom : Sans titare.png
Affichages : 366
Taille : 8,9 Ko

    C'est lorsque je rempli cette date et que j'enregistre que le trigger CASE-BEFOR-EUPDATE est appelé. Je récupère cette date qui est déjà dans CaseMilestone (donc l'enregistrement de cette date dans le CaseMilestone se fait avant) et l'insère dans un champ customisé de mon objet case.

    Dans CaseMilestone on a un champ CaseId, qui permet de faire le lien avec l'objet Case, mais le problème (tu l'as compris) c'est que je peux pas créer un CaseMilestone :/

    Donc l'algo de création manuelle, je le vois pas, il est de base dans salesforce, ou sinon je vois pas ou le prendre. Moi j'ai accès qu'à mes classes trigger custo.

    Est ce que cela t'aide?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Séparer le code d'une classe en x fichiers
    Par Gulix dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2007, 13h30
  2. optimiser mon code avec une boucle for?
    Par Invité dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 16/11/2007, 08h33
  3. Un tableau via une classe
    Par MaitrePylos dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 02/04/2007, 09h49
  4. Réponses: 2
    Dernier message: 04/09/2006, 08h36
  5. Mise à jour d'une controle via une classe.
    Par Andry dans le forum Delphi
    Réponses: 4
    Dernier message: 23/06/2006, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo