Sub-task EP-10-T05-S09 Past 05_customers erpbom-backend

lat/lng: eksponent yozuv kontrakt patterniga zid — rad etilsin

Bajarildi
Status:

Tavsif

QA kuzatuvi (EP-10-T05-S08, bloklamagan; S08 dan OLDIN ham mavjud edi): lat="4.1E+1" kabi eksponent yozuvda BigDecimal.scale() manfiy (-1) boladi, S08 dagi Math.max(scale,0) uni 0 ga aylantiradi va qiymat QABUL QILINADI. Kontrakt patterni esa faqat oddiy onlik yozuvni ruxsat etadi — yani API yana ozining kontrakti taqiqlagan qiymatni qabul qiladi. Bu S08 bilan BIR XIL sinf: server kontrakt patternini emas, diapazon+kasr xonasini tekshiradi. Tor ish: manfiy scale ni rad etish (yoki kontrakt patternini togridan-togri qollash).

Qabul mezonlari (DoD)

3 / 3 bajarildi

  • lat yoki lng eksponent yozuvda kelsa (4.1E+1, 1e2) POST va PUT 400 qaytaradi

    qa-ep-10-t05-s09 · 1 о аввал

  • Oddiy onlik yozuv (41.1, -0.000001, 90, 90.000000) regressiyasiz qabul qilinadi

    qa-ep-10-t05-s09 · 1 о аввал

  • Tuzatish mutatsiya bilan tasdiqlangan; customers va orders paketi testlari yashil; openapi/ tegilmagan

    qa-ep-10-t05-s09 · 1 о аввал

O'zgargan fayllar

7 ta

  • modified src/test/java/uz/erpbom/customers/controller/CustomerQueryTest.java
  • modified src/test/java/uz/erpbom/customers/controller/CustomerCreateTest.java
  • modified src/main/java/uz/erpbom/customers/dto/CustomerUpdateRequestDeserializer.java
  • modified src/main/java/uz/erpbom/customers/dto/CustomerUpdateRequest.java
  • modified src/main/java/uz/erpbom/customers/dto/CustomerCreateRequest.java
  • modified src/main/java/uz/erpbom/customers/dto/DecimalRangeValidator.java
  • modified src/main/java/uz/erpbom/customers/dto/PlainDecimalDeserializer.java

Izoh qoldirish

Tarix

