This commit is contained in:
2026-09-17 18:25:05 +08:00
parent 3b8b6f5aa2
commit 27d281d4b3
30 changed files with 370 additions and 229 deletions
@@ -1,14 +1,19 @@
package com.baiyue.lastleg.merchant;
import com.baiyue.common.security.AuthenticatedUser;
import com.baiyue.lastleg.controller.MerchantLastlegOrderController;
import com.baiyue.lastleg.inboundplan.controller.MerchantInboundPlanController;
import com.baiyue.lastleg.inboundplan.dto.InboundPlanRequests;
import com.baiyue.lastleg.inboundplan.service.InboundPlanService;
import com.baiyue.lastleg.discard.controller.MerchantCargoDiscardController;
import com.baiyue.lastleg.looseboard.controller.MerchantLocalLooseboardController;
import com.baiyue.lastleg.looseboard.dto.LocalLooseboardRequests;
import com.baiyue.lastleg.looseboard.service.LocalLooseboardService;
import com.baiyue.lastleg.procurement.controller.MerchantOverseasProcurementController;
import com.baiyue.lastleg.relabel.controller.MerchantRelabelApplicationController;
import com.baiyue.lastleg.returnreceipt.controller.MerchantReturnOrderController;
import com.baiyue.lastleg.security.OverseasPermissions;
import com.baiyue.lastleg.transfer.controller.MerchantWarehouseTransferController;
import com.baiyue.lastleg.trucking.controller.MerchantUsTruckOrderController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -21,6 +26,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.server.ResponseStatusException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
@@ -43,15 +49,57 @@ class MerchantOverseasCustomerApiContractTest {
}
@Test
void merchantControllersUseFrozenPathsAndExistingClientPermissionCodes() {
assertController(MerchantOverseasProcurementController.class,
"/api/merchant/v1/last-leg/overseas-procurements", OverseasPermissions.MERCHANT_PROCUREMENT);
assertController(MerchantUsTruckOrderController.class,
"/api/merchant/v1/last-leg/us-truck-orders", OverseasPermissions.MERCHANT_TRUCKING);
assertController(MerchantLocalLooseboardController.class,
"/api/merchant/v1/last-leg/local-looseboard-orders", OverseasPermissions.MERCHANT_LOOSEBOARD);
void merchantControllersUseFrozenPathsAndOperationPermissions() {
assertPath(MerchantOverseasProcurementController.class, "/api/merchant/v1/last-leg/overseas-procurements");
assertPermissions(MerchantOverseasProcurementController.class, Map.of(
"create", OverseasPermissions.MERCHANT_PROCUREMENT_CREATE,
"page", OverseasPermissions.MERCHANT_PROCUREMENT_LIST,
"detail", OverseasPermissions.MERCHANT_PROCUREMENT_LIST));
assertPath(MerchantUsTruckOrderController.class, "/api/merchant/v1/last-leg/us-truck-orders");
assertPermissions(MerchantUsTruckOrderController.class, Map.of(
"create", OverseasPermissions.MERCHANT_TRUCKING_CREATE,
"page", OverseasPermissions.MERCHANT_TRUCKING_LIST,
"detail", OverseasPermissions.MERCHANT_TRUCKING_LIST,
"update", OverseasPermissions.MERCHANT_TRUCKING_EDIT));
assertPath(MerchantLocalLooseboardController.class, "/api/merchant/v1/last-leg/local-looseboard-orders");
assertPermissions(MerchantLocalLooseboardController.class, Map.of(
"create", OverseasPermissions.MERCHANT_LOOSEBOARD_CREATE,
"page", OverseasPermissions.MERCHANT_LOOSEBOARD_LIST,
"detail", OverseasPermissions.MERCHANT_LOOSEBOARD_LIST,
"update", OverseasPermissions.MERCHANT_LOOSEBOARD_EDIT));
assertController(MerchantInboundPlanController.class,
"/api/merchant/v1/last-leg/inbound-plans", OverseasPermissions.MERCHANT_INBOUND_LIST);
assertController(MerchantLastlegOrderController.class,
"/api/merchant/v1/last-leg/orders", OverseasPermissions.MERCHANT_LAST_MILE_ORDER_LIST);
assertPermissions(MerchantWarehouseTransferController.class, Map.of(
"create", OverseasPermissions.MERCHANT_TRANSFER_CREATE,
"page", OverseasPermissions.MERCHANT_TRANSFER_LIST,
"detail", OverseasPermissions.MERCHANT_TRANSFER_LIST,
"confirmMeasurement", OverseasPermissions.MERCHANT_TRANSFER_CONFIRM));
assertPermissions(MerchantCargoDiscardController.class, Map.of(
"candidates", OverseasPermissions.MERCHANT_DISCARD_LIST,
"create", OverseasPermissions.MERCHANT_DISCARD_CREATE,
"page", OverseasPermissions.MERCHANT_DISCARD_LIST,
"detail", OverseasPermissions.MERCHANT_DISCARD_LIST,
"cancel", OverseasPermissions.MERCHANT_DISCARD_CANCEL));
assertPermissions(MerchantReturnOrderController.class, Map.of(
"create", OverseasPermissions.MERCHANT_RETURN_ORDER_CREATE,
"page", OverseasPermissions.MERCHANT_RETURN_ORDER_LIST,
"detail", OverseasPermissions.MERCHANT_RETURN_ORDER_LIST,
"relabelCandidates", OverseasPermissions.MERCHANT_RETURN_ORDER_RELABEL,
"createRelabel", OverseasPermissions.MERCHANT_RETURN_ORDER_RELABEL));
assertPermissions(MerchantRelabelApplicationController.class, Map.of(
"candidates", OverseasPermissions.MERCHANT_RELABEL_LIST,
"historicalOrders", OverseasPermissions.MERCHANT_RELABEL_LIST,
"create", OverseasPermissions.MERCHANT_RELABEL_CREATE,
"page", OverseasPermissions.MERCHANT_RELABEL_LIST,
"detail", OverseasPermissions.MERCHANT_RELABEL_LIST,
"uploadShippingLabel", OverseasPermissions.MERCHANT_RELABEL_FILES,
"uploadFile", OverseasPermissions.MERCHANT_RELABEL_FILES,
"downloadShippingLabel", OverseasPermissions.MERCHANT_RELABEL_LIST,
"downloadCompletionPhoto", OverseasPermissions.MERCHANT_RELABEL_LIST,
"confirmCompletion", OverseasPermissions.MERCHANT_RELABEL_CONFIRM));
}
@Test
@@ -90,11 +138,27 @@ class MerchantOverseasCustomerApiContractTest {
}
private static void assertController(Class<?> type, String path, String permission) {
assertThat(type.getAnnotation(RequestMapping.class).value()).containsExactly(path);
assertPath(type, path);
assertThat(type.getAnnotation(PreAuthorize.class).value())
.isEqualTo("hasAuthority('" + permission + "')");
}
private static void assertPath(Class<?> type, String path) {
assertThat(type.getAnnotation(RequestMapping.class).value()).containsExactly(path);
}
private static void assertPermissions(Class<?> type, Map<String, String> permissions) {
for (var entry : permissions.entrySet()) {
var method = Arrays.stream(type.getDeclaredMethods())
.filter(candidate -> candidate.getName().equals(entry.getKey()))
.findFirst().orElseThrow();
assertThat(method.getAnnotation(PreAuthorize.class))
.as(type.getSimpleName() + "." + entry.getKey()).isNotNull();
assertThat(method.getAnnotation(PreAuthorize.class).value())
.isEqualTo("hasAuthority('" + entry.getValue() + "')");
}
}
private static AuthenticatedUser user(long customerId, String appCode) {
return new AuthenticatedUser(7L, customerId, customerId, 8L, "operator", appCode, "WEB", Set.of());
}
@@ -27,9 +27,14 @@ class MerchantOverseasOpenApiContractTest {
assertThat(yaml).contains(path);
assertThat(pathBlock(yaml, path)).doesNotContain("name: customerId");
}
assertThat(yaml).contains("merchant:cross-border:procurement")
.contains("merchant:cross-border:domestic-trucking")
.contains("merchant:cross-border:pallet-shipping")
assertThat(yaml).contains("merchant:cross-border:procurement:list")
.contains("merchant:cross-border:procurement:create")
.contains("merchant:cross-border:domestic-trucking:list")
.contains("merchant:cross-border:domestic-trucking:create")
.contains("merchant:cross-border:domestic-trucking:edit")
.contains("merchant:cross-border:pallet-shipping:list")
.contains("merchant:cross-border:pallet-shipping:create")
.contains("merchant:cross-border:pallet-shipping:edit")
.contains("merchant:warehouse:inbound:list")
.contains("#/components/schemas/ProcurementDetailResponse")
.contains("#/components/schemas/TruckDetailResponse")
@@ -96,7 +96,10 @@ class RelabelContractTest {
}
assertTrue(openApi.contains("RelabelMerchantPageResponse"));
assertTrue(openApi.contains("RelabelCustomerConfirm"));
assertTrue(openApi.contains("merchant:warehouse:relabel"));
assertTrue(openApi.contains("merchant:overseas-warehouse:relabel:list"));
assertTrue(openApi.contains("merchant:overseas-warehouse:relabel:create"));
assertTrue(openApi.contains("merchant:overseas-warehouse:relabel:files"));
assertTrue(openApi.contains("merchant:overseas-warehouse:relabel:confirm"));
String relabelPaths = openApi.substring(openApi.indexOf("/api/platform/v1/last-leg/relabel-applications:"),
openApi.indexOf("components:"));
assertTrue(relabelPaths.contains("name: customerId, in: query, required: true"));