Керуйте default-записами
Два ключі, один default — перемкніть його атомарно, потім вимкніть із заміною в одній транзакції.
Прапорець default вирішує, який із ваших ключів віддає resolve. Цей сценарій проганяє весь його інваріант: рівно один активний default, атомарні перемикання і хід «disable із заміною».
Мета
Тримати два credentials для одного провайдера, перемкнути default між ними й вимкнути default, підвищивши інший — жодного разу не спостерігши нуль чи два default по дорозі.
Передумови
- Один активний default-credential (назвімо його A) зі сценарію 02.
Кроки
1. Додайте другий ключ — default сам не рухається
Створіть credential B для того самого провайдера без make_default. Очікуване 201 з is_default: false, а перечитаний A досі тримає прапор — автоматично default-ом стає лише перший credential власника.
Створення з прапором перебирає default атомарно
Create з make_default: true натомість деградував би A і прийшов новим default-ом в одній транзакції — те саме перемикання, що в кроці 2, тільки злите зі створенням. Задокументований 409 DEFAULT_CREDENTIAL_ALREADY_EXISTS — лише тайбрейк, коли два таких create біжать наввипередки.
2. Перемкніть default на B
Викличте POST /v1/credentials/{B}/make-default з версією B:
curl -s -X POST "$CREDS_BASE/v1/credentials/$B_ID/make-default" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"version": 1}'
Очікуване 200 з is_default: true. Перечитайте A: його прапорець зник — перемикання відбулося в одній транзакції.
3. Вимкніть B, тим самим подихом підвищивши A
Викличте POST /v1/credentials/{B}/disable з поточною версією B та replacement_default_id:
r = httpx.post(f"{CREDS_BASE}/v1/credentials/{b_id}/disable", headers=headers, json={
"version": b_version,
"replacement_default_id": a_id,
})
assert r.status_code == 200
assert r.json()["status"] == "disabled" and r.json()["is_default"] is False
Очікувано: B — disabled і без прапорця; A — active і знову default — одна транзакція, жодного проміжку без default.
4. Увімкніть B знову — прапорець не повертається
Викличте POST /v1/credentials/{B}/enable. Очікуване 200, status: "active", але is_default: false — enable ніколи не відновлює default; підвищення лишається явним.
Перевірено тестом test_s04_manage_defaults.