fix: SonarQube - refactor ClientsController (21->20 methodes), AdvertController (constante + syncPayment)

ClientsController :
- Extraction dispatchPostAction() via match (show: 5->2 returns)
- Inline sendWelcomeEmail (3 call sites) et indexInMeilisearch (2 call sites)
- Fusion initStripeCustomer -> setupStripeCustomer
- Rename finalizeStripeCustomer -> finalizeStripeMetadata
- Catch vide geocodeIfNeeded rempli avec commentaire
- 21 -> 20 methodes (limite autorisee)

AdvertController :
- Constante MSG_NOT_FOUND pour literal duplique 7 fois
- syncPayment refactore (CC 19->8) : extraction processSyncPayment,
  resolveMethodLabel, ensureAdvertPayment, ensureFacture

JS SonarQube :
- app.js : removeAttribute -> delete dataset, ternaires -> payBtnLabel(),
  window -> globalThis, parseFloat -> Number.parseFloat, catch vides -> console.debug
- app.scss : contraste ameliore (white -> #f5f5f5)
- entreprise-search.js : && -> optional chaining (?., ??)
- app.test.js : extraction cleanupListeners/resetMocks/loadApp (CC 17->12)

PHP CS Fixer : 3 fichiers corriges
PHPStan level 6 : 0 erreurs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-04-08 08:52:32 +02:00
parent 4f0d3d969a
commit aeb2744d7d
9 changed files with 206 additions and 163 deletions

View File

@@ -37,37 +37,36 @@ document.addEventListener = (type, listener, options) => {
return originalAddEventListener(type, listener, options)
}
const cleanupListeners = () => {
domContentLoadedListeners.forEach(listener => {
originalRemoveEventListener('DOMContentLoaded', listener)
})
domContentLoadedListeners = []
}
const resetMocks = () => {
document.body.innerHTML = ''
localStorageMock.clear()
vi.restoreAllMocks()
localStorageMock.getItem.mockImplementation(() => null)
}
const loadApp = async () => {
vi.resetModules()
vi.doMock('../../assets/modules/entreprise-search.js', () => ({
initEntrepriseSearch: vi.fn(),
}))
vi.doMock('../../assets/app.scss', () => ({}))
await import('../../assets/app.js')
document.dispatchEvent(new Event('DOMContentLoaded'))
}
describe('app.js DOMContentLoaded', () => {
beforeEach(() => {
// Remove all previously registered DOMContentLoaded listeners to prevent accumulation
domContentLoadedListeners.forEach(listener => {
originalRemoveEventListener('DOMContentLoaded', listener)
})
domContentLoadedListeners = []
document.body.innerHTML = ''
localStorageMock.clear()
vi.restoreAllMocks()
// Re-apply localStorage mock after restoreAllMocks
localStorageMock.getItem.mockImplementation((key) => {
// Use internal store - reimplemented per test via setItem
return null
})
cleanupListeners()
resetMocks()
})
const loadApp = async () => {
vi.resetModules()
// Re-mock the modules before re-import
vi.doMock('../../assets/modules/entreprise-search.js', () => ({
initEntrepriseSearch: vi.fn(),
}))
vi.doMock('../../assets/app.scss', () => ({}))
await import('../../assets/app.js')
document.dispatchEvent(new Event('DOMContentLoaded'))
}
describe('Member/Admin checkboxes', () => {
beforeEach(() => {
document.body.innerHTML = `