fab-geocommuns / RNB-coeur

Le coeur du Référentiel National des Bâtiments : imports, APIs, logique métier
https://rnb.beta.gouv.fr
Apache License 2.0
3 stars 0 forks source link

Validator ADS : éviter un doublon de bâtiments après un guess et un rnb_id #168

Closed pe-beta closed 8 months ago

pe-beta commented 1 year ago

Exemple de test qui déclenche une erreur en base:

def test_twice_same_bdg_one_guess(self):
        data = {
            "file_number": "ADS-TEST-GUESS-NEW-BDG",
            "decided_at": "2023-07-19",
            "buildings_operations": [
                {
                    "operation": "build",
                    "building": {
                        "rnb_id": "guess",
                        "geometry": {
                            "type": "MultiPolygon",
                            "coordinates": [
                                [
                                    [
                                        [5.727481544742659, 45.18703215564693],
                                        [5.726913971918663, 45.18682335805852],
                                        [5.727180892471154, 45.186454342625154],
                                        [5.727817395327776, 45.18666934350475],
                                        [5.727836461081949, 45.18671068973464],
                                        [5.727481544742659, 45.18703215564693],
                                    ]
                                ]
                            ],
                        },
                    },
                },
                {
                    "operation": "build",
                    "building": {
                        "rnb_id": "GUESSGUESSG2",
                    },
                },
            ],
        }

        r = self.client.post(
            "/api/alpha/ads/", data=json.dumps(data), content_type="application/json"
        )
        data = r.json()

        self.assertEqual(r.status_code, 400)
        self.assertEqual(
            data["buildings_operations"],
            ["A building can only be present once in an ADS."],
        )

Le bâtiment qui doit être guessed, celui défini par le MultiPolygon est le même que le second bâtiment (rnb_id GUESSGUESSG2). Du fait de la structure du serializer (la validation a lieu avant les appels en base de BuildingSearch), ce doublon n'est pas detecté. C'est la base de donnée qui renvoie une erreur:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "batid_buildingads_building_id_ads_id_af3f8461_uniq" DETAIL: Key (building_id, ads_id)=(5, 9) already exists.

Le résultat attendu est que la requête ne produise aucun enregistrement en base et que la réponse ait un code 400 et un message "A building can only be present once in an ADS."

fchabouis commented 11 months ago

Toujours d'actualité @pe-beta ?

fchabouis commented 8 months ago

je ferme, je pense que l'issue est périmée.