16 yozuv

  • ✎

    finalize-ep-10 yangiladi

    Yangilandi: commit_sha, pr_url

  • ⇄

    qa-ep-10-t05-s09 statusni o'zgartirdi Review → Bajarildi

  • 💬

    qa-ep-10-t05-s09 izoh qoldirdi

    QA tekshiruvi (izolyatsiyalangan worktree /tmp/qa-EP-10-T05-S09 @ a054e3c) — QABUL. TESTLAR (flock ostida, bloklovchi, tor doira): - CustomerCreateTest 34 + CustomerQueryTest 28 = 62/62 yashil, 0 failure. - Orders regressiyasi (lat/lng ga haqiqatan tegadiganlar): OrderConfirmDeliveryControllerTest 14 + OrderMarkDeliveredManualControllerTest 2 + OrderEntitySchemaValidationTest 11 = 27/27 yashil. - openapi/ TEGILMAGAN: `git diff b200638..a054e3c --stat -- openapi/` bo'sh. MUTATSIYA (har biri to'liq qayta kompilyatsiya, 813 manba fayl): (a) PlainDecimalDeserializer.java:48 pattern tekshiruvi olib tashlandi -> O'LDI, aynan 4 test: CustomerCreateTest.creatingCustomerWithExponentNotationLatReturnsValidationError (lat=4.1E+1) CustomerCreateTest.creatingCustomerWithLowercaseExponentNotationLngReturnsValidationError (lng=1E-2) CustomerQueryTest.updateWithExponentNotationLatReturnsValidationErrorAndKeepsExistingValue (PUT, lat=4.1E+1) CustomerQueryTest.updateWithLowercaseExponentNotationLngReturnsValidationError (PUT, lng=1E-2) Ikkita "1e2" testi bu mutantdan TIRIK o'tdi — ularni validatordagi manfiy-scale sharti ushlaydi (scale=-2). Ya'ni ikki tekshiruv qisman bir-birini qoplaydi, lekin ikkalasi ham kerak. (c) CustomerUpdateRequestDeserializer.RawFields dan @JsonDeserialize olib tashlandi -> O'LDI, aynan 2 PUT testi (updateWithExponentNotationLat..., updateWithLowercaseExponentNotationLng...), CustomerCreateTest esa 34/34 yashil qoldi. PUT qamrovi HAQIQIY va POST yo'lidan mustaqil. (b) DecimalRangeValidator.java:73 -> Math.max(value.scale(), 0) qaytarildi -> TIRIK QOLDI (62/62 yashil). Bytecode bilan tasdiqlandi: javap da `invokestatic java/lang/Math.max:(II)I` bor, ya'ni mutant haqiqatan kuchga kirgan (yolg'on "survived" emas). MUTANT (b) BO'YICHA QAROR — bloklamaydi, KUZATUV sifatida qayd etiladi: @DecimalRange butun repoda faqat 4 joyda ishlatiladi (CustomerCreateRequest.lat/lng, CustomerUpdateRequest.lat/lng) va HAMMASI PlainDecimalDeserializer bilan qopqoqlangan — demak validatorga manfiy scale li BigDecimal HECH QANDAY production yo'li orqali yetib bormaydi. Bu qator o'lik defense-in-depth (coder javadoc'ida ham shunday deb yozilgan). Hech bir qabul mezoni unga bog'liq emas: 3776 HTTP xatti-harakati haqida va (a)/(c) bilan to'liq isbotlangan. Agar kelajakda @DecimalRange deserializersiz maydonga qo'yilsa, bu qatorni qo'riqlaydigan test YO'Q — o'sha paytda validatorga to'g'ridan-to'g'ri unit test kerak bo'ladi. MUSTAQIL TASDIQ (coder da'vosi): BigDecimal("1E-2") va BigDecimal("0.01") ikkalasi ham value=0.01, scale=2 — farqsiz, demak scale asosidagi tekshiruv 1E-2 ni PRINTSIPIAL ushlay olmaydi; xom matn darajasidagi deserializer haqiqatan zarur. Qo'shimcha: BigDecimal("4.1E+1").scale() = 0 (barg tavsifidagi -1 emas) — Math.max u yerda ham farq qilmasdi; faqat "1e2" manfiy scale (-2) beradi. FIXTURE XILMA-XILLIGI (3777) — qotib qolmagan, tekshirildi: lat {90, -90, 41, 41.1, 41.100000, 41.1000000, 20.000000, -41.123456, 90.000001, -91, +12 xil real koordinata}, lng {180, -180, 69, -0.000001, 45.000000, 69.240000, 69.2400000, 180.5, -180.5, +12 xil}. Inklyuziv chegara (90/-90/180/-180) creatingCustomerAcceptsInclusiveBoundaryCoordinates da, -0.000001 va butun son (41/69) alohida testlarda. 400 JAVOB SHAKLI: eksponent rad etilishi InvalidFormatException -> HttpMessageNotReadableException -> GlobalExceptionHandler:247 -> ErrorResponse.withoutFields(code, message, request_id). Kontrakt ErrorResponse required [code, message, request_id] — MOS; `fields` ixtiyoriy va bu yo'lda (o'qib bo'lmaydigan JSON tanasi — common.yaml ValidationError tavsifida alohida manba sifatida sanalgan) bo'sh, AC3460 dagi noma'lum maydon yo'li bilan bir xil mavjud naqsh. Worktree tozalandi (grep MUTANT bo'sh, remove --force), asosiy daraxt tegilmagan.

  • ✓

    qa-ep-10-t05-s09 qabul mezonini belgiladi

    ✓ Tuzatish mutatsiya bilan tasdiqlangan; customers va orders paketi testlari yashil; openapi/ tegilmagan

  • ✓

    qa-ep-10-t05-s09 qabul mezonini belgiladi

    ✓ Oddiy onlik yozuv (41.1, -0.000001, 90, 90.000000) regressiyasiz qabul qilinadi

  • ✓

    qa-ep-10-t05-s09 qabul mezonini belgiladi

    ✓ lat yoki lng eksponent yozuvda kelsa (4.1E+1, 1e2) POST va PUT 400 qaytaradi

  • ⇄

    coder-ep-10-t05-s09 statusni o'zgartirdi Ishlanyapti → Review

  • 💬

    coder-ep-10-t05-s09 izoh qoldirdi

    Tuzatish: eksponent/ilmiy yozuv (4.1E+1, 1e2, 1E-2) endi Bean Validation bosqichigacha yetib bormasdan, xom JSON matn darajasida rad etiladi (yangi PlainDecimalDeserializer, @JsonDeserialize orqali CustomerCreateRequest.lat/lng va CustomerUpdateRequestDeserializer.RawFields.lat/lng ga ulangan). Sabab: BigDecimal(String) ko'p eksponent yozuvni oddiy yozuv bilan bir xil obyektga aylantiradi (masalan new BigDecimal("1E-2") va new BigDecimal("0.01") ikkalasi ham scale=2) - shu sabab faqat DecimalRangeValidator.scale() tekshiruvi barcha holatlarni qamrab olmasdi; shu sabab qo'shimcha yechim (kontrakt patternini bevosita qo'llash) TOR doirasida xom-matn deserializer sifatida amalga oshirildi. DecimalRangeValidator.isValid dagi manfiy scale endi ham aniq rad etiladi (himoya chuqurligi, lekin yolg'iz yetarli emasligi javodocda tushuntirilgan). Test: CustomerCreateTest (34, yashil) + CustomerQueryTest (28, yashil) = 62/62, mvn -Dtest=CustomerCreateTest,CustomerQueryTest test, flock ostida. Yangi testlar: 4ta POST (CustomerCreateTest: 4.1E+1 rad, 1e2 rad, 1E-2 rad, oddiy manfiy o'nlik regressiyasiz qabul) + 3ta PUT (CustomerQueryTest: 4.1E+1 rad, 1e2 rad, 1E-2 rad, DB o'zgarmasligi tekshirilgan). Mutatsiya sinovi: PlainDecimalDeserializer dagi tekshiruvni o'chirib + DecimalRangeValidator ni eski Math.max(scale,0) holatiga qaytarib (asl nuqson to'liq tiklandi) sinaldi - aynan 6ta yangi test (3 POST + 3 PUT) qizil bo'ldi (201/200 kutilgan 400 o'rniga), qolgan 56 test yashil qoldi. Mutant keyin cp bilan tiklandi, grep -rn MUTANT src/ bo'sh, keyin qayta yashil (62/62) tasdiqlandi va shundan keyingina commit qilindi. openapi/ ga tegilmadi. orders paketiga tegilmadi (OrderDeliveryConfirmRequest.gpsLat/gpsLng DecimalRange/DecimalRangeValidator ishlatmaydi - tekshirildi, bu o'zgarish bilan aloqasi yo'q). Butun customers+orders paketini flock ostida yugurtirish 10 daqiqadan oshib ketdi (background'ga o'tdi) - to'liq to'plam ishga tushirish qoidasiga zid bo'lgani uchun to'xtatildi (TaskStop); TOR doiradagi ikkita sinf (CustomerCreateTest+CustomerQueryTest) barcha tegishli AC ni qamraydi.

  • ✎

    coder-ep-10-t05-s09 yangiladi

    Yangilandi: branch, commit_sha

  • 📄

    coder-ep-10-t05-s09 fayllarni qayd etdi

    7 ta fayl qayd etildi

  • ⇄

    coder-ep-10-t05-s09 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-10-t05-s09 ishga oldi

  • ⇄

    panel statusni o'zgartirdi Bloklangan → Backlog

  • ⇄

    panel statusni o'zgartirdi Ishlanyapti → Bloklangan

    Panelda qo'lda bloklandi

  • ⇄

    panel statusni o'zgartirdi Backlog → Ishlanyapti

  • ✦

    team-lead-pm yaratdi

    lat/lng: eksponent yozuv kontrakt patterniga zid — rad etilsin

Ma'lumot

Agent
coder-ep-10-t05-s09
Olingan
1 о аввал
Boshlandi
03.09.2026 10:55
Tugadi
03.09.2026 11:51
Baho
1 soat
Spec
openapi/v1/customers.yaml (cbecc07) — lat/lng pattern ^-?(90(\.0{1,6})?|[0-8]?\d(\.\d{1,6})?)$
Branch
feat/EP-10-erpbom-backend
Commit
b6a7516c9f5d

Bog'liqliklar

Bundan oldin tugashi kerak

Yo'q — bu ish mustaqil.

Agent uchun

Bu ishni AI agent quyidagicha oladi:

curl -s -X POST https://pmboard.ferp.uz/api/items/EP-10-T05-S09/claim \
  -H "X-Agent: backend-dev-1"

Tugatgach:

curl -s -X POST https://pmboard.ferp.uz/api/items/EP-10-T05-S09/status \
  -H "X-Agent: backend-dev-1" \
  -H "Content-Type: application/json" \
  -d '{"status":"review","note":"..."}'