feat(t223): generate tasks from freight items
This commit is contained in:
@@ -994,6 +994,83 @@ func TestFreightPagesEscapeSourceDataAndCreateAsyncSync(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestFreightDetailCreatesProcurementTaskWithCSRF(t *testing.T) {
|
||||
const itemID = "00000000-0000-4000-8000-000000000002"
|
||||
service := &fakeProcurementService{
|
||||
fakeFreightService: &fakeFreightService{
|
||||
fakeService: &fakeService{},
|
||||
orderDetail: FreightOrderDetail{
|
||||
Order: FreightOrder{
|
||||
ID: testTaskID,
|
||||
ExternalStockID: "12",
|
||||
SourceCode: "SOURCE-12",
|
||||
},
|
||||
Items: []FreightItemReview{{
|
||||
Item: FreightOrderItem{
|
||||
ID: itemID,
|
||||
ExternalItemID: "88",
|
||||
Title: "商品",
|
||||
SKU: "BLACK-L",
|
||||
Quantity: 2,
|
||||
},
|
||||
Request: &ProcurementRequest{
|
||||
ID: itemID,
|
||||
FreightOrderItemID: itemID,
|
||||
Status: "READY",
|
||||
StatusLabel: "可以生成任务",
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
createTaskResult: Task{
|
||||
ID: testTaskID,
|
||||
Status: "PENDING",
|
||||
},
|
||||
}
|
||||
router := newTestRouter(t, service)
|
||||
detail := performRequest(
|
||||
t,
|
||||
router,
|
||||
http.MethodGet,
|
||||
"/freight/"+testTaskID,
|
||||
nil,
|
||||
"",
|
||||
)
|
||||
if detail.Code != http.StatusOK ||
|
||||
!strings.Contains(detail.Body.String(), "生成采购任务") ||
|
||||
!strings.Contains(detail.Body.String(), "可以生成任务") {
|
||||
t.Fatalf("detail status/body = %d / %s", detail.Code, detail.Body)
|
||||
}
|
||||
cookie := csrfCookie(t, detail)
|
||||
taskKey := hiddenValue(t, detail.Body.String(), "task_key")
|
||||
values := url.Values{
|
||||
"csrf_token": {cookie.Value},
|
||||
"order_id": {testTaskID},
|
||||
"task_key": {taskKey},
|
||||
}
|
||||
request := httptest.NewRequest(
|
||||
http.MethodPost,
|
||||
"/freight/procurement-requests/"+itemID+"/purchase-task",
|
||||
strings.NewReader(values.Encode()),
|
||||
)
|
||||
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
request.AddCookie(cookie)
|
||||
response := httptest.NewRecorder()
|
||||
router.ServeHTTP(response, request)
|
||||
if response.Code != http.StatusSeeOther ||
|
||||
response.Header().Get("Location") != "/tasks/"+testTaskID {
|
||||
t.Fatalf(
|
||||
"create task status/location = %d / %q",
|
||||
response.Code,
|
||||
response.Header().Get("Location"),
|
||||
)
|
||||
}
|
||||
if service.createTaskInput.RequestID != itemID ||
|
||||
service.createTaskInput.IdempotencyKey != taskKey {
|
||||
t.Fatalf("create task input = %+v", service.createTaskInput)
|
||||
}
|
||||
}
|
||||
|
||||
type fakeService struct {
|
||||
listInput ListTasksInput
|
||||
listResult TaskList
|
||||
@@ -1027,6 +1104,40 @@ type fakeFreightService struct {
|
||||
err error
|
||||
}
|
||||
|
||||
type fakeProcurementService struct {
|
||||
*fakeFreightService
|
||||
createRequestInput CreateProcurementRequestInput
|
||||
bindInput BindProcurementReferenceInput
|
||||
createTaskInput CreateProcurementTaskInput
|
||||
procurementResult ProcurementRequest
|
||||
createTaskResult Task
|
||||
procurementError error
|
||||
}
|
||||
|
||||
func (service *fakeProcurementService) CreateProcurementRequest(
|
||||
_ context.Context,
|
||||
input CreateProcurementRequestInput,
|
||||
) (ProcurementRequest, error) {
|
||||
service.createRequestInput = input
|
||||
return service.procurementResult, service.procurementError
|
||||
}
|
||||
|
||||
func (service *fakeProcurementService) BindProcurementReference(
|
||||
_ context.Context,
|
||||
input BindProcurementReferenceInput,
|
||||
) (ProcurementRequest, error) {
|
||||
service.bindInput = input
|
||||
return service.procurementResult, service.procurementError
|
||||
}
|
||||
|
||||
func (service *fakeProcurementService) CreateProcurementTask(
|
||||
_ context.Context,
|
||||
input CreateProcurementTaskInput,
|
||||
) (Task, error) {
|
||||
service.createTaskInput = input
|
||||
return service.createTaskResult, service.procurementError
|
||||
}
|
||||
|
||||
func (service *fakeFreightService) ListFreightOrders(
|
||||
context.Context,
|
||||
int,
|
||||
|
||||
Reference in New Issue
Block a user