fix(t243): allow deleting unreferenced procurement drafts

This commit is contained in:
QiuSW
2026-07-29 16:45:25 +08:00
parent 62eee74a70
commit 24eef29076
12 changed files with 504 additions and 102 deletions
@@ -773,26 +773,6 @@ func TestAdminProcurementAPIProducesImmutablePendingTask(t *testing.T) {
createRequest.Body,
)
}
deleteInUse := performAdminRequest(
t,
fixture.router,
http.MethodDelete,
"/api/v1/freight-orders/"+orderBody.Items[0].ID,
"",
nil,
"",
)
if deleteInUse.Code != http.StatusConflict ||
!strings.Contains(
deleteInUse.Body.String(),
`"code":"FREIGHT_ORDER_IN_USE"`,
) {
t.Fatalf(
"delete in-use status/body = %d / %s",
deleteInUse.Code,
deleteInUse.Body,
)
}
var requestBody struct {
Request struct {
ID string `json:"id"`
@@ -829,6 +809,26 @@ func TestAdminProcurementAPIProducesImmutablePendingTask(t *testing.T) {
!strings.Contains(bind.Body.String(), `"status":"READY"`) {
t.Fatalf("bind status/body = %d / %s", bind.Code, bind.Body)
}
deleteWithReference := performAdminRequest(
t,
fixture.router,
http.MethodDelete,
"/api/v1/freight-orders/"+orderBody.Items[0].ID,
"",
nil,
"",
)
if deleteWithReference.Code != http.StatusConflict ||
!strings.Contains(
deleteWithReference.Body.String(),
`"code":"FREIGHT_ORDER_HAS_REFERENCE"`,
) {
t.Fatalf(
"delete with reference status/body = %d / %s",
deleteWithReference.Code,
deleteWithReference.Body,
)
}
createTask := performAdminRequest(
t,
fixture.router,
@@ -847,6 +847,26 @@ func TestAdminProcurementAPIProducesImmutablePendingTask(t *testing.T) {
createTask.Body,
)
}
deleteWithTask := performAdminRequest(
t,
fixture.router,
http.MethodDelete,
"/api/v1/freight-orders/"+orderBody.Items[0].ID,
"",
nil,
"",
)
if deleteWithTask.Code != http.StatusConflict ||
!strings.Contains(
deleteWithTask.Body.String(),
`"code":"FREIGHT_ORDER_HAS_PURCHASE_TASK"`,
) {
t.Fatalf(
"delete with task status/body = %d / %s",
deleteWithTask.Code,
deleteWithTask.Body,
)
}
var taskBody struct {
Task struct {
ID string `json:"id"`
@@ -899,6 +919,90 @@ func TestAdminProcurementAPIProducesImmutablePendingTask(t *testing.T) {
}
}
func TestAdminFreightDeleteRemovesNeedsImageDraft(t *testing.T) {
fixture := newAdminIntegrationFixture(t)
createSync := performAdminRequest(
t,
fixture.router,
http.MethodPost,
"/api/v1/freight-syncs",
"application/json",
strings.NewReader(
`{"mode":"ORDER_NUMBER","order_number":"DRAFT-DELETE"}`,
),
"draft-delete-freight-sync",
)
requireAdminStatus(t, createSync, http.StatusCreated)
orders := performAdminRequest(
t,
fixture.router,
http.MethodGet,
"/api/v1/freight-orders",
"",
nil,
"",
)
var orderBody struct {
Items []struct {
ID string `json:"id"`
} `json:"items"`
}
decodeResponse(t, orders, &orderBody)
detail := performAdminRequest(
t,
fixture.router,
http.MethodGet,
"/api/v1/freight-orders/"+orderBody.Items[0].ID,
"",
nil,
"",
)
var detailBody struct {
Items []struct {
ID string `json:"id"`
} `json:"items"`
}
decodeResponse(t, detail, &detailBody)
createRequest := performAdminRequest(
t,
fixture.router,
http.MethodPost,
"/api/v1/freight-items/"+detailBody.Items[0].ID+
"/procurement-request",
"application/json",
strings.NewReader(`{"confirm_procurement_needed":true}`),
"",
)
if createRequest.Code != http.StatusCreated ||
!strings.Contains(createRequest.Body.String(), `"status":"NEEDS_IMAGE"`) {
t.Fatalf(
"create request status/body = %d / %s",
createRequest.Code,
createRequest.Body,
)
}
deleteDraft := performAdminRequest(
t,
fixture.router,
http.MethodDelete,
"/api/v1/freight-orders/"+orderBody.Items[0].ID,
"",
nil,
"",
)
requireAdminStatus(t, deleteDraft, http.StatusNoContent)
deletedDetail := performAdminRequest(
t,
fixture.router,
http.MethodGet,
"/api/v1/freight-orders/"+orderBody.Items[0].ID,
"",
nil,
"",
)
requireAdminStatus(t, deletedDetail, http.StatusNotFound)
}
func TestAdminOrderAuthorizationIsIdempotentAndRevisioned(t *testing.T) {
fixture := newAdminIntegrationFixture(t)
taskID, executionID, taskHash, firstKey, secondKey :=