65 lines
3.1 KiB
Java
65 lines
3.1 KiB
Java
package com.baiyue.finance;
|
|
|
|
import com.baiyue.finance.dto.ReceivableStatisticsDtos.ReceivableStatisticsRow;
|
|
import com.baiyue.finance.service.FinanceEventException;
|
|
import com.baiyue.finance.service.ReceivableStatisticsService;
|
|
import org.junit.jupiter.api.Test;
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
import org.springframework.jdbc.core.RowMapper;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.time.YearMonth;
|
|
import java.util.List;
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.when;
|
|
|
|
class ReceivableStatisticsServiceTest {
|
|
@Test
|
|
@SuppressWarnings("unchecked")
|
|
void aggregatesOnlyTheApprovedFormalCnyDimensionsAndPaginatesCustomers() {
|
|
JdbcTemplate jdbc = mock(JdbcTemplate.class);
|
|
List<ReceivableStatisticsRow> rows = List.of(
|
|
row(10001, "客户A", "300.00", "100.00", "200.00"),
|
|
row(10002, "客户B", "80.00", "80.00", "0.00"));
|
|
when(jdbc.query(anyString(), any(RowMapper.class), any(Object[].class))).thenReturn(rows);
|
|
ReceivableStatisticsService service = new ReceivableStatisticsService(jdbc);
|
|
|
|
var result = service.query(YearMonth.of(2026, 7), null, 1, 1);
|
|
|
|
assertThat(result.currency()).isEqualTo("CNY");
|
|
assertThat(result.totalReceivable()).isEqualByComparingTo("380.00");
|
|
assertThat(result.totalReceived()).isEqualByComparingTo("180.00");
|
|
assertThat(result.totalOutstanding()).isEqualByComparingTo("200.00");
|
|
assertThat(result.totalCustomers()).isEqualTo(2);
|
|
assertThat(result.records()).containsExactly(rows.get(0));
|
|
var sql = org.mockito.ArgumentCaptor.forClass(String.class);
|
|
verify(jdbc).query(sql.capture(), any(RowMapper.class), any(Object[].class));
|
|
assertThat(sql.getValue()).contains("s.direction='RECEIVABLE'", "s.status<>'VOIDED'", "s.currency_code='CNY'",
|
|
"s.generated_date>=?", "s.generated_date<?", "fin_customer_settlement_profile", "GROUP BY s.tenant_id,p.customer_name_snapshot");
|
|
}
|
|
|
|
@Test
|
|
@SuppressWarnings("unchecked")
|
|
void failsClosedWhenPersistedTotalsDoNotReconcile() {
|
|
JdbcTemplate jdbc = mock(JdbcTemplate.class);
|
|
when(jdbc.query(anyString(), any(RowMapper.class), any(Object[].class)))
|
|
.thenReturn(List.of(row(10001, "客户A", "300.00", "100.00", "199.99")));
|
|
|
|
assertThatThrownBy(() -> new ReceivableStatisticsService(jdbc)
|
|
.query(YearMonth.of(2026, 7), null, 1, 20))
|
|
.isInstanceOf(FinanceEventException.class)
|
|
.hasMessageContaining("勾稽异常");
|
|
}
|
|
|
|
private static ReceivableStatisticsRow row(long id, String name, String total, String received, String outstanding) {
|
|
return new ReceivableStatisticsRow(id, name, "CNY", new BigDecimal(total),
|
|
new BigDecimal(received), new BigDecimal(outstanding));
|
|
}
|
|
}
|