feat: add group buy secondhand and file storage

This commit is contained in:
王鹏
2026-07-07 16:04:02 +08:00
parent 9c579b3173
commit fa8f243486
26 changed files with 2159 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
package com.linhelp.feedback;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class FeedbackServiceTests {
@Test
void createFeedbackStartsPending() {
FeedbackService service = new FeedbackService();
FeedbackRequest request = new FeedbackRequest();
request.setTenantId(1L);
request.setCommunityId(1L);
request.setCategory("DELIVERY");
request.setContent("配送慢了");
request.setContactPhone("13800000000");
FeedbackResponse response = service.create(100L, request);
assertThat(response.getUserId()).isEqualTo(100L);
assertThat(response.getStatus()).isEqualTo(FeedbackService.STATUS_PENDING);
}
}

View File

@@ -0,0 +1,62 @@
package com.linhelp.groupbuy;
import com.linhelp.common.enums.DeliveryMethod;
import com.linhelp.common.enums.GroupBuyOrderStatus;
import org.junit.jupiter.api.Test;
import java.time.LocalDateTime;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
class GroupBuyServiceTests {
@Test
void cannotOrderAfterGroupBuyDeadline() {
GroupBuyService groupBuyService = new GroupBuyService();
GroupBuyOrderService orderService = new GroupBuyOrderService(groupBuyService);
GroupBuyResponse groupBuy = groupBuyService.create(groupBuyRequest(LocalDateTime.now().minusMinutes(1)));
groupBuyService.start(groupBuy.getId());
assertThatThrownBy(() -> orderService.create(1L, orderRequest(groupBuy.getId(), DeliveryMethod.IMMEDIATE)))
.hasMessageContaining("团购已截单");
}
@Test
void groupBuyOrderCanBePreparedForSelfPickup() {
GroupBuyService groupBuyService = new GroupBuyService();
GroupBuyOrderService orderService = new GroupBuyOrderService(groupBuyService);
GroupBuyResponse groupBuy = groupBuyService.create(groupBuyRequest(LocalDateTime.now().plusDays(1)));
groupBuyService.start(groupBuy.getId());
GroupBuyOrderResponse order = orderService.create(1L, orderRequest(groupBuy.getId(), DeliveryMethod.SELF_PICKUP));
orderService.confirm(order.getId());
orderService.markReady(order.getId());
assertThat(orderService.detail(order.getId()).getStatus()).isEqualTo(GroupBuyOrderStatus.PENDING_PICKUP);
}
private GroupBuyRequest groupBuyRequest(LocalDateTime endTime) {
GroupBuyRequest request = new GroupBuyRequest();
request.setTenantId(1L);
request.setCommunityId(1L);
request.setTitle("今日鸡蛋团购");
request.setCoverUrl("https://img.test/egg.jpg");
request.setPriceCent(2990);
request.setStock(100);
request.setStartTime(LocalDateTime.now().minusHours(1));
request.setEndTime(endTime);
request.setPickupAddress("小区北门");
return request;
}
private GroupBuyOrderRequest orderRequest(Long groupBuyId, DeliveryMethod deliveryMethod) {
GroupBuyOrderRequest request = new GroupBuyOrderRequest();
request.setTenantId(1L);
request.setCommunityId(1L);
request.setGroupBuyId(groupBuyId);
request.setAddressId(1L);
request.setQuantity(2);
request.setDeliveryMethod(deliveryMethod);
return request;
}
}

View File

@@ -0,0 +1,48 @@
package com.linhelp.secondhand;
import com.linhelp.common.enums.SecondGoodsStatus;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
class SecondGoodsReviewTests {
@Test
void newListingStartsPendingAndBecomesVisibleAfterApproval() {
SecondGoodsService service = new SecondGoodsService();
SecondGoodsResponse listing = service.create(1L, request());
assertThat(listing.getStatus()).isEqualTo(SecondGoodsStatus.PENDING_REVIEW);
assertThat(service.listPublic(1L, null)).isEmpty();
service.approve(listing.getId());
assertThat(service.listPublic(1L, null)).extracting(SecondGoodsResponse::getId)
.containsExactly(listing.getId());
}
@Test
void rejectionRequiresReason() {
SecondGoodsService service = new SecondGoodsService();
SecondGoodsResponse listing = service.create(1L, request());
assertThatThrownBy(() -> service.reject(listing.getId(), ""))
.hasMessageContaining("拒绝原因不能为空");
}
private SecondGoodsRequest request() {
SecondGoodsRequest request = new SecondGoodsRequest();
request.setTenantId(1L);
request.setCommunityId(1L);
request.setTitle("九成新儿童车");
request.setPriceCent(9900);
request.setDescription("小区内自提");
request.setCategory("母婴");
request.setContactPhone("13800000000");
request.setTradeMethod("FACE_TO_FACE");
request.setImageUrls(Arrays.asList("https://img.test/bike.jpg"));
return request;
}
}

View File

@@ -0,0 +1,30 @@
package com.linhelp.storage;
import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockMultipartFile;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
class FileStorageServiceTests {
@Test
void imageUploadUsesTenantCommunityDatePrefix() {
FileStorageService service = new FileStorageService();
MockMultipartFile file = new MockMultipartFile("file", "avatar.png", "image/png", new byte[]{1, 2, 3});
FileUploadResponse response = service.upload(1L, 2L, file);
assertThat(response.getObjectKey()).startsWith("tenant/1/community/2/");
assertThat(response.getObjectKey()).endsWith(".png");
assertThat(response.getUrl()).contains(response.getObjectKey());
}
@Test
void nonImageUploadIsRejected() {
FileStorageService service = new FileStorageService();
MockMultipartFile file = new MockMultipartFile("file", "doc.pdf", "application/pdf", new byte[]{1});
assertThatThrownBy(() -> service.upload(1L, 1L, file))
.hasMessageContaining("仅支持图片上传");
}
}