feat(warehouse): provide bounded internal historical metadata batch

This commit is contained in:
2026-10-10 11:52:29 +08:00
parent 46ae8ab1c6
commit 83049ed9e5
10 changed files with 177 additions and 2 deletions
@@ -22,6 +22,22 @@ import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
class InternalWarehouseControllerTest {
@Test
void metadataRejectsMissingAndIncorrectInternalCredentialBeforeReading() {
var request=new com.baiyue.warehouse.dto.WarehouseMetadataBatch.Request(List.of(1L));
assertThatThrownBy(()->controller.platformMetadata(null,request)).isInstanceOf(BizException.class);
assertThatThrownBy(()->controller.platformMetadata("wrong",request)).isInstanceOf(BizException.class);
verifyNoInteractions(service);
controller.platformMetadata(INTERNAL_TOKEN,request);verify(service).platformMetadata(List.of(1L));
}
@Test
void emptyConfiguredInternalCredentialNeverMakesMetadataPublic() {
ReflectionTestUtils.setField(controller,"internalToken","");controller.initializeToken();
var request=new com.baiyue.warehouse.dto.WarehouseMetadataBatch.Request(List.of(1L));
assertThatThrownBy(()->controller.platformMetadata(null,request)).isInstanceOf(BizException.class);
assertThatThrownBy(()->controller.platformMetadata("",request)).isInstanceOf(BizException.class);
verifyNoInteractions(service);
}
private static final String INTERNAL_TOKEN = "test-internal-service-token";
private final WarehouseApplicationService service = mock(WarehouseApplicationService.class);
@@ -0,0 +1,29 @@
package com.baiyue.warehouse.repository;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder;
import com.baiyue.warehouse.mapper.WarehouseMapper;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
class WarehouseMetadataPersistenceTest {
@Test void batchReadIncludesInactiveButNeverPrivateOrDeletedWarehouses() throws Exception {
var ds=new JdbcDataSource();ds.setURL("jdbc:h2:mem:warehouse-metadata-"+UUID.randomUUID()+";MODE=MySQL;DB_CLOSE_DELAY=-1");
try(var c=ds.getConnection();var s=c.createStatement()) {
s.execute("CREATE TABLE wh_warehouse(id BIGINT,tenant_id BIGINT,warehouse_code VARCHAR,warehouse_name VARCHAR,warehouse_type VARCHAR,country_code VARCHAR,timezone VARCHAR,status VARCHAR,deleted TINYINT)");
s.execute("INSERT INTO wh_warehouse VALUES(1,0,'W1','One','OVERSEAS','US','America/Los_Angeles','ACTIVE',0),(2,9,'PRIVATE','Private','OVERSEAS','US',NULL,'ACTIVE',0),(3,0,'OLD','Old','OVERSEAS','US',NULL,'INACTIVE',0),(4,0,'REMOVED','Removed','OVERSEAS','US',NULL,'INACTIVE',1)");
}
var config=new MybatisConfiguration();config.setMapUnderscoreToCamelCase(true);config.setEnvironment(new Environment("test",new JdbcTransactionFactory(),ds));config.addMapper(WarehouseMapper.class);
try(var session=new MybatisSqlSessionFactoryBuilder().build(config).openSession()) {
var repository=new WarehouseRepository();ReflectionTestUtils.setField(repository,"warehouses",session.getMapper(WarehouseMapper.class));
var rows=repository.platformMetadata(List.of(1L,2L,3L,4L,5L));
assertEquals(Set.of(1L,3L),new HashSet<>(rows.stream().map(r->r.getId()).toList()));
assertTrue(rows.stream().anyMatch(r->"INACTIVE".equals(r.getStatus())));
}
}
}
@@ -0,0 +1,33 @@
package com.baiyue.warehouse.service;
import com.baiyue.common.core.exception.BizException;
import com.baiyue.warehouse.entity.WarehouseEntity;
import com.baiyue.warehouse.repository.WarehouseRepository;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
class WarehouseMetadataBatchTest {
final WarehouseRepository repository=mock(WarehouseRepository.class);
final WarehouseApplicationService service=new WarehouseApplicationService();
WarehouseMetadataBatchTest(){ReflectionTestUtils.setField(service,"repository",repository);}
WarehouseEntity row(long id,long owner,String status,String zone) {
var row=new WarehouseEntity();row.setId(id);row.setTenantId(owner);row.setWarehouseCode("W-"+id);
row.setWarehouseName("Warehouse");row.setWarehouseType("OVERSEAS");row.setCountryCode("US");row.setTimezone(zone);row.setStatus(status);return row;
}
@Test void returnsInactivePublicMetadataAndMissingIdsWithoutInventingTimeZones() {
var ids=List.of(3L,1L,2L,4L);
when(repository.platformMetadata(ids)).thenReturn(List.of(row(1,0,"ACTIVE",null),row(2,9,"ACTIVE","America/New_York"),row(3,0,"INACTIVE","UTC-5")));
var response=service.platformMetadata(ids);
assertEquals(List.of(3L,1L),response.records().stream().map(r->r.id()).toList());
assertEquals("INACTIVE",response.records().get(0).status());assertEquals("UTC-5",response.records().get(0).timezone());
assertNull(response.records().get(1).timezone());assertEquals(List.of(2L,4L),response.missingIds());verify(repository,times(1)).platformMetadata(ids);
}
@Test void rejectsEmptyDuplicateNonPositiveNullAndOversizedRequestsBeforeQuerying() {
for(List<Long> ids:Arrays.asList(null,List.<Long>of(),List.of(1L,1L),List.of(0L),Arrays.asList(1L,null),Collections.nCopies(2001,1L)))
assertThrows(BizException.class,()->service.platformMetadata(ids));
verifyNoInteractions(repository);
}
}